Форум: "Сети";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Внизпрокси на 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.044 c