]> git.sesse.net Git - cubemap/blobdiff - server.cpp
Add missing postcondition comment.
[cubemap] / server.cpp
index 01ed0ff041697ce1894c16652b374c66881e92f3..99a3925e13f0bca65531f82902012408e0b5556c 100644 (file)
@@ -217,9 +217,15 @@ void Server::add_client(int sock)
        assert(ret.second == true);  // Should not already exist.
        Client *client_ptr = &ret.first->second;
 
-       // Connection timestamps must be nondecreasing.
-       assert(clients_ordered_by_connect_time.empty() ||
-              !is_earlier(client_ptr->connect_time, clients_ordered_by_connect_time.back().first));
+       // Connection timestamps must be nondecreasing. I can't find any guarantee
+       // that even the monotonic clock can't go backwards by a small amount
+       // (think switching between CPUs with non-synchronized TSCs), so if
+       // this actually should happen, we hack around it by fudging
+       // connect_time.
+       if (!clients_ordered_by_connect_time.empty() &&
+           is_earlier(client_ptr->connect_time, clients_ordered_by_connect_time.back().first)) {
+               client_ptr->connect_time = clients_ordered_by_connect_time.back().first;
+       }
        clients_ordered_by_connect_time.push(make_pair(client_ptr->connect_time, sock));
 
        // Start listening on data from this socket.
@@ -311,6 +317,13 @@ void Server::set_backlog_size(int stream_index, size_t new_size)
        assert(stream_index >= 0 && stream_index < ssize_t(streams.size()));
        streams[stream_index]->set_backlog_size(new_size);
 }
+
+void Server::set_prebuffering_bytes(int stream_index, size_t new_amount)
+{
+       MutexLock lock(&mutex);
+       assert(stream_index >= 0 && stream_index < ssize_t(streams.size()));
+       streams[stream_index]->prebuffering_bytes = new_amount;
+}
        
 void Server::set_encoding(int stream_index, Stream::Encoding encoding)
 {
@@ -482,6 +495,7 @@ sending_header_or_error_again:
                assert(bytes_to_send <= stream->backlog_size);
                if (bytes_to_send < stream->prebuffering_bytes) {
                        // We don't have enough bytes buffered to start this client yet.
+                       // This is postcondition #3.
                        stream->put_client_to_sleep(client);
                        return;
                }
@@ -565,6 +579,18 @@ int Server::parse_request(Client *client)
                return 400;  // Bad request (empty).
        }
 
+       // Parse the headers, for logging purposes.
+       // TODO: Case-insensitivity.
+       multimap<string, string> headers = extract_headers(lines, client->remote_addr);
+       multimap<string, string>::const_iterator referer_it = headers.find("Referer");
+       if (referer_it != headers.end()) {
+               client->referer = referer_it->second;
+       }
+       multimap<string, string>::const_iterator user_agent_it = headers.find("User-Agent");
+       if (user_agent_it != headers.end()) {
+               client->user_agent = user_agent_it->second;
+       }
+
        vector<string> request_tokens = split_tokens(lines[0]);
        if (request_tokens.size() < 2) {
                return 400;  // Bad request (empty).
@@ -592,6 +618,7 @@ int Server::parse_request(Client *client)
        }
 
        client->url = request_tokens[1];
+
        client->stream = stream;
        if (setsockopt(client->sock, SOL_SOCKET, SO_MAX_PACING_RATE, &client->stream->pacing_rate, sizeof(client->stream->pacing_rate)) == -1) {
                if (client->stream->pacing_rate != ~0U) {