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.
assert(stream_index >= 0 && stream_index < ssize_t(streams.size()));
streams[stream_index]->http_header = http_header;
streams[stream_index]->stream_header = stream_header;
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<int, Client>::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)
}
void Server::set_mark_pool(int stream_index, MarkPool *mark_pool)
return 404; // Not found.
}
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->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 {
if (client->stream->mark_pool != NULL) {
client->fwmark = client->stream->mark_pool->get_mark();
} else {