Показать сообщение отдельно

  #1  
Старый 14.08.2009, 13:07
WereWolfV
Новичок
Регистрация: 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..
 
Ответить с цитированием