#include "http-server.h"
#include "llist.h"
-#define HTTP_SERVER_REQUEST_MAX_TARGET_LENGTH 4096
-
struct http_server_request;
struct http_server_connection;
+/*
+ * Defaults
+ */
+
+#define HTTP_SERVER_REQUEST_MAX_TARGET_LENGTH 4096
+
+/*
+ * Types
+ */
+
enum http_server_request_state {
/* New request; request header is still being parsed. */
HTTP_SERVER_REQUEST_STATE_NEW = 0,
HTTP_SERVER_REQUEST_STATE_ABORTED
};
+/*
+ * Objects
+ */
+
struct http_server_response {
struct http_server_request *request;
bool shutting_down:1; /* shutting down server */
};
+/*
+ * Forward declarations
+ */
+
+bool http_server_connection_pending_payload(
+ struct http_server_connection *conn);
+
+/*
+ * Response
+ */
+
+void http_server_response_free(struct http_server_response *resp);
+int http_server_response_send(struct http_server_response *resp,
+ const char **error_r);
+int http_server_response_send_more(struct http_server_response *resp,
+ const char **error_r);
+
+/*
+ * Request
+ */
+
static inline const char *
http_server_request_label(struct http_server_request *req)
{
req->req.method, req->req.target_raw);
}
-static inline const char *
-http_server_connection_label(struct http_server_connection *conn)
+static inline bool
+http_server_request_is_new(struct http_server_request *req)
{
- return conn->conn.name;
+ return (req->state == HTTP_SERVER_REQUEST_STATE_NEW);
}
-bool http_server_connection_pending_payload(struct http_server_connection *conn);
-
-
-/* response */
-
-void http_server_response_free(struct http_server_response *resp);
-int http_server_response_send(struct http_server_response *resp,
- const char **error_r);
-int http_server_response_send_more(struct http_server_response *resp,
- const char **error_r);
+static inline bool
+http_server_request_is_complete(struct http_server_request *req)
+{
+ return (req->failed || req->conn->input_broken ||
+ (req->next != NULL && !http_server_request_is_new(req->next)) ||
+ !http_server_connection_pending_payload(req->conn));
+}
-/* request */
+static inline bool
+http_server_request_version_equals(struct http_server_request *req,
+ unsigned int major, unsigned int minor) {
+ return (req->req.version_major == major && req->req.version_minor == minor);
+}
struct http_server_request *
http_server_request_new(struct http_server_connection *conn);
void http_server_request_ready_to_respond(struct http_server_request *req);
void http_server_request_finished(struct http_server_request *req);
-static inline bool
-http_server_request_is_new(struct http_server_request *req)
+/*
+ * connection
+ */
+
+static inline const char *
+http_server_connection_label(struct http_server_connection *conn)
{
- return (req->state == HTTP_SERVER_REQUEST_STATE_NEW);
+ return conn->conn.name;
}
-static inline bool
-http_server_request_is_complete(struct http_server_request *req)
+static inline void
+http_server_connection_add_request(struct http_server_connection *conn,
+ struct http_server_request *sreq)
{
- return (req->failed || req->conn->input_broken ||
- (req->next != NULL && !http_server_request_is_new(req->next)) ||
- !http_server_connection_pending_payload(req->conn));
+ DLLIST2_APPEND(&conn->request_queue_head, &conn->request_queue_tail, sreq);
+ conn->request_queue_count++;
}
-
-static inline bool
-http_server_request_version_equals(struct http_server_request *req,
- unsigned int major, unsigned int minor) {
- return (req->req.version_major == major && req->req.version_minor == minor);
+static inline void
+http_server_connection_remove_request(struct http_server_connection *conn,
+ struct http_server_request *sreq)
+{
+ DLLIST2_REMOVE(&conn->request_queue_head, &conn->request_queue_tail, sreq);
+ conn->request_queue_count--;
}
-/* connection */
-
struct connection_list *http_server_connection_list_init(void);
bool http_server_connection_shut_down(struct http_server_connection *conn);
int http_server_connection_discard_payload(
struct http_server_connection *conn);
-bool http_server_connection_pending_payload(struct http_server_connection *conn);
-
-static inline void http_server_connection_add_request(struct http_server_connection *conn,
- struct http_server_request *sreq)
-{
- DLLIST2_APPEND(&conn->request_queue_head, &conn->request_queue_tail, sreq);
- conn->request_queue_count++;
-}
-static inline void http_server_connection_remove_request(struct http_server_connection *conn,
- struct http_server_request *sreq)
-{
- DLLIST2_REMOVE(&conn->request_queue_head, &conn->request_queue_tail, sreq);
- conn->request_queue_count--;
-}
+bool http_server_connection_pending_payload(
+ struct http_server_connection *conn);
#endif