RumShun
04.08.2009, 12:14
вобщем вот код
TProxy = record
adrIA:TInAddr;
adr:string[15];
port:integer;
end;
function checkHttp(Serv:String;Port:integer;proxy:TProxy):b oolean;
var
sock:TSocket;
addr:TSockAddrIn;
Buff: array[0..255] of char;
begin
result:=false;
FillChar(Addr.sin_zero, SizeOf(Addr.sin_zero), 0);
addr.sin_family:=AF_INET;
addr.sin_port:=htons(proxy.port);
addr.sin_addr:=proxy.adrIA;
connect(sock, @addr, SizeOf(addr));
str:='CONNECT '+serv+':'+inttostr(port)+' HTTP/1.0\r\nUser-Agent: Opera/9.60\r\n';
send(Sock,str,sizeof(str),0);
FillChar(Buff,sizeof(Buff), 0);
recv(sock2,Buff,sizeof(Buff),0);
if buff[10]='2' then result:=true;
closesocket(sock2);
end;
максимальное его упростил, пробовал уже и так и эдак, нифига не получаеться подвисает на
recv(sock2,Buff,sizeof(Buff),0);
потом ничего не принимает.
В RFC 2616 (HTTP 1.1) описаны следующие методы: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT.
Пролистав ниже по спецификации, читаем следующее о методе CONNECT: "Спецификация резервирует имя метода CONNECT для использования с прокси, которые могут динамически переключаться на работу в качестве туннеля (например, туннелирование SSL)". Далее идет ссылка на документ (draft-luotonen-web-proxy-tunneling-XX), некоторые выдержки из которого будут приводиться ниже. Этот документ описывает расширение протокола HTTP 1.x (не только 1.1, но и 1.0) для организации туннелирования TCP-based протоколов через веб-прокси. Теперь собственно о том, как это работает.
1. Клиент соединяется с HTTP Proxy, поддерживающим метод CONNECT.
2. Клиент посылает серверу строку вида "CONNECT target_host:target_port HTTP/1.x\r\nUser-Agent: User Agent\r\n"
3. В ответ на эту строку сервер может либо потребовать авторизацию, либо вернуть состояние удачного соединения либо ошибку.
вроде все просто, где чево не понимаю не могу найти. :confused:
TProxy = record
adrIA:TInAddr;
adr:string[15];
port:integer;
end;
function checkHttp(Serv:String;Port:integer;proxy:TProxy):b oolean;
var
sock:TSocket;
addr:TSockAddrIn;
Buff: array[0..255] of char;
begin
result:=false;
FillChar(Addr.sin_zero, SizeOf(Addr.sin_zero), 0);
addr.sin_family:=AF_INET;
addr.sin_port:=htons(proxy.port);
addr.sin_addr:=proxy.adrIA;
connect(sock, @addr, SizeOf(addr));
str:='CONNECT '+serv+':'+inttostr(port)+' HTTP/1.0\r\nUser-Agent: Opera/9.60\r\n';
send(Sock,str,sizeof(str),0);
FillChar(Buff,sizeof(Buff), 0);
recv(sock2,Buff,sizeof(Buff),0);
if buff[10]='2' then result:=true;
closesocket(sock2);
end;
максимальное его упростил, пробовал уже и так и эдак, нифига не получаеться подвисает на
recv(sock2,Buff,sizeof(Buff),0);
потом ничего не принимает.
В RFC 2616 (HTTP 1.1) описаны следующие методы: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT.
Пролистав ниже по спецификации, читаем следующее о методе CONNECT: "Спецификация резервирует имя метода CONNECT для использования с прокси, которые могут динамически переключаться на работу в качестве туннеля (например, туннелирование SSL)". Далее идет ссылка на документ (draft-luotonen-web-proxy-tunneling-XX), некоторые выдержки из которого будут приводиться ниже. Этот документ описывает расширение протокола HTTP 1.x (не только 1.1, но и 1.0) для организации туннелирования TCP-based протоколов через веб-прокси. Теперь собственно о том, как это работает.
1. Клиент соединяется с HTTP Proxy, поддерживающим метод CONNECT.
2. Клиент посылает серверу строку вида "CONNECT target_host:target_port HTTP/1.x\r\nUser-Agent: User Agent\r\n"
3. В ответ на эту строку сервер может либо потребовать авторизацию, либо вернуть состояние удачного соединения либо ошибку.
вроде все просто, где чево не понимаю не могу найти. :confused: