http-server-request.c revision 23bdbb7b1831785c6ba6df190f6369da882d2b9d
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* Copyright (c) 2013-2016 Dovecot authors, see the included COPYING file */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic inline void
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterhttp_server_request_debug(struct http_server_request *req,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic inline void
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterhttp_server_request_debug(struct http_server_request *req,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter const char *format, ...)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterhttp_server_request_new(struct http_server_connection *conn)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter static unsigned int id_counter = 0;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter pool = pool_alloconly_create(MEMPOOL_GROWING"http_server_request", 4096);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter req = p_new(pool, struct http_server_request, 1);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid http_server_request_ref(struct http_server_request *req)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterbool http_server_request_unref(struct http_server_request **_req)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter struct http_server_connection *conn = req->conn;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter http_server_connection_remove_request(conn, req);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid http_server_request_destroy(struct http_server_request **_req)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter /* just make sure the request ends in a proper state */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter void (*callback)(void *) = req->destroy_callback;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Waltervoid http_server_request_set_destroy_callback(struct http_server_request *req,
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter void (*callback)(void *),
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Waltervoid http_server_request_abort(struct http_server_request **_req,
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter struct http_server_connection *conn = req->conn;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter if (req->state >= HTTP_SERVER_REQUEST_STATE_FINISHED)
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter if (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED) {
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter http_server_connection_remove_request(conn, req);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter /* send best-effort response if appropriate */
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter req->state >= HTTP_SERVER_REQUEST_STATE_PROCESSING &&
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter req->state < HTTP_SERVER_REQUEST_STATE_SENT_RESPONSE) {
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter static const char *response =
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter "HTTP/1.1 500 Internal Server Error\r\n"
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter "Content-Length: 0\r\n"
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter /* close the connection */
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walterhttp_server_request_get(struct http_server_request *req)
c2cc119de8eac712c040b3993f41c967ff2278deStef Walterhttp_server_request_get_pool(struct http_server_request *req)
c2cc119de8eac712c040b3993f41c967ff2278deStef Walterhttp_server_request_get_response(struct http_server_request *req)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterint http_server_request_get_auth(struct http_server_request *req,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter const char *auth;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter auth = http_request_header_get(&req->req, "Authorization");
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter ((const unsigned char *)auth, strlen(auth), credentials) < 0)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterbool http_server_request_is_finished(struct http_server_request *req)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter req->state == HTTP_SERVER_REQUEST_STATE_ABORTED;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid http_server_request_halt_payload(struct http_server_request *req)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter i_assert(req->state <= HTTP_SERVER_REQUEST_STATE_QUEUED);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid http_server_request_continue_payload(struct http_server_request *req)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter i_assert(req->state <= HTTP_SERVER_REQUEST_STATE_QUEUED);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (req->req.expect_100_continue && !req->sent_100_continue)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter http_server_connection_trigger_responses(req->conn);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid http_server_request_ready_to_respond(struct http_server_request *req)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter http_server_request_debug(req, "Ready to respond");
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter req->state = HTTP_SERVER_REQUEST_STATE_READY_TO_RESPOND;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter http_server_connection_trigger_responses(req->conn);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid http_server_request_submit_response(struct http_server_request *req)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter struct http_server_connection *conn = req->conn;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter i_assert(conn != NULL && req->response != NULL && req->response->submitted);
i_unreached();
static struct http_server_response *
return resp;
if (close)
struct http_server_istream {
static ssize_t
return ret;
struct istream *
bool blocking)