Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
9-1094846937
Colt1978
2004-09-11 00:08
2005.01.09
Игровое меню


14-1103264611
X9
2004-12-17 09:23
2005.01.09
Управление светодиодами с помощью портов


9-1095542569
Jack
2004-09-19 01:22
2005.01.09
Вопрос по GLScene


14-1102599038
Постоянный посетитель
2004-12-09 16:30
2005.01.09
Приокрывая занавес или что же на самом деле стоит за error 500


14-1103535518
Некто
2004-12-20 12:38
2005.01.09
Web-технологии





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский