Delphi - http post через winsock

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Fedcomp, 13 Feb 2010.

  1. Fedcomp

    Fedcomp New Member

    Joined:
    20 Sep 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Всем привет, пишу программу для логина на сайте. Но проблема в двух вещах :
    1. я очень плохо знаю винсок (кучу примеров скачивал но их очень трудно разобрать)
    2. Нужно отправить сразу два http post запроса на два разных url (192.168.1.48/login.php и 192.168.1.48/auth.php, такая там мудренная система логина через ajax)
    Пока получилось на локальном компьютере лишь это :
    [​IMG]

    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     s:TSocket;
     Ws:TWSAData;
     addr:sockaddr_in;
     se,re:ansistring;
     login:string;
     buf: array[1..5000] of Char;
    begin
     Memo1.Lines.Add('Подкл. WinSock');
     if WSAStartup($101,Ws)=-1 then
      begin
       Memo1.Lines.Add('-Ошибка');
       exit;
      end
     else
      begin
       Memo1.Lines.Add('-Ок');
      end;
     Memo1.Lines.Add('Создание сокета');
     s:=socket(af_inet, sock_stream, 0);
     if s=-1 then
      begin
       Memo1.Lines.Add('-Ошибка');
       exit;
      end
     else
      begin
       Memo1.Lines.Add('-Ок');
      end;
     addr.sin_family:=af_inet;
     addr.sin_port:=htons(80);
     addr.sin_addr.S_addr:=inet_addr('127.0.0.1');
     Memo1.Lines.Add('Установка связи с хостом');
     if connect(s,addr,sizeof(addr))=-1 then
      begin
       Memo1.Lines.Add('-Ошибка');
       closesocket(s);
       exit;
      end
     else
      begin
       Memo1.Lines.Add('-Ок');
      end;
     login:='SAVEURL=&SERVER=1&account=111&pass=222&submit=%C2%EE%E9%F2%E8';
     se:=memo3.text+#13#10+#13#10;
     CopyMemory(@buf, PChar(se), Length(se));
     send(s,buf,SizeOf(buf),0);
     recv(s,buf,SizeOf(buf),0);
     re:=buf;
     Memo2.Text:=re;
     closesocket(s);
    
    end;
    Как видно на скриншоте, сервер не понимает мой запрос. Запрос брал из firefox'а через аддон httpfox
     
  2. Fedcomp

    Fedcomp New Member

    Joined:
    20 Sep 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Code:
    POST /bl.php HTTP/1.1
    Host: 127.0.0.1
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ru,en-us;q=0.7,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://127.0.0.1/bl.php
    Cookie: collapseprefs=debug; rte-sidepanel=open; anonlogin=-1; member_id=1; hide_sidebar=1; gmpl_ogame=1+Pizoren90+60788e255743c74f1c32955de4be94b2+1;
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 16
    Это запрос который пытаюсь отправить
     
  3. rikko

    rikko Member

    Joined:
    23 Nov 2009
    Messages:
    16
    Likes Received:
    7
    Reputations:
    0
    Fedcomp, запрос должен быть такой:
    Code:
    
    'POST /bl.php HTTP/1.1'#13#10+
    'Host: 127.0.0.1'#13#10+
    'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7'#13#10+
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'#13#10+
    'Accept-Language: ru,en-us;q=0.7,en;q=0.3'#13#10+
    'Accept-Encoding: gzip,deflate'#13#10+
    'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'#13#10+
    'Keep-Alive: 300'#13#10+
    'Connection: keep-alive'#13#10+
    'Referer: http://127.0.0.1/bl.php'#13#10+
    'Cookie: collapseprefs=debug; rte-sidepanel=open; anonlogin=-1; member_id=1; hide_sidebar=1; gmpl_ogame=1+Pizoren90+60788e255743c74f1c32955de4b  e94b2+1;'#13#10+
    'Content-Type: application/x-www-form-urlencoded'#13#10+
    'Content-Length: 16'#13#10#13#10+
    '[COLOR=DarkOrange]SAVEURL=&SERVER=1&account=111&pass=222&submit=%C2%EE%E9%F2%E8[/COLOR]'#13#10
    ты не посылаешь часть, что выделена оранжевым, судя по твоему примеру. это и есть сам пост запрос.
    плюс проверь все переносы строк и их количество.
    'Content-Length: 16' - у тебя он не 16 равен, на самом деле
     
    #3 rikko, 13 Feb 2010
    Last edited: 13 Feb 2010
  4. Fedcomp

    Fedcomp New Member

    Joined:
    20 Sep 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Code:
    POST /bl.php HTTP/1.1
    Host: 127.0.0.1
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ru,en-us;q=0.7,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://127.0.0.1/bl.htm
    Cookie: testcookie=1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 0
    Такой тоже не прокатывает.
    Получается интересный результат - Веб сервер выдает мне вот это
    Code:
    HTTP/1.1 200 OK
    Date: Sat, 13 Feb 2010 17:59:32 GMT
    Server: Apache/2.2.13 (Win32) PHP/5.2.10
    X-Powered-By: PHP/5.2.10
    Content-Length: 42
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Content-Type: text/html
    
    Array
    (
    )
    Array
    (
        [testcookie] => 1
    )
    HTTP/1.1 400 Bad Request
    Date: Sat, 13 Feb 2010 17:59:32 GMT
    Server: Apache/2.2.13 (Win32) PHP/5.2.10
    Content-Length: 395
    Connection: close
    Content-Type: text/html; charset=iso-8859-1
    
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    Request header field is missing ':' separator.<br />
    <pre>
    &lt;link rel=&quot;shortcut icon&quot; href=&quot;favicon.ico&quot; type=&quot;image/x-icon&quot; /&gt;</pre>
    </p>
    </body></html>
    <script type="text/javascript" src="jscripts/reflection.js"></script>
    </head> 
    <body>
    <iframe width="100%" height="15" scrolling="no" frameborder="0" marginwidth="0" marginheight="0"></iframe>
    <div id="ipbwrapper"><div id="ipbwrapper2"><div id="ipbwrapper3">
    <center><!--ipb.javascript.start-->
    Выдает мне html от запрошенной страницы, а дальше выдает ещё и html главной. Не пойму в чем проблема?
     
  5. rikko

    rikko Member

    Joined:
    23 Nov 2009
    Messages:
    16
    Likes Received:
    7
    Reputations:
    0
    как это может работать, если ты не шлешь данные POST? Ты хочешь сделать, чтоб работала прогрмма твоя или исследовать ответы сервера на неправильные запросы? не морочь любдя голову.
     
  6. Fedcomp

    Fedcomp New Member

    Joined:
    20 Sep 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Ну для начала надо чтобы программа просто посылала post запрос на сервер, и получала ответ, а не плевалась.
    Я не знаю откуда брать размер для Content-Length: 0
     
  7. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Описание протокола "http" в руки! Ибо отправить то не знаю что -> глупо
    Размер Content-Length -> число букв того после "Content-Length"

    в данном случае буквы у нас эти:
    SAVEURL=&SERVER=1&account=111&pass=222&submit=%C2%EE%E9%F2%E8
     
  8. Fedcomp

    Fedcomp New Member

    Joined:
    20 Sep 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Так, действительно сглупил, забыл отправить post данные отправил только пакет)
    Теперь проблема осталась только в том, что я получаю html от моего .php скрипта, а следом за ним html главной страницы (Причем http ответ только один, раньше их было 2, второй был 400 т.е ошибочный запрос)
    Сам post запрос
    Code:
    POST /bl.php HTTP/1.1
    Host: 127.0.0.1
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ru,en-us;q=0.7,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://127.0.0.1/bl.htm
    Cookie: testcookie=1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 61
    
    SAVEURL=&SERVER=1&account=111&pass=222&submit=%C2%EE%E9%F2%E8
    Теперь он точный
    Вот что получается
    [​IMG]