+
+ // Process a client; read and write data as far as we can.
+ // After this call, one of these four is true:
+ //
+ // 1. The socket is closed, and the client deleted.
+ // 2. We are still waiting for more data from the client.
+ // 3. We've sent all the data we have to the client,
+ // and put it in <sleeping_clients>.
+ // 4. The socket buffer is full (which means we still have
+ // data outstanding).
+ //
+ // For #2, we listen for EPOLLIN events. For #3 and #4, we listen
+ // for EPOLLOUT in edge-triggered mode; it will never fire for #3,
+ // but it's cheaper than taking it in and out all the time.
+ void process_client(Client *client);
+
+ // Close a given client socket, and clean up after it.
+ void close_client(Client *client);
+
+ // Parse the HTTP request. Returns a HTTP status code (200/400/404).
+ int parse_request(Client *client);
+
+ // Construct the HTTP header, and set the client into
+ // the SENDING_HEADER state.
+ void construct_header(Client *client);
+
+ // Construct a generic error with the given line, and set the client into
+ // the SENDING_ERROR state.
+ void construct_error(Client *client, int error_code);
+
+ // TODO: This function should probably die.
+ Stream *find_stream(const std::string &stream_id);
+
+ void process_queued_data();
+
+ void add_client(int sock);
+ void add_data(const std::string &stream_id, const char *data, size_t bytes);