<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=202012&amp;view=findpost&amp;p=1757597</guid>
        <pubDate>Fri, 09 Nov 2007 06:32:45 +0000</pubDate>
        <title>не могу скачать файл с интернета</title>
        <link>https://forum.sources.ru/index.php?showtopic=202012&amp;view=findpost&amp;p=1757597</link>
        <description><![CDATA[alvd: Вот полноценный набор классов для работы с HTTP без браузера.<br>
Способен работать через Proxy и не боится плохой связи.<br>
Даю как есть, не сочтите за рекламу :)<br>
<br>
Код реально работает, передаёт и принимает любые файлы<br>
и позволяет надстраивать над CustomChannel классы для<br>
произвольных протоколов. Поскольку ничего кроме HTTP <br>
было не нужно, то иерархия такая: TCustomChannel -&gt; THttpChannel.<br>
Для компиляции под Delphi 5 и старше, также для<br>
правильной работы в системе должен быть установлен <br>
IE5 или старше - иначе WinInet может работать неправильно.<br>
<br>
Исходное название - Channels.pas<br>
<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{==============================================================================</div><div class="code_line">Copyright (C) 2006-2007 Denisov Alexey Vladimirovich for Tewek Ltd</div><div class="code_line">mailto:alexey-denisov@mail.ru or mailto:alexey-denisov@tewek.ru</div><div class="code_line">&nbsp;</div><div class="code_line">Эта программа является свободным программным обеспечением. Вы можете</div><div class="code_line">распространять и/или модифицировать её согласно условиям Стандартной</div><div class="code_line">Общественной Лицензии GNU, опубликованной Фондом Свободного Программного</div><div class="code_line">Обеспечения, версии 3 или, по Вашему желанию, любой более поздней версии.</div><div class="code_line">&nbsp;</div><div class="code_line">Эта программа распространяется в надежде, что она будет полезной, но БЕЗ</div><div class="code_line">ВСЯКИХ ГАРАНТИЙ, в том числе подразумеваемых гарантий ТОВАРНОГО СОСТОЯНИЯ ПРИ</div><div class="code_line">ПРОДАЖЕ и ГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОГО ПРИМЕНЕНИЯ. Смотрите Стандартную</div><div class="code_line">Общественную Лицензию GNU для получения дополнительной информации.</div><div class="code_line">&nbsp;</div><div class="code_line">Вы должны были получить копию Стандартной Общественной Лицензии GNU</div><div class="code_line">вместе с программой. В случае её отсутствия, посмотрите</div><div class="code_line">&#60;http://www.gnu.org/licenses/&#62;.</div><div class="code_line">==============================================================================}</div><div class="code_line">&nbsp;</div><div class="code_line">// Каналы. Модуль служит для организации связи.</div><div class="code_line">// Содержит базовый класс канала.</div><div class="code_line">// Обеспечивает также чтение/запись через HTTP, в основном или</div><div class="code_line">// дополнительном потоке, по выбору.</div><div class="code_line">&nbsp;</div><div class="code_line">{$I defines.pas}</div><div class="code_line">&nbsp;</div><div class="code_line">// Если раскомментировать, то все запросы к WinInet будут записываться</div><div class="code_line">// в лог ChangeFileExt(Application.ExeName, &#39;.channel.log&#39;);</div><div class="code_line">{$IFOPT O-}</div><div class="code_line">&nbsp;&nbsp;//{$DEFINE WRITELOG}</div><div class="code_line">{$ENDIF}</div><div class="code_line">&nbsp;</div><div class="code_line">unit Channels;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, Forms, SysUtils, Classes, ExtCtrls, WinInet;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TUserAgentRec = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: String;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">const // из MFC</div><div class="code_line">&nbsp;&nbsp;HTTP_VERB_POST = 0;</div><div class="code_line">&nbsp;&nbsp;HTTP_VERB_GET = 1;</div><div class="code_line">&nbsp;&nbsp;HTTP_VERB_HEAD = 2;</div><div class="code_line">&nbsp;&nbsp;HTTP_VERB_PUT = 3;</div><div class="code_line">&nbsp;&nbsp;HTTP_VERB_LINK = 4;</div><div class="code_line">&nbsp;&nbsp;HTTP_VERB_DELETE = 5;</div><div class="code_line">&nbsp;&nbsp;HTTP_VERB_UNLINK = 6;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;USER_AGENT_COUNT = 38;</div><div class="code_line">&nbsp;&nbsp;USER_AGENT_DEFAULT = 0;</div><div class="code_line">&nbsp;&nbsp;USER_AGENT_IE5 = USER_AGENT_DEFAULT;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;UserAgents: array[0..USER_AGENT_COUNT-1] of TUserAgentRec = ((</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Internet Explorer 5.0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Amaya 9&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;amaya/9.53 libwww/5.4.0&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Avant Browser (old)&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Avant Browser (http://www.avantbrowser.com)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Avant Browser (new)&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Avant Browser [avantbrowser.com]; iOpus-I-M; QXW03416; .NET CLR 1.1.4322)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Camino&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (Macintosh; U; PPC Max OS X Mach-O; en-US; rv:1.8.0.7) Gecko/200609211 Camino/1.0.3&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;ELinks&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;ELinks (0.4pre5; Linux 2.4.27 i686; 80x25)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Epiphany&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060928 (Debian|Debian-1.8.0.7-1) Epiphany/2.14&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Firefox (Linux)&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Firefox (MacOS)&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Firefox (Windows)&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Flock&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20061031 Firefox/1.5.0.7 Flock/0.7.7&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Googlebot&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Googlebot/2.1 (+http://www.google.com/bot.html)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;iCab&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (compatible; iCab 3.0.3; Macintosh; U; PPC Mac OS X)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Internet Explorer 1.0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Microsoft Internet Explorer/4.0b1 (Windows 95)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Internet Explorer 1.5&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/1.22 (compatible; MSIE 1.5; Windows NT)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Internet Explorer 2.0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Internet Explorer 3.0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/2.0 (compatible; MSIE 3.01; Windows 98)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Internet Explorer 6.0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Internet Explorer 7.0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;K-Meleon&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.8.0.5) Gecko/20060706 K-Meleon/1.0&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Konqueror&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Debian|Debian)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Links&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Links (2.1pre17; Linux 2.6.11-gentoo-r8 i686; 80x24)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Lynx&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Lynx/2.8.4rel.1 libwww-FM/2.14&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Minimo&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (Windows; U; Windows CE 4.21; rv:1.8b4) Gecko/20050720 Minimo/0.007&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Mozilla&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;NetPositive&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/3.0 (compatible; NetPositive/2.2)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Netscape&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.2) Gecko/20020508 Netscape6/6.1&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Netscape Navigator&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/4.8 [en] (Windows NT 5.0; U)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Off By One&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/4.7 (compatible; OffByOne; Windows 2000)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;OmniWeb&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.51&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Openwave&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;OPWV-SDK/62 UP.Browser/6.2.2.1.208 (GUI) MMP/2.0&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Opera&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Opera/9.10 (Windows NT 5.1; U; en)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;PlayStation 3&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (PLAYSTATION 3; 1.00)&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Safari&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;SeaMonkey&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2pre) Gecko/20070111 SeaMonkey/1.1&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;Shiira&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/418 (KHTML, like Gecko) Shiira/1.2.2 Safari/125&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;w3m&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;w3m/0.5.1&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ident: &#39;WebExplorer&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Agent: &#39;IBM-WebExplorer-DLL/v1.1h&#39;));</div><div class="code_line">&nbsp;</div><div class="code_line">function SetStr(Condition: Boolean; const TrueStr: String; const FalseStr: String = &#39;&#39;): String;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TCustomChannel = class;</div><div class="code_line">&nbsp;&nbsp;TChannelClass = class of TCustomChannel;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TChannelEvent = TNotifyEvent;</div><div class="code_line">&nbsp;&nbsp;TOnChannelBeforeCloseEvent = procedure(Sender: TObject; var CanClose: Boolean) of object;</div><div class="code_line">&nbsp;&nbsp;TOnChannelBeforeDisconnectEvent = procedure(Sender: TObject; var CanDisconnect: Boolean) of object;</div><div class="code_line">&nbsp;&nbsp;TOnChannelErrorEvent = procedure(Sender: TObject; const ErrorCode: Cardinal) of object;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TCustomChannel = class</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;FHInet: HINTERNET;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FHConnect: HINTERNET;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FDestinationData: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FReceivedData: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FFlags: Cardinal;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FObjectName: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FServerPort: Word;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FProxy: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FProxyBypass: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FUserPassword: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FServerName: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FServiceType: Word;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FUserAgent: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FUserName: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnBeforeOpen: TNotifyEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnOpened: TNotifyEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnBeforeConnect: TNotifyEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnConnected: TNotifyEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnBeforeClose: TOnChannelBeforeCloseEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnClosed: TNotifyEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FLastError: Cardinal;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnBeforeDisconnect: TOnChannelBeforeDisconnectEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnDisconnected: TNotifyEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnError: TOnChannelErrorEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FTimeout: Word;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FProxyUser: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FProxyPassword: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FUseProxy: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FProxyNeedAuthorization: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure BeforeOpen;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure AfterOpen;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function CanClose: Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure AfterClose;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure BeforeConnect;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure AfterConnect;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function CanDisconnect: Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure AfterDisconnect;</div><div class="code_line">&nbsp;&nbsp;protected</div><div class="code_line">&nbsp;&nbsp; &nbsp;function InternetCloseHandle(var Handle: Pointer): Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function SetError(Success: Boolean): Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetDestinationData: String; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure SetDestinationData(const Value: String); virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoOpen: Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoClose: Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoConnect: Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoDisconnect: Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property Flags: Cardinal read FFlags write FFlags;</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;destructor Destroy; override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ подключение }</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Opened: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Open: Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Closed: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Close: Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Connected: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// если входные параметры не указаны,</div><div class="code_line">&nbsp;&nbsp; &nbsp;// берёт из свойств</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Connect(const ServerName: String = &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;const UserName: String = &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;const UserPassword: String = &#39;&#39;): Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Disconnected: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Disconnect: Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ данные }</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ чтение и запись }</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetDataSize(out DataSize: Cardinal): Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Read(DataSize: Cardinal; var S: String): Boolean; overload; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Read(DataSize: Cardinal = 0): Boolean; overload; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Write(S: String = &#39;&#39;): Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ ошибки }</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetLastError: Cardinal;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ общие свойства протоколов }</div><div class="code_line">&nbsp;&nbsp; &nbsp;property DestinationData: String read GetDestinationData write SetDestinationData;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property ReceivedData: String read FReceivedData;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property HInet: HINTERNET read FHInet;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property HConnect: HINTERNET read FHConnect;</div><div class="code_line">&nbsp;&nbsp;published</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ общие свойства протоколов }</div><div class="code_line">&nbsp;&nbsp; &nbsp;property ObjectName: String read FObjectName write FObjectName;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property ServerPort: Word read FServerPort write FServerPort;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property Timeout: Word read FTimeout write FTimeout;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property Proxy: String read FProxy write FProxy;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property ProxyBypass: String read FProxyBypass write FProxyBypass;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property UserName: String read FUserName write FUserName;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property UserPassword: String read FUserPassword write FUserPassword;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property ProxyNeedAuthorization: Boolean read FProxyNeedAuthorization write FProxyNeedAuthorization;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property ProxyUser: String read FProxyUser write FProxyUser;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property ProxyPassword: String read FProxyPassword write FProxyPassword;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property UseProxy: Boolean read FUseProxy write FUseProxy;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property ServerName: String read FServerName write FServerName;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property ServiceType: Word read FServiceType;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property UserAgent: String read FUserAgent write FUserAgent;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ события }</div><div class="code_line">&nbsp;&nbsp; &nbsp;property OnBeforeOpen: TNotifyEvent read FOnBeforeOpen write FOnBeforeOpen;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property OnOpened: TNotifyEvent read FOnOpened write FOnOpened;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property OnBeforeClose: TOnChannelBeforeCloseEvent read FOnBeforeClose write FOnBeforeClose;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property OnClosed: TNotifyEvent read FOnClosed write FOnClosed;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property OnBeforeConnect: TNotifyEvent read FOnBeforeConnect write FOnBeforeConnect;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property OnConnected: TNotifyEvent read FOnConnected write FOnConnected;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property OnBeforeDisconnect: TOnChannelBeforeDisconnectEvent read FOnBeforeDisconnect write FOnBeforeDisconnect;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property OnDisconnected: TNotifyEvent read FOnDisconnected write FOnDisconnected;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property OnError: TOnChannelErrorEvent read FOnError write FOnError;</div><div class="code_line">&nbsp;&nbsp;{ переопределяемые при необходимости }</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Assign(Channel: TCustomChannel); virtual;</div><div class="code_line">&nbsp;&nbsp;{ обязательно переопределяемые }</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;constructor Create; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoGetDataSize(out DataSize: Cardinal): Boolean; virtual; abstract;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoRead(DataSize: Cardinal; var S: String): Boolean; virtual; abstract;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoWrite(const S: String): Boolean; virtual; abstract;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;THttpChannel = class(TCustomChannel)</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;FHRequest: HINTERNET;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FDataList: TStringList;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FBoundary: String;</div><div class="code_line">&nbsp;&nbsp;protected</div><div class="code_line">&nbsp;&nbsp; &nbsp;property HRequest: HINTERNET read FHRequest;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property DataList: TStringList read FDataList;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property Boundary: String read FBoundary;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function CreateBoundary: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function OpenRequest(Verb: Integer; Flags: Cardinal; const ObjectName: String = &#39;&#39;): Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function SendRequest(const Header, Data: String): Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function CloseRequest: Boolean; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure SetDestinationData(const Value: String); override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetDestinationData: String; override;</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;destructor Destroy; override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Добавляет поле в буфер для отправляемых данных</div><div class="code_line">&nbsp;&nbsp; &nbsp;function AddDestinationData(const FieldName, FieldValue: String): String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Аналогично AddDestinationData, но если нет файла,</div><div class="code_line">&nbsp;&nbsp; &nbsp;// то вернёт пустую строку</div><div class="code_line">&nbsp;&nbsp; &nbsp;function AddDestinationFile(const FieldName, FileName: String): String;</div><div class="code_line">&nbsp;&nbsp;{ переопределяемые при необходимости }</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Assign(Channel: TCustomChannel); override;</div><div class="code_line">&nbsp;&nbsp;{ обязательно переопределяемые }</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;constructor Create; override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoGetDataSize(out DataSize: Cardinal): Boolean; override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoRead(DataSize: Cardinal; var S: String): Boolean; override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoWrite(const S: String): Boolean; override;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">function SetStr(Condition: Boolean; const TrueStr: String; const FalseStr: String = &#39;&#39;): String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Condition then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := TrueStr</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := FalseStr;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetTickCount: Cardinal; external &#39;kernel32.dll&#39; name &#39;GetTickCount&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">function IsTimeout(StartCount, TickCount: Cardinal; TimeoutSec: Word): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lDelta: Cardinal;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;lDelta := TickCount - StartCount;</div><div class="code_line">&nbsp;&nbsp;if StartCount &#62; TickCount then</div><div class="code_line">&nbsp;&nbsp; &nbsp;lDelta := Cardinal(-1) + Succ(lDelta);</div><div class="code_line">&nbsp;&nbsp;Result := (lDelta &#62; TimeoutSec*1000);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{$IFDEF WRITELOG}</div><div class="code_line">&nbsp;</div><div class="code_line">procedure WriteLog(const S: String);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lFileName: String;</div><div class="code_line">&nbsp;&nbsp;f: TextFile;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;lFileName := ChangeFileExt(Application.ExeName, &#39;.channel.log&#39;);</div><div class="code_line">&nbsp;&nbsp;AssignFile(f, lFileName);</div><div class="code_line">&nbsp;&nbsp;if FileExists(lFileName) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Append(f)</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;Rewrite(f);</div><div class="code_line">&nbsp;&nbsp;WriteLn(f, S);</div><div class="code_line">&nbsp;&nbsp;CloseFile(f);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function BS(Value: Boolean): String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Value then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := &#39;True&#39;</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := &#39;False&#39;;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function InternetQueryDataAvailable(hFile: HINTERNET;</div><div class="code_line">&nbsp;&nbsp;var lpdwNumberOfBytesAvailable: DWORD; dwFlags, dwContext: DWORD): BOOL;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := WinInet.InternetQueryDataAvailable(hFile, lpdwNumberOfBytesAvailable, dwFlags, dwContext);</div><div class="code_line">&nbsp;&nbsp;S := &#39;InternetQueryDataAvailable hFile=%u lpdwNumberOfBytesAvailable=%u dwFlags=%u dwContext=%u Result=%s GetLastError=%d&#39;;</div><div class="code_line">&nbsp;&nbsp;WriteLog(Format(S, [DWORD(hFile), lpdwNumberOfBytesAvailable, dwFlags, dwContext, BS(Result), GetLastError]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function InternetOpen(lpszAgent: PChar; dwAccessType: DWORD;</div><div class="code_line">&nbsp;&nbsp;lpszProxy, lpszProxyBypass: PChar; dwFlags: DWORD): HINTERNET;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;WriteLog(&#39;&#39;);</div><div class="code_line">&nbsp;&nbsp;WriteLog(&#39;&#39;);</div><div class="code_line">&nbsp;&nbsp;Result := WinInet.InternetOpen(lpszAgent, dwAccessType, lpszProxy, lpszProxyBypass, dwFlags);</div><div class="code_line">&nbsp;&nbsp;S := &#39;InternetOpen lpszAgent=%s dwAccessType=%u lpszProxy=%s lpszProxyBypass=%s dwFlags=%u Result=%u GetLastError=%d&#39;;</div><div class="code_line">&nbsp;&nbsp;WriteLog(Format(S, [lpszAgent, dwAccessType, lpszProxy, lpszProxyBypass, dwFlags, DWORD(Result), GetLastError]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function InternetSetOption(hInet: HINTERNET; dwOption: DWORD;</div><div class="code_line">&nbsp;&nbsp;lpBuffer: Pointer; dwBufferLength: DWORD): BOOL;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := WinInet.InternetSetOption(hInet, dwOption, lpBuffer, dwBufferLength);</div><div class="code_line">&nbsp;&nbsp;S := &#39;InternetSetOption hInet=%u dwOption=%u dwBufferLength=%u Result=%s GetLastError=%d&#39;;</div><div class="code_line">&nbsp;&nbsp;WriteLog(Format(S, [DWORD(hInet), dwOption, dwBufferLength, BS(Result), GetLastError]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function InternetConnect(hInet: HINTERNET; lpszServerName: PChar;</div><div class="code_line">&nbsp;&nbsp;nServerPort: INTERNET_PORT; lpszUsername: PChar; lpszPassword: PChar;</div><div class="code_line">&nbsp;&nbsp;dwService: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := WinInet.InternetConnect(hInet, lpszServerName, nServerPort,</div><div class="code_line">&nbsp;&nbsp; &nbsp;lpszUsername, lpszPassword, dwService, dwFlags, dwContext);</div><div class="code_line">&nbsp;&nbsp;S := &#39;InternetConnect hInet=%u lpszServerName=%s nServerPort=%u lpszUsername=%s lpszPassword=%s dwService=%u dwFlags=%u dwContext=%u Result=%u GetLastError=%d&#39;;</div><div class="code_line">&nbsp;&nbsp;WriteLog(Format(S, [DWORD(hInet), lpszServerName, nServerPort, lpszUsername, lpszPassword, dwService, dwFlags, dwContext, DWORD(Result), GetLastError]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function InternetReadFile(hFile: HINTERNET; lpBuffer: Pointer;</div><div class="code_line">&nbsp;&nbsp;dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := WinInet.InternetReadFile(hFile, lpBuffer, dwNumberOfBytesToRead, lpdwNumberOfBytesRead);</div><div class="code_line">&nbsp;&nbsp;S := &#39;InternetReadFile hFile=%u dwNumberOfBytesToRead=%u lpdwNumberOfBytesRead=%u Result=%s GetLastError=%d&#39;;</div><div class="code_line">&nbsp;&nbsp;WriteLog(Format(S, [DWORD(hFile), dwNumberOfBytesToRead, lpdwNumberOfBytesRead, BS(Result), GetLastError]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function InternetWriteFile(hFile: HINTERNET; lpBuffer: Pointer;</div><div class="code_line">&nbsp;&nbsp;dwNumberOfBytesToWrite: DWORD; var lpdwNumberOfBytesWritten: DWORD): BOOL;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := WinInet.InternetWriteFile(hFile, lpBuffer, dwNumberOfBytesToWrite, lpdwNumberOfBytesWritten);</div><div class="code_line">&nbsp;&nbsp;S := &#39;InternetWriteFile hFile=%u dwNumberOfBytesToWrite=%u lpdwNumberOfBytesWritten=%u Result=%s GetLastError=%d&#39;;</div><div class="code_line">&nbsp;&nbsp;WriteLog(Format(S, [DWORD(hFile), dwNumberOfBytesToWrite, lpdwNumberOfBytesWritten, BS(Result), GetLastError]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function HttpOpenRequest(hConnect: HINTERNET; lpszVerb: PChar;</div><div class="code_line">&nbsp;&nbsp;lpszObjectName: PChar; lpszVersion: PChar; lpszReferrer: PChar;</div><div class="code_line">&nbsp;&nbsp;lplpszAcceptTypes: PLPSTR; dwFlags: DWORD; dwContext: DWORD): HINTERNET;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := WinInet.HttpOpenRequest(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext);</div><div class="code_line">&nbsp;&nbsp;S := &#39;HttpOpenRequest hConnect=%u lpszVerb=%s lpszObjectName=%s lpszVersion=%s dwFlags=%u dwContext=%u Result=%u GetLastError=%d&#39;;</div><div class="code_line">&nbsp;&nbsp;WriteLog(Format(S, [DWORD(hConnect), lpszVerb, lpszObjectName, lpszVersion, dwFlags, dwContext, DWORD(Result), GetLastError]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function HttpSendRequest(hRequest: HINTERNET; lpszHeaders: PChar;</div><div class="code_line">&nbsp;&nbsp;dwHeadersLength: DWORD; lpOptional: Pointer; dwOptionalLength: DWORD): BOOL;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := WinInet.HttpSendRequest(hRequest, lpszHeaders, dwHeadersLength, lpOptional, dwOptionalLength);</div><div class="code_line">&nbsp;&nbsp;S := &#39;HttpSendRequest(hRequest=%u lpszHeaders=%s dwHeadersLength=%u Result=%s GetLastError=%d&#39;;</div><div class="code_line">&nbsp;&nbsp;WriteLog(Format(S, [DWORD(hRequest), lpszHeaders, dwHeadersLength, BS(Result), GetLastError]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function InternetCloseHandle(hInet: HINTERNET): BOOL;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := WinInet.InternetCloseHandle(hInet);</div><div class="code_line">&nbsp;&nbsp;S := &#39;InternetCloseHandle hInet=%u Result=%s GetLastError=%d&#39;;</div><div class="code_line">&nbsp;&nbsp;WriteLog(Format(S, [DWORD(hInet), BS(Result), GetLastError]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{$ENDIF}</div><div class="code_line">&nbsp;</div><div class="code_line">{ TCustomChannel }</div><div class="code_line">&nbsp;</div><div class="code_line">constructor TCustomChannel.Create;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">&nbsp;&nbsp;Timeout := 20;</div><div class="code_line">&nbsp;&nbsp;Flags := INTERNET_FLAG_PRAGMA_NOCACHE + INTERNET_FLAG_RELOAD;</div><div class="code_line">&nbsp;&nbsp;UserAgent := UserAgents[USER_AGENT_DEFAULT].Agent;</div><div class="code_line">&nbsp;&nbsp;UseProxy := False;</div><div class="code_line">&nbsp;&nbsp;UserName := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;UserPassword := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;ProxyUser := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;ProxyPassword := &#39;&#39;;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">destructor TCustomChannel.Destroy;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Close;</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TCustomChannel.Assign(Channel: TCustomChannel);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Self.FHInet := Channel.FHInet;</div><div class="code_line">&nbsp;&nbsp;Self.FHConnect := Channel.FHConnect;</div><div class="code_line">&nbsp;&nbsp;Self.FDestinationData := Channel.FDestinationData;</div><div class="code_line">&nbsp;&nbsp;Self.FReceivedData := Channel.FReceivedData;</div><div class="code_line">&nbsp;&nbsp;Self.FFlags := Channel.FFlags;</div><div class="code_line">&nbsp;&nbsp;Self.FObjectName := Channel.FObjectName;</div><div class="code_line">&nbsp;&nbsp;Self.FServerPort := Channel.FServerPort;</div><div class="code_line">&nbsp;&nbsp;Self.FProxy := Channel.FProxy;</div><div class="code_line">&nbsp;&nbsp;Self.FProxyBypass := Channel.FProxyBypass;</div><div class="code_line">&nbsp;&nbsp;Self.FUserPassword := Channel.FUserPassword;</div><div class="code_line">&nbsp;&nbsp;Self.FUserName := Channel.FUserName;</div><div class="code_line">&nbsp;&nbsp;Self.FProxyUser := Channel.FProxyUser;</div><div class="code_line">&nbsp;&nbsp;Self.FProxyPassword := Channel.FProxyPassword;</div><div class="code_line">&nbsp;&nbsp;Self.FUseProxy := Channel.FUseProxy;</div><div class="code_line">&nbsp;&nbsp;Self.FProxyNeedAuthorization := Channel.FProxyNeedAuthorization;</div><div class="code_line">&nbsp;&nbsp;Self.FUserAgent := Channel.FUserAgent;</div><div class="code_line">&nbsp;&nbsp;Self.FServerName := Channel.FServerName;</div><div class="code_line">&nbsp;&nbsp;Self.FServiceType := Channel.FServiceType;</div><div class="code_line">&nbsp;&nbsp;Self.FOnBeforeOpen := Channel.FOnBeforeOpen;</div><div class="code_line">&nbsp;&nbsp;Self.FOnOpened := Channel.FOnOpened;</div><div class="code_line">&nbsp;&nbsp;Self.FOnBeforeConnect := Channel.FOnBeforeConnect;</div><div class="code_line">&nbsp;&nbsp;Self.FOnConnected := Channel.FOnConnected;</div><div class="code_line">&nbsp;&nbsp;Self.FOnBeforeClose := Channel.FOnBeforeClose;</div><div class="code_line">&nbsp;&nbsp;Self.FOnClosed := Channel.FOnClosed;</div><div class="code_line">&nbsp;&nbsp;Self.FLastError := Channel.FLastError;</div><div class="code_line">&nbsp;&nbsp;Self.FOnBeforeDisconnect := Channel.FOnBeforeDisconnect;</div><div class="code_line">&nbsp;&nbsp;Self.FOnDisconnected := Channel.FOnDisconnected;</div><div class="code_line">&nbsp;&nbsp;Self.FOnError := Channel.FOnError;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// ===== TCustomChannel - functions ====================================</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.GetLastError: Cardinal;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := FLastError;</div><div class="code_line">&nbsp;&nbsp;FLastError := 0;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.InternetCloseHandle(var Handle: Pointer): Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;{$IFDEF WRITELOG}</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := Channels.InternetCloseHandle(Handle);</div><div class="code_line">&nbsp;&nbsp;{$ELSE}</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := WinInet.InternetCloseHandle(Handle);</div><div class="code_line">&nbsp;&nbsp;{$ENDIF}</div><div class="code_line">&nbsp;&nbsp;if Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Handle := nil;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.SetError(Success: Boolean): Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Success then</div><div class="code_line">&nbsp;&nbsp; &nbsp;FLastError := 0</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;FLastError := Windows.GetLastError;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Assigned(FOnError) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FOnError(Self, FLastError);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;Result := Success;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.GetDataSize(out DataSize: Cardinal): Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := SetError(DoGetDataSize(DataSize));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.GetDestinationData: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := FDestinationData;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TCustomChannel.SetDestinationData(const Value: String);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FDestinationData := Value;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Read(DataSize: Cardinal; var S: String): Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if DataSize = 0 then DataSize := Cardinal(-1);</div><div class="code_line">&nbsp;&nbsp;Result := SetError(DoRead(DataSize, S));</div><div class="code_line">&nbsp;&nbsp;FReceivedData := SetStr(Result, S);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Read(DataSize: Cardinal = 0): Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := Read(DataSize, FReceivedData);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Write(S: String = &#39;&#39;): Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;S := SetStr(S = &#39;&#39;, DestinationData);</div><div class="code_line">&nbsp;&nbsp;Result := SetError(DoWrite(S));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// ===== TCustomChannel - open =========================================</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TCustomChannel.BeforeOpen;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Assigned(FOnBeforeOpen) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnBeforeOpen(Self);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.DoOpen: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Opened then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := True</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;FHInet := InternetOpen(PChar(FUserAgent), INTERNET_OPEN_TYPE_PRECONFIG, &#39;&#39;, &#39;&#39;, FFlags);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := SetError(Opened);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TCustomChannel.AfterOpen;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Assigned(FOnOpened) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnOpened(Self);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Opened: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := (FHInet &#60;&#62; nil);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Open: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;BeforeOpen;</div><div class="code_line">&nbsp;&nbsp;Result := DoOpen;</div><div class="code_line">&nbsp;&nbsp;if Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp;AfterOpen;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// ===== TCustomChannel - close ========================================</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.CanClose: Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lCanClose: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;lCanClose := True;</div><div class="code_line">&nbsp;&nbsp;if Assigned(FOnBeforeClose) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;OnBeforeClose(Self, lCanClose);</div><div class="code_line">&nbsp;&nbsp;Result := lCanClose;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.DoClose: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := Disconnect;</div><div class="code_line">&nbsp;&nbsp;if Result and Opened then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := SetError(InternetCloseHandle(FHInet));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TCustomChannel.AfterClose;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Assigned(FOnClosed) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnClosed(Self);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Closed: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := not Opened;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Close: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Closed then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := True</div><div class="code_line">&nbsp;&nbsp;else if not CanClose then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := False</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := DoClose;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;AfterClose;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// ===== TCustomChannel - connect ======================================</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TCustomChannel.BeforeConnect;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Assigned(FOnBeforeConnect) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnBeforeConnect(Self);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.DoConnect: Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lPI: TInternetProxyInfo;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Connected then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := True</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;if UseProxy and ((Proxy &#60;&#62; &#39;&#39;) or (ProxyBypass &#60;&#62; &#39;&#39;)) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lPI.dwAccessType := INTERNET_OPEN_TYPE_PROXY;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lPI.lpszProxy := PChar(Proxy);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lPI.lpszProxyBypass := PChar(ProxyBypass);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;InternetSetOption(HInet, INTERNET_OPTION_PROXY, @lPI, SizeOf(lPI));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if ProxyNeedAuthorization and ((ProxyUser &#60;&#62; &#39;&#39;) or (ProxyPassword &#60;&#62; &#39;&#39;)) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;InternetSetOption(HInet, INTERNET_OPTION_PROXY_USERNAME, PChar(ProxyUser), Length(ProxyUser));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;InternetSetOption(HInet, INTERNET_OPTION_PROXY_PASSWORD, PChar(ProxyPassword), Length(ProxyPassword));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lPI.dwAccessType := INTERNET_OPEN_TYPE_PRECONFIG;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lPI.lpszProxy := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lPI.lpszProxyBypass := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;InternetSetOption(HInet, INTERNET_OPTION_PROXY, @lPI, SizeOf(lPI));</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InternetSetOption(nil, INTERNET_OPTION_SETTINGS_CHANGED, nil, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;InternetSetOption(nil, INTERNET_OPTION_REFRESH , nil, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;FHConnect := InternetConnect(HInet, PChar(FServerName), FServerPort,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;PChar(FUserName), PChar(FUserPassword), FServiceType, FFlags, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := SetError(Connected);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TCustomChannel.AfterConnect;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Assigned(FOnConnected) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnConnected(Self);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Connected: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := (FHConnect &#60;&#62; nil);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Connect(const ServerName: String = &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;const UserName: String = &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;const UserPassword: String = &#39;&#39;): Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if ServerName &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Self.ServerName := ServerName;</div><div class="code_line">&nbsp;&nbsp;if UserName &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Self.UserName := UserName;</div><div class="code_line">&nbsp;&nbsp;if UserPassword &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Self.UserPassword := UserPassword;</div><div class="code_line">&nbsp;&nbsp;BeforeConnect;</div><div class="code_line">&nbsp;&nbsp;Result := DoConnect;</div><div class="code_line">&nbsp;&nbsp;if Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp;AfterConnect;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// ===== TCustomChannel - disconnect ===================================</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.CanDisconnect: Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lCanDisconnect: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;lCanDisconnect := True;</div><div class="code_line">&nbsp;&nbsp;if Assigned(FOnBeforeDisconnect) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;OnBeforeDisconnect(Self, lCanDisconnect);</div><div class="code_line">&nbsp;&nbsp;Result := lCanDisconnect;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.DoDisconnect: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Disconnected then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := True</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := SetError(InternetCloseHandle(FHConnect));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TCustomChannel.AfterDisconnect;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Assigned(FOnDisconnected) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnDisconnected(Self);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Disconnected: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := not Connected;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TCustomChannel.Disconnect: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if not CanDisconnect then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := False</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := DoDisconnect;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;AfterDisconnect;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ THttpChannel }</div><div class="code_line">&nbsp;</div><div class="code_line">constructor THttpChannel.Create;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">&nbsp;&nbsp;FDataList := TStringList.Create;</div><div class="code_line">&nbsp;&nbsp;FServerPort := INTERNET_DEFAULT_HTTP_PORT;</div><div class="code_line">&nbsp;&nbsp;FServiceType := INTERNET_SERVICE_HTTP;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">destructor THttpChannel.Destroy;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FDataList.Free;</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure THttpChannel.Assign(Channel: TCustomChannel);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited Assign(Channel);</div><div class="code_line">&nbsp;&nbsp;if Channel is THttpChannel then</div><div class="code_line">&nbsp;&nbsp; &nbsp;DataList.Assign(THttpChannel(Channel).DataList)</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;DataList.Clear;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THttpChannel.CreateBoundary: String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">&nbsp;&nbsp;i: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;S := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;for i := 0 to Pred(DataList.Count) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;S := S + DataList[i];</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 0 to 4 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := Result + Chr(Random(27) + Ord(&#39;A&#39;)) + Chr(Random(27) + Ord(&#39;a&#39;));</div><div class="code_line">&nbsp;&nbsp;until Pos(Result, S) &#60; 1;</div><div class="code_line">&nbsp;&nbsp;FBoundary := Result;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THttpChannel.GetDestinationData: String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">&nbsp;&nbsp;lCount: Integer;</div><div class="code_line">&nbsp;&nbsp;i: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;if DataList.Count &#62; 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreateBoundary;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lCount := Pred(DataList.Count);</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 0 to lCount do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;S := #13#10&#39;--&#39; + Boundary + #13#10 + DataList[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if i &#60; lCount then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := Result + S</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := Result + S + #13#10&#39;--&#39; + Boundary + &#39;--&#39;#13#10;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure THttpChannel.SetDestinationData(const Value: String);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;DataList.Clear;</div><div class="code_line">&nbsp;&nbsp;if Value &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp;DataList.Add(Value);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THttpChannel.DoGetDataSize(out DataSize: Cardinal): Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := InternetQueryDataAvailable(HRequest, DataSize, 0, 0);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THttpChannel.DoRead(DataSize: Cardinal; var S: String): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lDataSize: Cardinal;</div><div class="code_line">&nbsp;&nbsp;lDataReaded: Cardinal;</div><div class="code_line">&nbsp;&nbsp;lTickCount: Cardinal;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if DataSize = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;DataSize := Cardinal(-1);</div><div class="code_line">&nbsp;&nbsp;S := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;lTickCount := GetTickCount;</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := Open and Connect;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Close</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := OpenRequest(HTTP_VERB_GET, INTERNET_FLAG_DONT_CACHE + INTERNET_FLAG_NO_COOKIES);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if not Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Close</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := SendRequest(&#39;&#39;, &#39;&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if not Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Close</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := GetDataSize(lDataSize) and (lDataSize &#62; 511);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if not Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Close</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else if lDataSize = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := True</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if lDataSize &#62; DataSize then lDataSize := DataSize;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetLength(S, lDataSize);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := InternetReadFile(HRequest, @S[1], lDataSize, lDataReaded)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;and (lDataSize = lDataReaded);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if not Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Close</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetLength(S, lDataReaded);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CloseRequest;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not Result then Sleep(500);</div><div class="code_line">&nbsp;&nbsp;until Result or IsTimeout(lTickCount, GetTickCount, Timeout);</div><div class="code_line">&nbsp;&nbsp;if not Result then FLastError := GetLastError;</div><div class="code_line">&nbsp;&nbsp;Close;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THttpChannel.DoWrite(const S: String): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lReaded: Cardinal;</div><div class="code_line">&nbsp;&nbsp;lHeader: String;</div><div class="code_line">&nbsp;&nbsp;lTickCount: Cardinal;</div><div class="code_line">&nbsp;&nbsp;Stemp: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;lTickCount := GetTickCount;</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := Open and Connect;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Close</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := OpenRequest(HTTP_VERB_POST, INTERNET_FLAG_RELOAD);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if not Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Close</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lHeader := &#39;Content-Type: multipart/form-data; boundary=&#39; + Boundary + &#39;&#39;#13#10;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := HttpAddRequestHeaders(FHRequest, PChar(lHeader), Length(lHeader),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HTTP_ADDREQ_FLAG_REPLACE + HTTP_ADDREQ_FLAG_ADD);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if not Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Close</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := SendRequest(lHeader, S);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if not Result then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Close</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FReceivedData := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetLength(Stemp, 4096);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := InternetReadFile(HRequest, @Stemp[1], 4096, lReaded);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetLength(Stemp, lReaded);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FReceivedData := FReceivedData + Stemp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;until not Result or (lReaded &#60; 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CloseRequest;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not Result then Sleep(500);</div><div class="code_line">&nbsp;&nbsp;until Result or IsTimeout(lTickCount, GetTickCount, Timeout);</div><div class="code_line">&nbsp;&nbsp;if not Result then FLastError := GetLastError;</div><div class="code_line">&nbsp;&nbsp;Close;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">function THttpChannel.OpenRequest(Verb: Integer; Flags: Cardinal; const ObjectName: String = &#39;&#39;): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;lVerb: PChar;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if ObjectName &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Self.ObjectName := ObjectName;</div><div class="code_line">&nbsp;&nbsp;case Verb of</div><div class="code_line">&nbsp;&nbsp; &nbsp;HTTP_VERB_POST: lVerb := &#39;POST&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HTTP_VERB_GET: lVerb := &#39;GET&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HTTP_VERB_HEAD: lVerb := &#39;HEAD&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HTTP_VERB_PUT: lVerb := &#39;PUT&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HTTP_VERB_LINK: lVerb := &#39;LINK&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HTTP_VERB_DELETE: lVerb := &#39;DELETE&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HTTP_VERB_UNLINK: lVerb := &#39;UNLINK&#39;;</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;lVerb := &#39;GET&#39;;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;FHRequest := HttpOpenRequest(HConnect, lVerb, PChar(FObjectName), &#39;HTTP/1.0&#39;, nil, nil, FFlags, 0);</div><div class="code_line">&nbsp;&nbsp;Result := SetError(FHRequest &#60;&#62; nil);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THttpChannel.SendRequest(const Header, Data: String): Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := SetError(HttpSendRequest(HRequest, PChar(Header), Length(Header), PChar(Data), Length(Data)));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THttpChannel.CloseRequest: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := SetError(InternetCloseHandle(FHRequest));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THttpChannel.AddDestinationData(const FieldName, FieldValue: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;S := &#39;Content-Disposition: form-data; name=&quot;%s&quot;&#39;#13#10#13#10&#39;%s&#39;;</div><div class="code_line">&nbsp;&nbsp;DataList.Add(Format(S, [FieldName, FieldValue]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function THttpChannel.AddDestinationFile(const FieldName, FileName: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;f: File;</div><div class="code_line">&nbsp;&nbsp;lReadCount: Integer;</div><div class="code_line">&nbsp;&nbsp;S, Stemp: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;if FileExists(FileName) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;AssignFile(f, FileName);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Reset(f, 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;S := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SetLength(Stemp, 2048);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;BlockRead(f, Stemp[1], 2048, lReadCount);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SetLength(Stemp, lReadCount);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;S := S + Stemp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;until Eof(f) or (lReadCount &#60; 2048)</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CloseFile(f);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if S &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Stemp := &#39;Content-Disposition: form-data; name=&quot;%s&quot;; filename=&quot;%s&quot;&#39;#13#10&#39;Content-Type: application/octet-stream&#39;#13#10#13#10&#39;%s&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;S := Format(Stemp, [FieldName, FileName, S]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;DataList.Add(S);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := DestinationData;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2007-11-09T09:39:27+03:00">09.11.07, 06:39</time></span></span><br>
И вот кусок кода, который работает с каналом.<br>
Очень простой.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TConnector.SetElementValue(const AValue, AName: String);</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;lProcName = &#39;TConnector.SetElementValue&#39;;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if IsPageOpened then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Channel.AddDestinationData(AName, AValue)</div><div class="code_line">&nbsp;&nbsp;else RaiseError(lProcName, PAGE_NOT_OPENED);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TConnector.Submit(const RequestToLog: TSimpleRequest);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;AddToLog(RequestToLog);</div><div class="code_line">&nbsp;&nbsp;Channel.Timeout := Timeout;</div><div class="code_line">&nbsp;&nbsp;FBreakByTimeout := not Channel.Write;</div><div class="code_line">&nbsp;&nbsp;Channel.DestinationData := &#39;&#39;;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>alvd</author>
        <category>Интернет, сети, протоколы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=202012&amp;view=findpost&amp;p=1688864</guid>
        <pubDate>Fri, 07 Sep 2007 08:25:15 +0000</pubDate>
        <title>не могу скачать файл с интернета</title>
        <link>https://forum.sources.ru/index.php?showtopic=202012&amp;view=findpost&amp;p=1688864</link>
        <description><![CDATA[Rouse_: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">////////////////////////////////////////////////////////////////////////////////</div><div class="code_line">//</div><div class="code_line">// &nbsp;****************************************************************************</div><div class="code_line">// &nbsp;* Project &nbsp; : DownloadViaProxy</div><div class="code_line">// &nbsp;* Purpose &nbsp; : Демо скачивания файла с учетом бейсик авторизации и прокси</div><div class="code_line">// &nbsp;* Author &nbsp; &nbsp;: Александр (Rouse_) Багель</div><div class="code_line">// &nbsp;* Copyright : © Fangorn Wizards Lab 1998 - 2007.</div><div class="code_line">// &nbsp;* Version &nbsp; : 1.03</div><div class="code_line">// &nbsp;* Home Page : http://rouse.drkb.ru</div><div class="code_line">// &nbsp;****************************************************************************</div><div class="code_line">//</div><div class="code_line">&nbsp;</div><div class="code_line">program DownloadViaProxy;</div><div class="code_line">&nbsp;</div><div class="code_line">{$APPTYPE CONSOLE}</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows,</div><div class="code_line">&nbsp;&nbsp;SysUtils,</div><div class="code_line">&nbsp;&nbsp;Classes,</div><div class="code_line">&nbsp;&nbsp;WinInet;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TDownloadParams = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;FileURL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Запрос для файла</div><div class="code_line">&nbsp;&nbsp; &nbsp;Proxy, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// список прокси</div><div class="code_line">&nbsp;&nbsp; &nbsp;ProxyBypass, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// дополниотельный список прокси</div><div class="code_line">&nbsp;&nbsp; &nbsp;AuthUserName, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // логин для Authorization: Basic</div><div class="code_line">&nbsp;&nbsp; &nbsp;AuthPassword: String; &nbsp; // пароль для Authorization: Basic</div><div class="code_line">&nbsp;&nbsp; &nbsp;DownloadFrom, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // смещение от начала данных</div><div class="code_line">&nbsp;&nbsp; &nbsp;NeedDataSize: DWORD; &nbsp; &nbsp;// необходимый размер</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">function DownloadFileEx(</div><div class="code_line">&nbsp;Params: TDownloadParams; OutputData: TStream): Boolean;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;function DelHttp(URL: String): String;</div><div class="code_line">&nbsp;var</div><div class="code_line">&nbsp;&nbsp; HttpPos: Integer;</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; HttpPos := Pos(&#39;http://&#39;, URL);</div><div class="code_line">&nbsp;&nbsp; if HttpPos &#62; 0 then Delete(Url, HttpPos, 7);</div><div class="code_line">&nbsp;&nbsp; Result := Copy(Url, 1, Pos(&#39;/&#39;, Url) - 1);</div><div class="code_line">&nbsp;&nbsp; if Result = &#39;&#39; then Result := URL;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;Accept = &#39;Accept: */*&#39; + sLineBreak;</div><div class="code_line">&nbsp;ProxyConnection = &#39;Proxy-Connection: Keep-Alive&#39; + sLineBreak;</div><div class="code_line">&nbsp;LNG = &#39;Accept-Language: ru&#39; + sLineBreak;</div><div class="code_line">&nbsp;AGENT =</div><div class="code_line">&nbsp;&nbsp; &#39;User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; &#39; +</div><div class="code_line">&nbsp;&nbsp; &#39;Windows NT 5.1; SV1; .NET CLR 2.0.50727)&#39; + sLineBreak;</div><div class="code_line">var</div><div class="code_line">&nbsp;FSession, FConnect, FRequest: HINTERNET;</div><div class="code_line">&nbsp;FHost, FScript, SRequest, ARequest: String;</div><div class="code_line">&nbsp;Buff, IntermediateBuffer: array of Byte;</div><div class="code_line">&nbsp;BytesRead, Res, Len,</div><div class="code_line">&nbsp;FilePosition, OpenTypeFlags, ContentLength: Cardinal;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := False;</div><div class="code_line">&nbsp;&nbsp;ARequest := Params.FileURL;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Небольшой парсинг</div><div class="code_line">&nbsp;&nbsp;// вытаскиваем имя хоста и параметры обращения к скрипту</div><div class="code_line">&nbsp;&nbsp;FHost := DelHttp(ARequest);</div><div class="code_line">&nbsp;&nbsp;FScript := ARequest;</div><div class="code_line">&nbsp;&nbsp;Delete(FScript, 1, Pos(FHost, FScript) + Length(FHost));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Инициализируем WinInet</div><div class="code_line">&nbsp;&nbsp;if Params.Proxy = &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; OpenTypeFlags := INTERNET_OPEN_TYPE_PRECONFIG</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; OpenTypeFlags := INTERNET_OPEN_TYPE_PROXY;</div><div class="code_line">&nbsp;&nbsp;FSession := InternetOpen(&#39;&#39;,</div><div class="code_line">&nbsp;&nbsp;OpenTypeFlags, PChar(Params.Proxy), PChar(Params.ProxyBypass), 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if not Assigned(FSession) then Exit;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Попытка соединения с сервером</div><div class="code_line">&nbsp;&nbsp; &nbsp;FConnect := InternetConnect(FSession, PChar(FHost),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;INTERNET_DEFAULT_HTTP_PORT, PChar(Params.AuthUserName),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;PChar(Params.AuthPassword), INTERNET_SERVICE_HTTP, 0, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not Assigned(FConnect) then Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Подготавливаем запрос</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FRequest := HttpOpenRequest(FConnect, &#39;GET&#39;, PChar(FScript), nil,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;&#39;, nil, 0, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// добавляем необходимые заголовки к запросу</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;HttpAddRequestHeaders(FRequest, Accept,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Length(Accept), HTTP_ADDREQ_FLAG_ADD);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;HttpAddRequestHeaders(FRequest, ProxyConnection,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Length(ProxyConnection), HTTP_ADDREQ_FLAG_ADD);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;HttpAddRequestHeaders(FRequest, LNG,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Length(LNG), HTTP_ADDREQ_FLAG_ADD);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;HttpAddRequestHeaders(FRequest, AGENT,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Length(AGENT), HTTP_ADDREQ_FLAG_ADD);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Проверяем запрос:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Len := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Res := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SRequest := &#39; &#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if Len &#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; SetLength(SRequest, Len);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if not Assigned(FConnect) then Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Отправляем запрос</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if not (HttpSendRequest(FRequest, nil, 0, nil, 0)) then Exit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Узнаем размер файла</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ContentLength := InternetSetFilePointer(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FRequest, 0, nil, FILE_END, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ContentLength = DWORD(-1) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ContentLength := 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// выставляем позцию, откуда нужно начинать скачку</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FilePosition := InternetSetFilePointer(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FRequest, Params.DownloadFrom, nil, FILE_BEGIN, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if FilePosition = DWORD(-1) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FilePosition := 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Выставляем размер приемного буффера</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if Params.NeedDataSize = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Params.NeedDataSize := ContentLength;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if Integer(FilePosition) + Params.NeedDataSize &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Integer(ContentLength) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Params.NeedDataSize := ContentLength - FilePosition;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // если не смогли определить размер данных - читаем все что прочтется</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if Params.NeedDataSize &#60;= 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetLength(IntermediateBuffer, 8192);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ContentLength := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Params.NeedDataSize := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BytesRead := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while InternetReadFile(FRequest, @IntermediateBuffer[0],</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;100, BytesRead) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if BytesRead &#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetLength(Buff, ContentLength + BytesRead);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Move(IntermediateBuffer[0], Buff[ContentLength], BytesRead);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Inc(ContentLength, BytesRead);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Params.NeedDataSize := ContentLength;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// в противном случае, принимаем данные как обычно</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetLength(Buff, Params.NeedDataSize);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if not InternetReadFile(FRequest, @Buff[0],</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Params.NeedDataSize, BytesRead) then Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;OutputData.Write(Buff[0], Params.NeedDataSize);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := True;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;InternetCloseHandle(FRequest);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;InternetCloseHandle(FConnect);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;InternetCloseHandle(FSession);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Params: TDownloadParams;</div><div class="code_line">&nbsp;&nbsp;Data: TMemoryStream;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(@Params, SizeOf(TDownloadParams));</div><div class="code_line">&nbsp;&nbsp; &nbsp;Params.FileURL :=</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;&#39;http://google.com/index.html&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Data := TMemoryStream.Create;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if DownloadFileEx(Params, Data) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Data.SaveToFile(&#39;c:\test.htm&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Data.Free;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp;on E:Exception do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Writeln(E.Classname, &#39;: &#39;, E.Message);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
Еще пример использования<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function GetMultiproxyProxyList(ResultList: TStringList): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Params: TDownloadParams;</div><div class="code_line">&nbsp;&nbsp;Data: TStringStream;</div><div class="code_line">&nbsp;&nbsp;AResult: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := False;</div><div class="code_line">&nbsp;&nbsp;ZeroMemory(@Params, SizeOf(TDownloadParams));</div><div class="code_line">&nbsp;&nbsp;Params.FileURL :=</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;http://multiproxy.org/txt_all/proxy.txt&#39;;</div><div class="code_line">&nbsp;&nbsp;Data := TStringStream.Create(&#39;&#39;);</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;if DownloadFileEx(Params, Data) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetLength(AResult, Data.Size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Data.Read(AResult, Data.Size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ResultList.Text := AResult;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := True;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;Data.Free;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Еще один пример использования, но вот этот сервер не дает размер файла:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function GetProxyListOrgProxyList(ResultList: TStringList): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Params: TDownloadParams;</div><div class="code_line">&nbsp;&nbsp;Data: TStringStream;</div><div class="code_line">&nbsp;&nbsp;AResult: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := False;</div><div class="code_line">&nbsp;&nbsp;ZeroMemory(@Params, SizeOf(TDownloadParams));</div><div class="code_line">&nbsp;&nbsp;Params.FileURL :=</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;http://proxy-list.org/downloadproxylist.php?sp=-1&amp;pp=any&amp;pt=any&amp;pc=any&amp;ps=any&#39;;</div><div class="code_line">&nbsp;&nbsp;// Params.DownloadFrom := 4; // &#60;- попытка дозакачки...</div><div class="code_line">&nbsp;&nbsp;Data := TStringStream.Create(&#39;&#39;);</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;if DownloadFileEx(Params, Data) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if Data.Size = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ResultList.Add(&#39;Сервер не поддерживает дозакачку.&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetLength(AResult, Data.Size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Data.Read(AResult, Data.Size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ResultList.Text := AResult;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := True;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;Data.Free;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Rouse_</author>
        <category>Интернет, сети, протоколы</category>
      </item>
	
      </channel>
      </rss>
	