Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: 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 вся ветка

Текущий архив: 2005.01.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
14-1103370738
Hypercube
2004-12-18 14:52
2005.01.09
Перевод C++ > Delphi


3-1102326628
Linker
2004-12-06 12:50
2005.01.09
Картинка


14-1103299004
Dert
2004-12-17 18:56
2005.01.09
Движок для чата.


3-1102547978
dolphin
2004-12-09 02:19
2005.01.09
какой метод изменения текста в строке определеного столбца


4-1100691991
H.A.Z.A.R.D.
2004-11-17 14:46
2005.01.09
How Create a System Service [Install Service] (создать службу)