我想编写一个响应 HTTP 请求的服务器。我不关心HTTPS。如果有人执行 HTTPS 请求,我想拒绝该请求并继续其他 HTTP 请求。我的代码如下所示:
#include <boost/asio.hpp>
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
#include <thread>
#include <iostream>
using namespace std;
int main(){
boost::asio::io_context ioc;
boost::asio::ip::tcp::acceptor acceptor(ioc, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), 8000));
boost::beast::flat_buffer request_buffer;
for(;;){
boost::asio::ip::tcp::socket socket(ioc);
acceptor.accept(socket);
boost::beast::http::request<boost::beast::http::string_body> request;
try{
boost::beast::http::read(socket, request_buffer, request);
cout << "OK" << endl;
boost::beast::http::response<boost::beast::http::string_body> response(boost::beast::http::status::ok, request.version());
std::string body = "hello";
response.content_length(body.size());
response.body() = std::move(body);
boost::beast::http::write(socket, response);
}catch(...){
cout << "BAD" << endl;
}
socket.close();
}
}
我使用 Firefox 运行代码并按以下顺序请求执行:
- 一个http请求
- https 请求
- 一个http请求
我期望以下服务器输出:
OK
BAD
OK
但是,我得到的是:
OK
BAD
BAD
BAD
BAD
BAD
BAD
BAD
BAD
BAD
BAD
BAD
BAD
抛出的函数是boost::beast::http::read
. 但是,我不明白为什么。在调用之间我创建了一个新的套接字对象,因此我的理解是第二个请求的结果不应该影响第三个。但是,显然我的理解是不正确的。有人可以解释一下我对 ASIO 和/或 BEAST 如何工作的理解是错误的。谢谢 :)