Главная страница
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.045 c
14-1103642476
Болтуны, кто они?
2004-12-21 18:21
2005.01.09
Предлагаю выбрать наиболее болтливых, по принципу:


14-1103269170
msguns
2004-12-17 10:39
2005.01.09
Днепр занял 1-е место в группе.


1-1103742624
Capital
2004-12-22 22:10
2005.01.09
Своя область на контрол-панэл


9-1095617521
_Дельфин_
2004-09-19 22:12
2005.01.09
Что делать с искусственным интелектом?


4-1100873802
VadimEagle
2004-11-19 17:16
2005.01.09
Печать