http-server-private.h revision a5886aec87fbfd767a110e6168ce96411acfe798
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen#ifndef HTTP_SERVER_PRIVATE_H
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#define HTTP_SERVER_PRIVATE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include "connection.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "iostream-pump.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include "http-server.h"
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen#include "llist.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstruct http_server_payload_handler;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstruct http_server_request;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstruct http_server_connection;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen/*
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen * Defaults
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#define HTTP_SERVER_REQUEST_MAX_TARGET_LENGTH 4096
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen/*
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen * Types
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenenum http_server_request_state {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* New request; request header is still being parsed. */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen HTTP_SERVER_REQUEST_STATE_NEW = 0,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Queued request; callback to request handler executing. */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen HTTP_SERVER_REQUEST_STATE_QUEUED,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Reading request payload; request handler still needs to read more
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen payload. */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen HTTP_SERVER_REQUEST_STATE_PAYLOAD_IN,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* This request is being processed; request payload is fully read, but no
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen response is yet submitted */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen HTTP_SERVER_REQUEST_STATE_PROCESSING,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* A response is submitted for this request. If not all request payload
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen was read by the handler, it is first skipped on the input.
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen HTTP_SERVER_REQUEST_STATE_SUBMITTED_RESPONSE,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Request is ready for response; a response is submitted and the request
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen payload is fully read */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen HTTP_SERVER_REQUEST_STATE_READY_TO_RESPOND,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* The response for the request is sent (apart from payload) */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen HTTP_SERVER_REQUEST_STATE_SENT_RESPONSE,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Sending response payload to client */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen HTTP_SERVER_REQUEST_STATE_PAYLOAD_OUT,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Request is finished; still lingering due to references */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen HTTP_SERVER_REQUEST_STATE_FINISHED,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Request is aborted; still lingering due to references */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen HTTP_SERVER_REQUEST_STATE_ABORTED
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen};
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen/*
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen * Objects
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstruct http_server_payload_handler {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_request *req;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen void (*switch_ioloop)(struct http_server_payload_handler *handler);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen void (*destroy)(struct http_server_payload_handler *handler);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool in_callback:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen};
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstruct http_server_response {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_request *request;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen unsigned int status;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char *reason;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen string_t *headers;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen time_t date;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen ARRAY_TYPE(http_auth_challenge) auth_challenges;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct istream *payload_input;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen uoff_t payload_size, payload_offset;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct ostream *payload_output;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct ostream *blocking_output;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen http_server_tunnel_callback_t tunnel_callback;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen void *tunnel_context;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool have_hdr_connection:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool have_hdr_date:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool have_hdr_body_spec:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool payload_chunked:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool payload_blocking:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool payload_direct:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool payload_corked:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool submitted:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen};
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstruct http_server_request {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_request req;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen pool_t pool;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen unsigned int refcount;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen unsigned int id;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen int callback_refcount;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen enum http_server_request_state state;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_request *prev, *next;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server *server;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_connection *conn;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct istream *payload_input;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_response *response;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen void (*destroy_callback)(void *);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen void *destroy_context;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool payload_halted:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool sent_100_continue:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool delay_destroy:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool destroy_pending:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool failed:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool connection_close:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen};
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstruct http_server_connection {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct connection conn;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server *server;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen unsigned int refcount;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const struct http_server_callbacks *callbacks;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen void *context;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen unsigned int id; // DEBUG
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct timeout *to_input, *to_idle;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct ssl_iostream *ssl_iostream;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_request_parser *http_parser;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_request *request_queue_head, *request_queue_tail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen unsigned int request_queue_count;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct istream *incoming_payload;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_payload_handler *payload_handler;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct io *io_resp_payload;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen char *disconnect_reason;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_stats stats;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool ssl:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool closed:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool close_indicated:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool input_broken:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool output_locked:1;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool in_req_callback:1; /* performing request callback (busy) */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool switching_ioloop:1; /* in the middle of switching ioloop */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen};
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstruct http_server {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen pool_t pool;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_settings set;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct ioloop *ioloop;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct ssl_iostream_context *ssl_ctx;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct connection_list *conn_list;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen bool shutting_down:1; /* shutting down server */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen};
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/*
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen * Response
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen */
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid http_server_response_free(struct http_server_response *resp);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint http_server_response_send(struct http_server_response *resp,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char **error_r);
4dc8837ab37c1a606add1067e21ed868754db4e3Timo Sirainenint http_server_response_send_more(struct http_server_response *resp,
8e5fedd9ada47735be8ac0f8af2a66e8528bd776Timo Sirainen const char **error_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/*
e8bdf1be00aec45d0c6dd72ad9c8be02a3dfc778Timo Sirainen * Request
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic inline const char *
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenhttp_server_request_label(struct http_server_request *req)
2abfef71398a61e5ed97c23a1ceb71461933ccb8Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (req->req.method == NULL) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (req->req.target_raw == NULL)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return t_strdup_printf("[Req%u: <NEW>]", req->id);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return t_strdup_printf("[Req%u: %s <INCOMPLETE>]",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen req->id, req->req.method);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen return t_strdup_printf("[Req%u: %s %s]", req->id,
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen req->req.method, req->req.target_raw);
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen}
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainenstatic inline bool
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainenhttp_server_request_is_new(struct http_server_request *req)
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen{
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen return (req->state == HTTP_SERVER_REQUEST_STATE_NEW);
cbf7138b49d32fce0645dc6523fbb42cc07cb2faTimo Sirainen}
cbf7138b49d32fce0645dc6523fbb42cc07cb2faTimo Sirainen
b9b48aaaebf6f72dfab567cda073cde8a7b26598Timo Sirainenstatic inline bool
b9b48aaaebf6f72dfab567cda073cde8a7b26598Timo Sirainenhttp_server_request_version_equals(struct http_server_request *req,
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen unsigned int major, unsigned int minor) {
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen return (req->req.version_major == major && req->req.version_minor == minor);
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen}
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainenstruct http_server_request *
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainenhttp_server_request_new(struct http_server_connection *conn);
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainenvoid http_server_request_destroy(struct http_server_request **_req);
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainenvoid http_server_request_abort(struct http_server_request **_req,
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen const char *reason) ATTR_NULL(2);
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainenbool http_server_request_is_complete(struct http_server_request *req);
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainenvoid http_server_request_halt_payload(struct http_server_request *req);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid http_server_request_continue_payload(struct http_server_request *req);
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid http_server_request_submit_response(struct http_server_request *req);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainenvoid http_server_request_ready_to_respond(struct http_server_request *req);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenvoid http_server_request_finished(struct http_server_request *req);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen
d4dcb9c30dba354cff7af6d303ecef7698194c55Timo Sirainen/* payload handler */
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainen
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainenvoid http_server_payload_handler_destroy(
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainen struct http_server_payload_handler **_handler);
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainenvoid http_server_payload_handler_switch_ioloop(
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct http_server_payload_handler *handler);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
9c7e765845357342923e16351181091028e5930fTimo Sirainen/*
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen * connection
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen */
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainenstatic inline const char *
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainenhttp_server_connection_label(struct http_server_connection *conn)
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen{
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen return conn->conn.name;
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen}
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenstatic inline void
b00787191c3c31bebb939c3d00f1fcdb67356c69Timo Sirainenhttp_server_connection_add_request(struct http_server_connection *conn,
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen struct http_server_request *sreq)
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen{
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen DLLIST2_APPEND(&conn->request_queue_head, &conn->request_queue_tail, sreq);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen conn->request_queue_count++;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen}
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenstatic inline void
ee116df08d0fdab703483e18fe8076b2ef9fd9d7Timo Sirainenhttp_server_connection_remove_request(struct http_server_connection *conn,
ee116df08d0fdab703483e18fe8076b2ef9fd9d7Timo Sirainen struct http_server_request *sreq)
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen{
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen DLLIST2_REMOVE(&conn->request_queue_head, &conn->request_queue_tail, sreq);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen conn->request_queue_count--;
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen}
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenstruct connection_list *http_server_connection_list_init(void);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenbool http_server_connection_shut_down(struct http_server_connection *conn);
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainen
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainenvoid http_server_connection_switch_ioloop(struct http_server_connection *conn);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid http_server_connection_write_failed(struct http_server_connection *conn,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *error);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainenvoid http_server_connection_trigger_responses(
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen struct http_server_connection *conn);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainenint http_server_connection_flush(struct http_server_connection *conn);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenint http_server_connection_output(struct http_server_connection *conn);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainenvoid http_server_connection_tunnel(struct http_server_connection **_conn,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen http_server_tunnel_callback_t callback, void *context);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint http_server_connection_discard_payload(
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct http_server_connection *conn);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenbool http_server_connection_pending_payload(
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct http_server_connection *conn);
aa62d8779ce53900c2f09bf2ff6fa790bc9f6a89Timo Sirainen
ea9fd7f876643e985946a2563140359064819b8eTimo Sirainen#endif
ea9fd7f876643e985946a2563140359064819b8eTimo Sirainen