]> git.sesse.net Git - cubemap/blobdiff - server.cpp
Add a missing #include.
[cubemap] / server.cpp
index 40f3b48afe71425cfa6b0e9f00bdcdeb0a73aa55..ccac946726bf9710946ebb3a5612386ab0690e62 100644 (file)
@@ -1,6 +1,7 @@
 #include <assert.h>
 #include <errno.h>
 #include <inttypes.h>
+#include <limits.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
 #include <pthread.h>
@@ -748,6 +749,22 @@ sending_data_again:
        }
 }
 
+namespace {
+
+void flush_pending_data(int sock)
+{
+       // Flush pending data, which would otherwise wait for the 200ms TCP_CORK timer
+       // to elapsed; does not cancel out TCP_CORK (since that still takes priority),
+       // but does a one-off flush.
+       int one = 1;
+       if (setsockopt(sock, SOL_TCP, TCP_NODELAY, &one, sizeof(one)) == -1) {
+               log_perror("setsockopt(TCP_NODELAY)");
+               // Can still continue.
+       }
+}
+
+}  // namespace
+
 bool Server::send_pending_tls_data(Client *client)
 {
        // See if there's data from the TLS library to write.
@@ -780,9 +797,15 @@ send_data_again:
                return true;
        }
        if (ret > 0 && size_t(ret) == client->tls_data_left_to_send) {
-               // All data has been sent, so we don't need to go to sleep.
+               // All data has been sent, so we don't need to go to sleep
+               // (although we are likely to do so immediately afterwards,
+               // due to lack of client data).
                tls_buffer_clear(client->tls_context);
                client->tls_data_to_send = nullptr;
+
+               // Flush the data we just wrote, since the client probably
+               // is waiting for it.
+               flush_pending_data(client->sock);
                return false;
        }
 
@@ -911,8 +934,7 @@ int Server::parse_request(Client *client)
        }
 
        // Parse the headers, for logging purposes.
-       // TODO: Case-insensitivity.
-       unordered_multimap<string, string> headers = extract_headers(lines, client->remote_addr);
+       HTTPHeaderMultimap headers = extract_headers(lines, client->remote_addr);
        const auto referer_it = headers.find("Referer");
        if (referer_it != headers.end()) {
                client->referer = referer_it->second;
@@ -1291,13 +1313,7 @@ bool Server::more_requests(Client *client)
        // Log to access_log.
        access_log->write(client->get_stats());
 
-       // Flush pending data; does not cancel out TCP_CORK (since that still takes priority),
-       // but does a one-off flush.
-       int one = 1;
-       if (setsockopt(client->sock, SOL_TCP, TCP_NODELAY, &one, sizeof(one)) == -1) {
-               log_perror("setsockopt(TCP_NODELAY)");
-               // Can still continue.
-       }
+       flush_pending_data(client->sock);
 
        // Switch states and reset the parsers. We don't reset statistics.
        client->state = Client::READING_REQUEST;