![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
idTCPClient: отсылка запроса через проксю?
Луарвик © (2004-10-16 19:36:00)Как? Пример. Плиз....
Slym (2004-10-28 05:59:00) [1]Пример проверки доступности странички через прокси локалки + через анонимный прокси (пложенность проксей теоретически не ограничена, включая зацикливание проксей друг на друга)
function GetResponseCode(const Response:string): Integer;
var S: string;
begin
S := Response;
Fetch(S);
S := Trim(S);
Result := StrToIntDef(Fetch(S, ' ', False), -1);
end;
procedure TForm1.Button2Click(Sender: TObject);
procedure log(const Msg:string);
begin
Memo1.Lines.Add(Msg);
end;
procedure Wln(const Msg:string);
begin
Log(Msg);IdTCPClient1.WriteLn(Msg);
end;
function Rln:string;
var s:string;
begin
result:='';
repeat
s:=IdTCPClient1.ReadLn;
result:=result+#13#10+s;
until s='';
Log(result);
end;
begin
try
Memo1.Clear;
Log('Connecting to '+IdTCPClient1.Host+':'+IntToStr(IdTCPClient1.Port)+' proxy');
IdTCPClient1.Connect;
try
Log('Connected'#13#10);
Wln('CONNECT 61.131.63.186:8080 HTTP/1.1');
Wln('Proxy-Authorization: Basic blabla'#13#10);
if GetResponseCode(Rln)<>200 then begin Log('Error'); exit; end;
Wln('HEAD / HTTP/1.1');
Wln('Host: www.MotherFucker.ru'#13#10);
if GetResponseCode(Rln)<>200 then begin Log('Error'); exit; end;
Log(IdTCPClient1.AllData);
finally
IdTCPClient1.Disconnect;
end;
except
on e:exception do
begin
Log(E.Message);
end;
end;
end;
Reindeer Moss Eater (2004-10-27 09:12:00) [2]Читай в RFC2616 про команду CONNECT
alienserg (2004-10-27 05:06:00) [3]GobliNGuT © (27.10.04 01:11) [26]
1) найти доку по протоколу мессенджера
есть дока
2) подключится телнетом к порту 20847
По какому адресу подключиться? Ведь клиент под HTTP прокси. Клиент не может подключаться напрямую. Задача состоит в том, чтобы заставить прокси установить коннект между клиентом и внешним сервером мессенджера, который не знает, что такое команда GET. В какой момент прокси организует коннект между клиентом и внешним сервером мессенджера? После какой последовательности команд, отправленных от клиента к прокси? Каким образом клиент сообщит прокси адрес и порт сервера мессенджера?
Для простоты предположим, что клиент и сервер взяты из демошек IndyDemos\Chat\Client и Chat\Server.
Там последовательность действий предельно простая, если работать напрямую:
1. клиент коннектится по адресу/порту
2. в событии IdTCPClient1Connected клиент посылает серверу свое имя
3. сервер отвечает фразой
Извини за дотошность расспросов. Просто интересно знать, заставит ли посылка команд от клиента к прокси
IdTcpClient.WriteLn('GET messenger_server_IP');
IdTcpClient.WriteLn('HTTP/1.0');
IdTcpClient.WriteLn('Content-Type: text/html');
IdTcpClient.WriteLn('');
установить связь с сервером мессенджера. Как в таком случае клиент сообщает прокси порт, по которому нужно коннектиться?
GobliNGuT (2004-10-27 01:11:00) [4]alienserg (26.10.04 19:58) [25]
Естественно он игнорирует. У мессенджера насколько я понимаю должен быть свой протокол. Значит действия должны быть такого рода:
1) найти доку по протоколу мессенджера
2) подключится телнетом к порту 20847 и попробовать ручками поработать с портом, проанализировав посланные данные и полученные
3) создать в дельфи соединение TCP/IP на нужный порт
4) писать в порт данные согласно протоколу мессенджера
В целом, прием сработает, надо только изучить протокол для того чтобы знать что писать в порт.
alienserg (2004-10-26 19:58:00) [5]GobliNGuT © (25.10.04 15:01) [20]
IdTcpClient.WriteLn('GET www.delphimaster.ru');
IdTcpClient.WriteLn('HTTP/1.0');
IdTcpClient.WriteLn('Content-Type: text/html');
Сработает ли вышепреведенный прием, если надо законнектиться по порту например 20847 к серверу мессенджера, который понятия не имеет, что такое HTTP протокол и GET запрос просто проигнорирует?
Луарвик (2004-10-25 23:57:00) [6]Ок, post так же работает? Знач все что мне нужно - это в TCP.Host указать хост прокси, и вуаля!
Я думал будет сложнее...
GobliNGuT (2004-10-25 15:30:00) [7]согласен
Reindeer Moss Eater (2004-10-25 15:24:00) [8]IdTcpClient.WriteLn('Content-Type: text/html');
...
IdTcpClient.WriteLn(''); //посылка #10#13
IdTcpClient.WriteLn('');// 2 раза!
Последняя строка - лишняя.
GobliNGuT (2004-10-25 15:02:00) [9]сорри за то что два раза заслал - сервак не принимал ...
GobliNGuT (2004-10-25 15:01:00) [10]alienserg (25.10.04 02:22) [18]
я на вопрос ответил, разжевать забыл =)
... делается это примерно так
if IdTcpClient.connect
then
begin
ResStr:=IdTcpClient.ReadLn;
... //просмотр ответа сервера, первые 3 символа содержат
// код ответа, если 200 - то все ОК. В последующих символах можно //прочитать инфу о серваке.
IdTcpClient.WriteLn('GET www.delphimaster.ru');
IdTcpClient.WriteLn('HTTP/1.0');
IdTcpClient.WriteLn('Content-Type: text/html');
...
IdTcpClient.WriteLn(''); //посылка #10#13
IdTcpClient.WriteLn('');// 2 раза!
ResStr='';
ResStr:=IdTcpClient.ReadLn;
while (ResStr='')and(timeOut<60) do ResStr:=IdTcpClient.ReadLn;
end;
Внимание!Это не готовый код а общая идея. Аналогичную штуку я писал и она работала. код не сохранился
В idHTTP достаточно было бы воспользоваться методом GET.
А здесь приходится писать все подробно.
GobliNGuT (2004-10-25 15:00:00) [11]alienserg (25.10.04 02:22) [18]
я на вопрос ответил, разжевать забыл =)
... делается это примерно так
if IdTcpClient.connect
then
begin
ResStr:=IdTcpClient.ReadLn;
... //просмотр ответа сервера, первые 3 символа содержат
// код ответа, если 200 - то все ОК. В последующих символах можно //прочитать инфу о серваке.
IdTcpClient.WriteLn('GET www.delphimaster.ru');
IdTcpClient.WriteLn('HTTP/1.0');
IdTcpClient.WriteLn('Content-Type: text/html');
...
IdTcpClient.WriteLn(''); //посылка #10#13
IdTcpClient.WriteLn('');// 2 раза!
ResStr='';
ResStr:=IdTcpClient.ReadLn;
while (ResStr='')and(timeOut<60) do ResStr:=IdTcpClient.ReadLn;
end;
Внимание!Это не готовый код а общая идея. Аналогичную штуку я писал и она работала. код не сохранился
В idHTTP достаточно было бы воспользоваться методом GET.
А здесь приходится писать все подробно.
alienserg (2004-10-25 02:22:00) [12]GobliNGuT © (25.10.04 01:16) [17]
Посылать http запросы через прокси не проблема. Это умеет делать TIdHttpClient.
Вопрос был, насколько я понимаю, о том, как заставить работать TIdTcpClient через прокси на низовом уровне. Connect, WriteLn, ReadLn, и т.д.
GobliNGuT (2004-10-25 01:16:00) [13]сделай соединение с нужным портом прокси и пошли туда команду
GET www.delphimaster.ru
HTTP/1.0
Content-Type: text/html
(2 раза #10#13)
... и еще что-то - не помню, вообщем тебе надо почитать доку по протоколу HTTP. а попрактиковать умения сможешь подрубившись c помощью телнета(не забудь сделать эхо чтобы видеть что набираешь).
протокол HTTP описан в каком-то rfcХХХ - номер не помню.
Луарвик (2004-10-24 14:33:00) [14]Ну пасибо
alienserg (2004-10-24 03:41:00) [15]скачиваешь
http://www.milliseconds.webhost.ru/files/IndyFAQHTMLHelp.zip
смотришь раздел Firewalls and Proxies
и видишь:
Q. How do I use a TIdTCPClient with a HTTP Tunneling Proxy?
A. Both Indy 8.0 and Indy 9.0 do not support HTTP Tunneling proxies so you have to use Indy 10.
Q. How do I use a TIdTCPClient with a SOCKS Proxy?
A. (For Indy 9.0)
1. Create an IOHandler such as TIdIOHandlerSocket or TIdSSLIOHandlerSocket and assign the TCPClient.IOHandler property this.
2. Create a TIdSocksInfo object and assign it to the IOHandler's SocksInfo property.
3. Set the TIdSocksInfo properties as required.
Еще почитай там же
Q. How do I use Indy with a NAT (Network Address Translator)?
И вообще прочитай все, что там написано. Два-три раза.
Луарвик (2004-10-22 23:27:00) [16]Неужели никак?
Луарвик (2004-10-21 15:38:00) [17]Не понял. Ты хоть сам понял?
Palladin (2004-10-20 22:54:00) [18]Потому что http://book.itep.ru/...
если ты там что нибудь поймешь...
Луарвик (2004-10-20 22:50:00) [19]У того же IdFTP есть настройки прокси! Почему TCP нет?!
Луарвик! (2004-10-20 22:44:00) [20]Ну да! А тот же idHTTP?