]> git.sesse.net Git - cubemap/blobdiff - server.h
Support parsing streams from config file. Also support multiple streams (includes...
[cubemap] / server.h
index 7d94e17b76fa811fb8e98c927bafd81e4c265fb0..cc1b78dd2a6a95da7fd7e4ec9819714c2170518c 100644 (file)
--- a/server.h
+++ b/server.h
@@ -3,10 +3,11 @@
 
 #include <stdint.h>
 #include <pthread.h>
+#include <sys/epoll.h>
 #include <string>
 #include <map>
+#include <vector>
 
-#define NUM_SERVERS 4
 #define BACKLOG_SIZE 1048576
 #define EPOLL_MAX_EVENTS 8192
 #define EPOLL_TIMEOUT_MS 20
@@ -27,7 +28,7 @@ struct Client {
        // The file descriptor associated with this socket.
        int sock;
 
-       enum State { READING_REQUEST, SENDING_HEADER, SENDING_DATA };
+       enum State { READING_REQUEST, SENDING_HEADER, SENDING_DATA, SENDING_ERROR };
        State state;
 
        // The HTTP request, as sent by the client. If we are in READING_REQUEST,
@@ -40,11 +41,12 @@ struct Client {
 
        // The header we want to send. This is nominally a copy of Stream::header,
        // but since that might change on reconnects etc., we keep a local copy here.
-       // Only relevant for SENDING_HEADER; blank otherwise.
-       std::string header;
+       // Only relevant for SENDING_HEADER or SENDING_ERROR; blank otherwise.
+       std::string header_or_error;
 
-       // Number of bytes we've sent of the header. Only relevant for SENDING_HEADER.
-       size_t header_bytes_sent;
+       // Number of bytes we've sent of the header. Only relevant for SENDING_HEADER
+       // or SENDING_ERROR.
+       size_t header_or_error_bytes_sent;
 
        // Number of bytes we've sent of data. Only relevant for SENDING_DATA.
        size_t bytes_sent;
@@ -131,13 +133,17 @@ private:
        // Close a given client socket, and clean up after it.
        void close_client(Client *client);
 
-       // Parse the HTTP request.
-       void parse_request(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);
+
        // Put client to sleep, since there is no more data for it; we will on
        // longer listen on POLLOUT until we get more data. Also, it will be put
        // in the list of clients to wake up when we do.