From c2080e598ec887ac7b087dbc287c42a14881d667 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 3 Feb 2014 00:25:41 +0100 Subject: [PATCH 1/1] Fix handling of streams with no data. The original plan here was to let the client hang until we had some headers to send (ie., first send an empty header and then 0 bytes data, and then send the client back from SENDING_DATA to SENDING_HEADER as we got data). However, as time went by, we started inserting stuff in the middle of the headers ourselves, resulting in us sending pretty much a junk header. Worse, this would be sent on to other relays, corrupting the version of the Metacube stream. Simply return 503 Not Available now instead if the stream is still starting up; it's pretty much as good, and has fewer edge cases to worry about. --- server.cpp | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/server.cpp b/server.cpp index ee91ed8..0938999 100644 --- a/server.cpp +++ b/server.cpp @@ -252,19 +252,6 @@ void Server::set_header(int stream_index, const string &http_header, const strin assert(stream_index >= 0 && stream_index < ssize_t(streams.size())); streams[stream_index]->http_header = http_header; streams[stream_index]->stream_header = stream_header; - - // If there are clients we haven't sent anything to yet, we should give - // them the header, so push back into the SENDING_HEADER state. - for (map::iterator client_it = clients.begin(); - client_it != clients.end(); - ++client_it) { - Client *client = &client_it->second; - if (client->state == Client::WAITING_FOR_KEYFRAME || - (client->state == Client::SENDING_DATA && - client->stream_pos == 0)) { - construct_header(client); - } - } } void Server::set_mark_pool(int stream_index, MarkPool *mark_pool) @@ -528,8 +515,13 @@ int Server::parse_request(Client *client) return 404; // Not found. } + Stream *stream = streams[url_map_it->second]; + if (stream->http_header.empty()) { + return 503; // Service unavailable. + } + client->url = request_tokens[1]; - client->stream = streams[url_map_it->second]; + client->stream = stream; if (client->stream->mark_pool != NULL) { client->fwmark = client->stream->mark_pool->get_mark(); } else { -- 2.39.2