http-server-private.h revision a5886aec87fbfd767a110e6168ce96411acfe798
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#define HTTP_SERVER_REQUEST_MAX_TARGET_LENGTH 4096
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* New request; request header is still being parsed. */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Queued request; callback to request handler executing. */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Reading request payload; request handler still needs to read more
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* This request is being processed; request payload is fully read, but no
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen response is yet submitted */
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 /* Request is ready for response; a response is submitted and the request
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen payload is fully read */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* The response for the request is sent (apart from payload) */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Sending response payload to client */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Request is finished; still lingering due to references */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* Request is aborted; still lingering due to references */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen void (*switch_ioloop)(struct http_server_payload_handler *handler);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen void (*destroy)(struct http_server_payload_handler *handler);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen unsigned int status;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen ARRAY_TYPE(http_auth_challenge) auth_challenges;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen http_server_tunnel_callback_t tunnel_callback;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen unsigned int id;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen void (*destroy_callback)(void *);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const struct http_server_callbacks *callbacks;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_request *request_queue_head, *request_queue_tail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct http_server_payload_handler *payload_handler;
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 bool shutting_down:1; /* shutting down server */
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 Sirainenstatic inline const char *
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenhttp_server_request_label(struct http_server_request *req)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return t_strdup_printf("[Req%u: <NEW>]", req->id);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return t_strdup_printf("[Req%u: %s <INCOMPLETE>]",
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen return t_strdup_printf("[Req%u: %s %s]", req->id,
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainenstatic inline bool
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainenhttp_server_request_is_new(struct http_server_request *req)
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen return (req->state == HTTP_SERVER_REQUEST_STATE_NEW);
b9b48aaaebf6f72dfab567cda073cde8a7b26598Timo Sirainenstatic inline bool
b9b48aaaebf6f72dfab567cda073cde8a7b26598Timo Sirainenhttp_server_request_version_equals(struct http_server_request *req,
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen return (req->req.version_major == major && req->req.version_minor == minor);
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 Sirainenbool http_server_request_is_complete(struct http_server_request *req);
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainenvoid http_server_request_halt_payload(struct http_server_request *req);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid http_server_request_continue_payload(struct http_server_request *req);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid http_server_request_submit_response(struct http_server_request *req);
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainenvoid http_server_request_ready_to_respond(struct http_server_request *req);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenvoid http_server_request_finished(struct http_server_request *req);
d4dcb9c30dba354cff7af6d303ecef7698194c55Timo Sirainen/* payload handler */
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainen struct http_server_payload_handler **_handler);
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainenvoid http_server_payload_handler_switch_ioloop(
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainenstatic inline const char *
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainenhttp_server_connection_label(struct http_server_connection *conn)
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenstatic inline void
b00787191c3c31bebb939c3d00f1fcdb67356c69Timo Sirainenhttp_server_connection_add_request(struct http_server_connection *conn,
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen DLLIST2_APPEND(&conn->request_queue_head, &conn->request_queue_tail, sreq);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenstatic inline void
ee116df08d0fdab703483e18fe8076b2ef9fd9d7Timo Sirainenhttp_server_connection_remove_request(struct http_server_connection *conn,
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen DLLIST2_REMOVE(&conn->request_queue_head, &conn->request_queue_tail, sreq);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenstruct connection_list *http_server_connection_list_init(void);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenbool http_server_connection_shut_down(struct http_server_connection *conn);
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainenvoid http_server_connection_switch_ioloop(struct http_server_connection *conn);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid http_server_connection_write_failed(struct http_server_connection *conn,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *error);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainenint http_server_connection_flush(struct http_server_connection *conn);
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenint http_server_connection_output(struct http_server_connection *conn);
e30b748edcef3cf3352478bf21fa8f785bdc773aTimo Sirainenvoid http_server_connection_tunnel(struct http_server_connection **_conn,