为什么 Boost.Asio SSL 请求 returns 405 不允许?

Why Boost.Asio SSL request returns 405 Not Allowed?

我试图通过 these code 仅使用 Boost.Asio(不是 Network.Ts 或 Beast 或其他)向服务器发送 HTTPS 请求并接收页面内容:

#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
#include <iostream>

int main() {
    boost::system::error_code ec;
    using namespace boost::asio;

    // what we need
    io_service svc;
    ssl::context ctx(ssl::context::method::tlsv1);
    ssl::stream<ip::tcp::socket> ssock(svc, ctx);

    ip::tcp::endpoint endpoint(boost::asio::ip::make_address("157.90.94.153",ec),443);

    ssock.lowest_layer().connect(endpoint); 

    ssock.handshake(ssl::stream_base::handshake_type::client);

    // send request
    std::string request("GET /index.html HTTP/1.1\r\n\r\n");
    boost::asio::write(ssock, buffer(request));

    // read response
    std::string response;

    do {
        char buf[1024];
        size_t bytes_transferred = ssock.read_some(buffer(buf), ec);
        if (!ec) response.append(buf, buf + bytes_transferred);
    } while (!ec);

    // print and exit
    std::cout << "Response received: '" << response << "'\n";
}

但我在本地 PC 上不断收到 405 Not Allowed,在 Coliru 上收到 400 Bad Request

我做错了什么?

... "GET /index.html HTTP/1.1\r\n\r\n"

这不是有效的 HTTP/1.1 请求。它至少还必须包含一个 Host 字段,并且该字段的值必须符合服务器的期望,即

   "GET /index.html HTTP/1.1\r\nHost: example.com\r\n\r\n"

总的来说,HTTP 可能看起来很简单,但实际上很复杂并且有几个陷阱。如果你真的需要自己做HTTP,请学习标准。