summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-02-02 15:44:59 +0100
committerCarl Hetherington <cth@carlh.net>2025-02-02 21:20:33 +0100
commit4d2cc8cf69cdbc35675ffbf6911ac83564418f43 (patch)
tree28ecb1202c94b6616196979c443a65509854dbad
parent9414bcc094b07ab2029f4d7897102abda71f0adc (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.cc52
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();
}