1

https経由でPOSTを送信する際に問題が発生しました。上記のコードスニペットでは、最初の部分(コメント付き)が適切に機能します。次の部分は送信しません。リクエストを送信しません。何を修正する必要がありますか?

Psおそらく、私のLibBoostがHTTPSをサポートしていないという事実から問題が発生します。

    #include "stdafx.h"
    #include <iostream>
    #include <boost/asio.hpp>
    #include <conio.h>
    #include <stdio.h>
    #include <fstream>

    char buffer [9999999];

    int main()
    {
        boost::asio::ip::tcp::iostream stream;
        stream.expires_from_now(boost::posix_time::seconds(60));
        stream.connect("www.mail.ru","http");
        //stream << "GET / HTTP/1.1\r\n";
        //stream << "Host mail.ru\r\n";
        //stream << "User-Agent   Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11\r\n";
        //stream << "Accept   text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" ;
        //stream << "Accept-Encoding  gzip,deflate,sdch\r\n";
        //stream << "Accept-Language  en-US,en;q=0.8\r\n";
        //stream <<"Accept-Charset    ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n";
        //stream << "Cookie   \r\n\r\n";

    stream << "POST https://auth.mail.ru/cgi-bin/auth HTTP/1.1\r\n";
    stream << "Host: auth.mail.ru\r\n";
    stream << "User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1\r\n";
    stream << "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
    stream << "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
    stream << "Accept-Encoding: gzip, deflate\r\n";
    stream << "Connection: keep-alive\r\n";
    stream << "Referer: http://mail.ru/\r\n";
    stream << "X-MailRuSputnik: generic\r\n";
    stream << "Content-Type: application/x-www-form-urlencoded\r\n";
    stream << "Content-Length: 59\r\n";

    stream << "Domain=mail.ru&Login=(login)&Password=(password)&level=0\r\n";

        stream.flush();
        using namespace std ;
     // cout << stream.rdbuf();
        ofstream f("output.txt" /*| ios::bin*/);
        f << stream.rdbuf();
        f.close();
        system("pause");
        return 0 ;
    }
4

1 に答える 1

8

コードにはいくつかの問題があります。

1)POST代わりにホスト相対パスのみを指定する必要がある場合、行は完全な URL を指定しています。その行に URL スキームまたはホスト名を指定しないでください。これは、プロキシに接続する場合にのみ必要です。

stream << "POST /cgi-bin/auth HTTP/1.1\r\n";

2) HTTP ヘッダーは 2 つの連続した CRLF ペアで終了しますが、コードはContent-Lengthヘッダーと本文データの間で 1 つの CRLF ペアのみを送信し、本文データは 1 つの CRLF ペア (必要ありません) で終わるだけなので、 HTTP リクエストの送信が終了したときに、サーバーに通知するものは何もありません。

stream << "Content-Length: 59\r\n"; 
stream << "\r\n"; // <-- add this

3)Content-Lengthヘッダーの値は59ですが、表示された本文データの長さは代わりに 58 です。これにより、サーバーは実際に送信するよりも多くのバイトを読み取ろうとし、応答が送信されないようにします (サーバーが受信タイムアウトを実装し、エラー応答を返すことができる場合を除く)。本文データを a に入れ、std::stringそのメソッドを使用して、ハードコーディングするのではなくlength()、正しい値を動的に入力することをお勧めします。Content-Length

std::string content = "Domain=mail.ru&Login=(login)&Password=(password)&level=0";
...
stream << "Content-Length: " << content.length() << "\r\n";
stream << "\r\n";

stream << content;
于 2012-07-12T23:52:17.637 に答える