{codecitation class="brush: pascal; gutter: false;" width="600px"}

Посетитель у провайдера.

— Ой, что это у вас так крякнуло.

— Сервер наверное…

{

Присоедините следующие события к Вашему ClientSocket:

procedure T…Form.ClientSocket1Write;

procedure T…Form.ClientSocket1Read;

procedure T…Form.ClientSocket1Disconnect;

procedure T…Form.ClientSocket1Error;

Так же пример показывает, как направлять передачу через прокси-сервер.

Для отправки на вебсервер используется следующий формат:

Напрямую:

'POST ' PostAddr 'HTTP/1.0' HTTP_Data Content

Через проксю:

'POST http://' Webserver PostAddr 'HTTP/1.0' HTTP_Data Content

}

const

WebServer = 'www.somehost.com';

WebPort = 80;

PostAddr = '/cgi-bin/form';

{ Следующие переменные используются только для вебсервера: }

ProxyServer ='proxy.somewhere.com';

ProxyPort = 3128;

// В заголовке post необходимы некоторые данные

HTTP_Data =

'Content-Type: application/x-www-form-urlencoded'#10

'User-Agent: Delphi/5.0 ()'#10 { Отрекламируем Delphi 5! }

'Host: somewhere.com'#10

'Connection: Keep-Alive'#10;

type

T…Form = class (TForm)

private

{ Private declarations }

HTTP_POST: string;

FContent: string;

// Эта переменная будет содержать ответ сервера

FResult: string;

public

{ Public declarations }

end;

{ Эти функции сделают некоторое url-кодирование }

{ Например. 'John Smith' => 'John Smith' }

function HTTPTran (St: string): string;

var

i: Integer;

begin

Result:='';

for i:=1 to length (St) do

if St[i] in ['a'..'z','A'..'Z','0','1'..'9'] then

Result:=Result St[i]

else

if St[i]=' ' then

Result:=Result ' '

else

Result:=Result '%' IntToHex (Byte (St[i]),2);

end;

procedure T…Form.ClientSocket1Write (Sender: TObject;

Socket: TCustomWinSocket);

begin

// Постим данные

Socket.SendText (HTTP_POST FContent);

end;

procedure T…Form.ClientSocket1Read (Sender: TObject;

Socket: TCustomWinSocket);

begin

// Получаем результат

FResult:=FResult Socket.ReceiveText;

end;

procedure T…Form.ClientSocket1Disconnect (Sender: TObject;

Socket: TCustomWinSocket);

begin

// ЗДЕСЬ МОЖНО ОБРАБОТАТЬ FResult //

end;

procedure T…Form.ClientSocket1Error (Sender: TObject;

Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;

var ErrorCode: Integer);

begin

ErrorCode:= 0; // Игнорируем ошибки

end;

{ А эта подпрограмма, которую можно

использовать для постинга данных формы. }

procedure T…Form.PostTheForm;

begin

// Очищаем результаты

FResult:='';

// Вы можете ввести поля формы, которые необходимы

// Вот некоторые примеры:

FContent:=

'Name=' HTTPTran ('John Smith') '