
14.08.2009, 13:07
|
|
Новичок
Регистрация: 17.04.2009
Сообщений: 3
С нами:
8982919
Репутация:
0
|
|
Всем привет. Пробую писать свой HTTP клиент на сокетах. Тестить решил на mail.ru, страницу принимает, POST запрос отправляет. Но на попытку авторизации выдает страницу 302. Снифал все со своего браузера (Opera 9.64) заголовки запросов списал с него. POST запросы у программы и браузера идентичные, но через браузер авторизируется, а через прогу получаю страницу 302.
Алгоритм тестирования: отправляю GET запрос на главную страницу mail.ru, получаю куки, вставляю эти куки в POST запрос с логином и паролем, отсылаю его. (куки полученые после GET вставляю вручную через TEdit)
Помогите, кто знает из-за чего не идет авторизация.
Вот код:
Код:
type
THTTPClientForm = class(TForm)
Memo1: TMemo;
Label1: TLabel;
URL: TLabel;
EdURL: TEdit;
Button1: TButton;
Edit3: TEdit;
Label4: TLabel;
Memo2: TMemo;
EditMpopl: TEdit;
EditMrcu: TEdit;
procedure Button1Click(Sender: TObject);
Function GetWEBpage(addr:string; Method:integer):TStringList;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure EdURLKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
HTTPClientForm: THTTPClientForm;
SendBuff:string;
POST:string;
implementation
uses unit2;
{$R *.dfm}
procedure THTTPClientForm.Button1Click(Sender: TObject);
begin
Memo1.Lines.Assign(GetWebPage(edURL.text, StrToInt(Edit3.Text)));
end;
Function THTTPClientForm.GetWEBPage;
var
localaddr : sockaddr_in;
iMode, iSize:integer;
rfds: TFDSET;
Buff: array [0..1024] of char;
stClient:TSocket;
testingserver, servername, portname:string;
timeout:TTimeVal;
begin
Result:=TStringList.Create;
stClient:=socket(AF_INET, SOCK_STREAM, 0);
if stClient=INVALID_SOCKET then
begin
messageBox(0, 'Ошибка инициализации сокета', 'Error', MB_OK);
exit;
end;
ServerName:='mail.ru';
PortName:='80';
localaddr.sin_addr:=LookUpName(servername);
localaddr.sin_family:=AF_INET;
localaddr.sin_port:=htons(StrToIntDef(portname, 80));
if connect(stClient, @localaddr, sizeof(localaddr))<>0 then
begin
messageBox(0, 'Ошибка соединения', 'Error', MB_OK);
exit;
end;
SendBuff:='';
if method=1 then
SendBuff:=
'GET / HTTP/1.1'#13+
'User-Agent: Opera/9.64 (Windows NT 5.1; U; ru) Presto/2.1.1'#13+
'Host: www.mail.ru'#13+
'Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1'#13+
'Accept-Language: ru-RU,ru;q=0.9,en;q=0.8'#13+
'Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1'#13+
'Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0'#13+
'If-Modified-Since: Fri, 14 Aug 2009 11:18:57 GMT'#13+
'Connection: Keep-Alive, TE'#13+
'TE: deflate, gzip, chunked, identity, trailers'#13#13;
if method=2 then
begin
POST:='Login=UserLogin+&Domain=mail.ru&Password=UserPassword';
SendBuff:=
'POST /cgi-bin/auth HTTP/1.1'#13+
'User-Agent: Opera/9.64 (Windows NT 5.1; U; ru) Presto/2.1.1'#13+
'Host: win.mail.ru'#13+
'Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1'#13+
'Accept-Language: ru-RU,ru;q=0.9,en;q=0.8'#13+
'Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1'#13+
'Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0'#13+
'Referer: http://www.mail.ru/'#13+
'Cookie: Mpopl='+EditMpopl.Text+'; mrcu='+EditMrcu.Text+';'#13+
'Cookie2: $Version=1'#13+
'Connection: Keep-Alive, TE'#13+
'TE: deflate, gzip, chunked, identity, trailers'#13+
'Content-Length: '+IntToStr(Length(POST))+#13+
'Content-Type: application/x-www-form-urlencoded'#13#13+POST;
end;
Memo2.Lines.Clear;
Memo2.Lines.Add(SendBuff);
SendStr(stClient,SendBuff);
iMode:=1;
setsockopt(stClient, IPPROTO_TCP, TCP_NODELAY, @iMode, sizeof(integer));
while true do
begin
FD_ZERO(rfds);
FD_SET(stClient, rfds);
timeout.tv_sec:=10;
if (select(0, @rfds, nil, nil, @timeout)<=0) then
exit;
if (FD_ISSET(stClient, rfds)) then
begin
iSize:=recv(stClient, buff, sizeof(buff), 0);
if (iSize<1) then
break;
Result.Add(String(buff));
end;
end;
CloseSocket(stClient);
end;
procedure THTTPClientForm.FormCreate(Sender: TObject);
var SockInit:TWSADATA;
begin
WSAStartUp(makeword(2,0), SockInit)
end;
Последний раз редактировалось WereWolfV; 14.08.2009 в 13:10..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|