为什么 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,请学习标准。
我试图通过 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,请学习标准。