Вниз
Скачать: CL | DM;

прокси на IdTCPServer   Найти похожие ветки 

← →
vers ©   (2004-10-15 22:38) [0]

Делаю потихоньку http-прокси.
При событии OnExecute создается новый TIdTCPClient, коннектится к нужному
сайту, передает запрос, скачивает порцию информации в буфер, передает ее
подключившемуся клиенту.
Вопрос: как отловить, что пользователь уже передал все, что нужно? опрашивать
AThread.Connection.InputBuffer.Size некорректно: после его обращения в 0,
пользователь иногда продолжает передавать данные.
Может это реализуется при помощи потоков? Кто уже с этим сталкивался?
Или как отловить событие прихода данных со стороны клиента и со стороны
удаленного сервера? В компоненте TServerSocket есть события
OnClientRead/OnClientWrite, какие аналоги в TIdTCPServer?
Вообще уже замучался, кучу хелпа по инди перерыл, кучу примеров пересмотрел,
ничего похожего не нашел.


← →
Piter ©   (2004-10-16 11:19) [1]

vers ©   (15.10.04 22:38)
как отловить, что пользователь уже передал все, что нужно?


непонятный вопрос... структуру HTTP пакета знаем? Не знаем - идем изучать.


← →
vers ©   (2004-10-16 13:13) [2]

знаем.
Пример: клиент отправляет запрос проксе, прокси обращается к удаленному web-серверу, тот ему говорит 200 ОК, но не говорит, сколько он собирается передавать (строки content-length нету), как же определить, что удаленный сервер все уже передал и можно закрывать соединение?
Или к примеру, клиент посылает команду CONNECT, там вообще не понятно кто, когда и сколько будет передавать.

P.S. Я уже забросил идею сделать прокси на IdTCPServer, лучше сделаю на IdMappedPortTCP, благо, что мне нужно сделать только звено в цепочке прокси, для аутентификации и подсчета траффика, но разобраться с этим вопросом все равно хотелось бы.


← →
Piter ©   (2004-10-16 14:26) [3]

vers ©   (16.10.04 13:13) [2]
строки content-length нету),


Смотрим:

----------------------------------------------

GET http://delphimaster.net/view/6-1097865516/ HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*
Accept-Language: ru
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Host: www.delphimaster.ru
Proxy-Connection: Keep-Alive

< HTTP/1.1 200 OK
Date: Sat, 16 Oct 2004 10:23:59 GMT
Server: Apache/1.3.27 (Unix) FrontPage/5.0.2.2623 PHP/4.3.2 mod_gzip/1.3.19.1a mod_accounting/1.0 mod_fastcgi/2.4.0 mod_ssl/2.8.14 OpenSSL/0.9.7b rus/PL30.17
Content-Length: 14625
Connection: close
Content-Type: text/html; charset=windows-1251

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<TITLE>Мастера DELPHI | прокси на IdTCPServer</TITLE
.....


← →
vers ©   (2004-10-16 21:06) [4]

посмотри ответ сервера на это:
GET http://lib.ru/TCPBOOK/tcp1.txt HTTP/1.1

в нем нет content-length :(


← →
Piter ©   (2004-10-16 21:36) [5]

Зато он передает:

HTTP/1.1 200 OK<!CR!><!LF!>Date: Sat, 16 Oct 2004 17:34:41 GMT
Server: Apache/1.3.27
Last-Modified: Wed, 17 Mar 1999 16:31:31 GMT
Content-Type: text/html; charset=windows-1251
Connection: close


соответственно, когда он все передаст он просто разорвет соединение. То есть, разрыв соединения и считается концом документа. Вот так.
Хотя сервер, конечно, нехорошо поступает...


← →
Reindeer Moss Eater ©   (2004-10-18 08:48) [6]

Читать запрос клиента с помощью readln до тех пор пока не прочитаешь пустую строку.
Это заголовок.
Если в нем есть Content-Length, значит надо прочитать еще указанное в нем количество байт.
Все вместе - запрос клиента целиком.


← →
vers ©   (2004-10-18 20:13) [7]

+ (если следовать RFC) нужно игнорировать пустые строки в начале запроса
А где можно почитать о реализации команды CONNECT? Написано, что при этом должен создаваться http-туннель, а как он работает - не написано.


← →
vers ©   (2004-10-18 20:14) [8]

+ (если следовать RFC) нужно игнорировать пустые строки в начале запроса
А где можно почитать о реализации команды CONNECT? Написано, что при этом должен создаваться http-туннель, а как он работает - не написано.


← →
Reindeer Moss Eater ©   (2004-10-20 08:44) [9]

RFC 2616

Соединившись с прокси
посылаем ему :

CONNECT <нужный_нам_хост>:<нужный_нам_порт> HTTP/1.x <CR_LF>
<CR_LF>

В ответ получаем заголовок.
Если все нормально, то в нем мы найдем:
HTTP/1.x 200 <...>



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.044 c
14-1103524788
ocean
2004-12-20 09:39
2005.01.09
Что круче, программист или менеджер?


3-1102589759
Denmin
2004-12-09 13:55
2005.01.09
Как убрать знаки Entera при конвертации данных?


14-1103273771
ocean
2004-12-17 11:56
2005.01.09
Скринсейвер тормозит клиентов?


9-1094976575
Ландграф Павел
2004-09-12 12:09
2005.01.09
Реалистичное текстурирование ландшафта в 3DSMAX


4-1100755551
tyuiop
2004-11-18 08:25
2005.01.09
Вызов CreateProcess




   Наверх