http-server-request.c revision 14bd2410de3a0261d9c53c6120915027262216bd
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch/* Copyright (c) 2013-2014 Dovecot authors, see the included COPYING file */
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschhttp_server_request_new(struct http_server_connection *conn)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch pool = pool_alloconly_create("http_message", 4096);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch req = p_new(pool, struct http_server_request, 1);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch DLLIST2_APPEND(&conn->request_queue_head, &conn->request_queue_tail, req);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschvoid http_server_request_ref(struct http_server_request *req)
1e9296de32c9ddda40f33c06556cd568ddadf71fTimo Sirainenbool http_server_request_unref(struct http_server_request **_req)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct http_server_connection *conn = req->conn;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch if (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED) {
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch req->state = HTTP_SERVER_REQUEST_STATE_ABORTED;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch DLLIST2_REMOVE(&conn->request_queue_head, &conn->request_queue_tail, req);
faa8995f1d300e7a8917407a52bbd1b98e10bf25Timo Sirainenvoid http_server_request_destroy(struct http_server_request **_req)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschvoid http_server_request_set_destroy_callback(struct http_server_request *req,
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch void (*callback)(void *),
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschvoid http_server_request_abort(struct http_server_request **_req)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct http_server_connection *conn = req->conn;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch if (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED) {
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch req->state = HTTP_SERVER_REQUEST_STATE_ABORTED;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch DLLIST2_REMOVE(&conn->request_queue_head, &conn->request_queue_tail, req);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschhttp_server_request_get(struct http_server_request *req)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschhttp_server_request_get_pool(struct http_server_request *req)
85f3bd5926fff0e70b6d259a5c8074bd8cdeb9adTimo Sirainenhttp_server_request_get_response(struct http_server_request *req)
93ed69606237a08623f8294c060fa148880058f8Timo Sirainenbool http_server_request_is_finished(struct http_server_request *req)
93ed69606237a08623f8294c060fa148880058f8Timo Sirainen req->state == HTTP_SERVER_REQUEST_STATE_ABORTED;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschvoid http_server_request_halt_payload(struct http_server_request *req)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch i_assert(req->state <= HTTP_SERVER_REQUEST_STATE_QUEUED);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschvoid http_server_request_continue_payload(struct http_server_request *req)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch i_assert(req->state <= HTTP_SERVER_REQUEST_STATE_QUEUED);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch if (req->req.expect_100_continue && !req->sent_100_continue)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch http_server_connection_send_responses(req->conn);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschvoid http_server_request_ready_to_respond(struct http_server_request *req)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch req->state = HTTP_SERVER_REQUEST_STATE_READY_TO_RESPOND;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch http_server_connection_send_responses(req->conn);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschvoid http_server_request_submit_response(struct http_server_request *req)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct http_server_connection *conn = req->conn;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch i_assert(conn != NULL && req->response != NULL && req->response->submitted);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch req->state = HTTP_SERVER_REQUEST_STATE_SUBMITTED_RESPONSE;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschvoid http_server_request_finished(struct http_server_request *req)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct http_server_connection *conn = req->conn;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct http_server_response *resp = req->response;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch http_server_tunnel_callback_t tunnel_callback = resp->tunnel_callback;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch i_assert(req->state < HTTP_SERVER_REQUEST_STATE_FINISHED);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch req->state = HTTP_SERVER_REQUEST_STATE_FINISHED;
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch DLLIST2_REMOVE(&conn->request_queue_head, &conn->request_queue_tail, req);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch if (tunnel_callback == NULL && (req->req.connection_close || resp->close)) {
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch t_strdup_printf("Server closed connection: %u %s",
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch "Client requested connection close");
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch http_server_connection_tunnel(&conn, tunnel_callback, tunnel_context);
95e0b82fdff1bb511067d703bb8b67c22f242c38Timo Sirainenhttp_server_request_fail_full(struct http_server_request *req,
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch unsigned int status, const char *reason, bool close)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch resp = http_server_response_create(req, status, reason);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch (resp, "Content-Type", "text/plain; charset=utf-8");
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch (resp, (const unsigned char *)reason, strlen(reason));
95e0b82fdff1bb511067d703bb8b67c22f242c38Timo Sirainenvoid http_server_request_fail(struct http_server_request *req,
95e0b82fdff1bb511067d703bb8b67c22f242c38Timo Sirainen http_server_request_fail_full(req, status, reason,
95e0b82fdff1bb511067d703bb8b67c22f242c38Timo Sirainenvoid http_server_request_fail_close(struct http_server_request *req,