diff options
| author | Carl Hetherington <cth@carlh.net> | 2025-02-02 15:44:59 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2025-02-02 21:20:33 +0100 |
| commit | 4d2cc8cf69cdbc35675ffbf6911ac83564418f43 (patch) | |
| tree | 28ecb1202c94b6616196979c443a65509854dbad | |
| parent | 9414bcc094b07ab2029f4d7897102abda71f0adc (diff) | |
Fix long delay in response to 2nd query from client.
We only accept one thing at a time, and firefox would make a request,
then 2nd request on a different connection. The 2nd request would not
be handled until the first had timed out waiting for a request that
never came.
| -rw-r--r-- | src/lib/http_server.cc | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/src/lib/http_server.cc b/src/lib/http_server.cc index fe181188a..c7cbd1cf1 100644 --- a/src/lib/http_server.cc +++ b/src/lib/http_server.cc @@ -223,33 +223,33 @@ HTTPServer::handle(shared_ptr<Socket> socket) boost::system::error_code _error_code; }; - while (true) { - - Reader reader; - - vector<uint8_t> buffer(2048); - socket->socket().async_read_some( - boost::asio::buffer(buffer.data(), buffer.size()), - [&reader, &buffer, socket](boost::system::error_code const& ec, std::size_t bytes_transferred) { - socket->set_deadline_from_now(1); - reader.read_block(ec, buffer.data(), bytes_transferred); - }); - - while (!reader.got_request() && !reader.close() && socket->is_open()) { - socket->run(); - } - - if (reader.got_request() && !reader.close()) { - try { - auto response = request(reader.get()); - response.send(socket); - } catch (runtime_error& e) { - LOG_ERROR_NC(e.what()); - } - } + Reader reader; + + vector<uint8_t> buffer(2048); + socket->set_deadline_from_now(2); + socket->socket().async_read_some( + boost::asio::buffer(buffer.data(), buffer.size()), + [&reader, &buffer, socket](boost::system::error_code const& ec, std::size_t bytes_transferred) { + reader.read_block(ec, buffer.data(), bytes_transferred); + }); + + while (!reader.got_request() && !reader.close() && socket->is_open()) { + socket->run(); + } - if (reader.close() || !socket->is_open()) { - break; + if (reader.got_request() && !reader.close()) { + try { + auto response = request(reader.get()); + response.send(socket); + } catch (runtime_error& e) { + LOG_ERROR_NC(e.what()); } } + + /* I think we should keep the socket open if the client requested keep-alive, but some browsers + * send keep-alive then don't re-use the connection. Since we can only accept one request at once, + * this blocks until our request read (above) times out. We probably should accept multiple + * requests in parallel, but it's easier for not to use close the socket. + */ + socket->close(); } |
