Lines Matching refs:req
15 http_server_request_debug(struct http_server_request *req,
19 http_server_request_debug(struct http_server_request *req,
22 struct http_server *server = req->server;
28 http_server_request_label(req),
35 http_server_request_error(struct http_server_request *req,
39 http_server_request_error(struct http_server_request *req,
46 http_server_request_label(req),
52 http_server_request_client_error(struct http_server_request *req,
56 http_server_request_client_error(struct http_server_request *req,
63 http_server_request_label(req),
77 struct http_server_request *req;
80 req = p_new(pool, struct http_server_request, 1);
81 req->pool = pool;
82 req->refcount = 1;
83 req->conn = conn;
84 req->server = conn->server;
85 req->id = ++id_counter;
87 http_server_connection_add_request(conn, req);
88 return req;
91 void http_server_request_ref(struct http_server_request *req)
93 i_assert(req->refcount > 0);
94 req->refcount++;
99 struct http_server_request *req = *_req;
100 struct http_server_connection *conn = req->conn;
102 i_assert(req->refcount > 0);
105 if (--req->refcount > 0)
108 http_server_request_debug(req, "Free");
110 if (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED) {
111 req->state = HTTP_SERVER_REQUEST_STATE_ABORTED;
112 http_server_connection_remove_request(conn, req);
115 if (req->destroy_callback != NULL) {
116 req->destroy_callback(req->destroy_context);
117 req->destroy_callback = NULL;
120 if (req->response != NULL)
121 http_server_response_free(req->response);
122 pool_unref(&req->pool);
126 void http_server_request_connection_close(struct http_server_request *req,
129 i_assert(req->state < HTTP_SERVER_REQUEST_STATE_SENT_RESPONSE);
130 req->connection_close = close;
135 struct http_server_request *req = *_req;
136 struct http_server *server = req->server;
138 http_server_request_debug(req, "Destroy");
141 if (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED)
142 req->state = HTTP_SERVER_REQUEST_STATE_ABORTED;
147 if (req->delay_destroy) {
148 req->destroy_pending = TRUE;
149 } else if (req->destroy_callback != NULL) {
150 void (*callback)(void *) = req->destroy_callback;
152 req->destroy_callback = NULL;
153 callback(req->destroy_context);
159 void http_server_request_set_destroy_callback(struct http_server_request *req,
163 req->destroy_callback = callback;
164 req->destroy_context = context;
170 struct http_server_request *req = *_req;
171 struct http_server_connection *conn = req->conn;
173 if (req->state >= HTTP_SERVER_REQUEST_STATE_FINISHED)
176 http_server_request_debug(req, "Abort");
178 req->conn = NULL;
179 if (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED) {
181 http_server_connection_remove_request(conn, req);
186 req->state >= HTTP_SERVER_REQUEST_STATE_PROCESSING &&
187 req->state < HTTP_SERVER_REQUEST_STATE_SENT_RESPONSE) {
202 req->state = HTTP_SERVER_REQUEST_STATE_ABORTED;
205 if (req->response != NULL &&
206 !req->response->payload_blocking) {
207 http_server_response_free(req->response);
208 req->response = NULL;
215 http_server_request_get(struct http_server_request *req)
217 return &req->req;
221 http_server_request_get_pool(struct http_server_request *req)
223 return req->pool;
227 http_server_request_get_response(struct http_server_request *req)
229 return req->response;
232 int http_server_request_get_auth(struct http_server_request *req,
237 auth = http_request_header_get(&req->req, "Authorization");
248 bool http_server_request_is_finished(struct http_server_request *req)
250 return req->response != NULL ||
251 req->state == HTTP_SERVER_REQUEST_STATE_ABORTED;
254 bool http_server_request_is_complete(struct http_server_request *req)
256 return (req->failed || req->conn->input_broken ||
257 (req->next != NULL && !http_server_request_is_new(req->next)) ||
258 !http_server_connection_pending_payload(req->conn));
261 void http_server_request_halt_payload(struct http_server_request *req)
263 i_assert(req->state <= HTTP_SERVER_REQUEST_STATE_QUEUED);
264 req->payload_halted = TRUE;
267 void http_server_request_continue_payload(struct http_server_request *req)
269 i_assert(req->state <= HTTP_SERVER_REQUEST_STATE_QUEUED);
270 req->payload_halted = FALSE;
271 if (req->req.expect_100_continue && !req->sent_100_continue)
272 http_server_connection_trigger_responses(req->conn);
275 void http_server_request_ready_to_respond(struct http_server_request *req)
277 http_server_request_debug(req, "Ready to respond");
279 req->state = HTTP_SERVER_REQUEST_STATE_READY_TO_RESPOND;
280 http_server_connection_trigger_responses(req->conn);
283 void http_server_request_submit_response(struct http_server_request *req)
285 struct http_server_connection *conn = req->conn;
287 i_assert(conn != NULL && req->response != NULL && req->response->submitted);
289 http_server_request_ref(req);
291 if (conn->payload_handler != NULL && conn->payload_handler->req == req)
294 switch (req->state) {
299 if (!http_server_request_is_complete(req)) {
300 http_server_request_debug(req, "Not ready to respond");
301 req->state = HTTP_SERVER_REQUEST_STATE_SUBMITTED_RESPONSE;
304 http_server_request_ready_to_respond(req);
307 http_server_connection_trigger_responses(req->conn);
315 http_server_request_unref(&req);
318 void http_server_request_finished(struct http_server_request *req)
320 struct http_server_connection *conn = req->conn;
321 struct http_server_response *resp = req->response;
325 http_server_request_debug(req, "Finished");
327 i_assert(req->state < HTTP_SERVER_REQUEST_STATE_FINISHED);
328 req->state = HTTP_SERVER_REQUEST_STATE_FINISHED;
330 http_server_connection_remove_request(conn, req);
334 if (req->connection_close) {
338 http_server_request_destroy(&req);
340 } else if (req->conn->input_broken) {
343 http_server_request_destroy(&req);
345 } else if (req->req.connection_close) {
348 http_server_request_destroy(&req);
353 http_server_request_destroy(&req);
363 http_server_request_create_fail_response(struct http_server_request *req,
369 req->failed = TRUE;
373 resp = http_server_response_create(req, status, reason);
374 if (!http_request_method_is(&req->req, "HEAD")) {
388 http_server_request_fail_full(struct http_server_request *req,
394 req->failed = TRUE;
395 resp = http_server_request_create_fail_response(req,
398 if (req->conn->input_broken)
399 req->connection_close = TRUE;
402 void http_server_request_fail(struct http_server_request *req,
405 http_server_request_fail_full(req, status, reason, NULL);
408 void http_server_request_fail_close(struct http_server_request *req,
411 http_server_request_connection_close(req, TRUE);
412 http_server_request_fail_full(req, status, reason, NULL);
415 void http_server_request_fail_text(struct http_server_request *req,
421 http_server_request_fail_full(req, status, reason,
426 void http_server_request_fail_auth(struct http_server_request *req,
431 req->failed = TRUE;
436 resp = http_server_request_create_fail_response(req,
442 void http_server_request_fail_auth_basic(struct http_server_request *req,
448 http_server_request_fail_auth(req, reason, &chlng);
458 struct http_server_request *req;
474 http_server_connection_switch_ioloop(hsristream->req->conn);
481 struct http_server *server = hsristream->req->server;
496 struct http_server_request *req = hsristream->req;
502 if (req == NULL) {
511 server = hsristream->req->server;
512 conn = hsristream->req->conn;
520 http_server_request_ref(req);
526 if (blocking && req->req.expect_100_continue &&
527 !req->sent_100_continue)
533 while (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED &&
546 if (!http_server_request_unref(&req))
547 hsristream->req = NULL;
571 http_server_request_get_payload_input(struct http_server_request *req,
575 struct istream *payload = req->req.payload;
577 i_assert(req->payload_input == NULL);
580 hsristream->req = req;
593 req->payload_input = i_stream_create
595 i_stream_unref(&req->req.payload);
596 return req->payload_input;
606 struct http_server_request *req)
608 struct http_server_connection *conn = req->conn;
615 handler->req = req;
622 struct http_server_connection *conn = handler->req->conn;
679 struct http_server_request *req = handler->req;
680 struct http_server_connection *conn = req->conn;
687 http_server_request_fail_close(req,
690 unsigned int old_refcount = req->refcount;
694 req->callback_refcount += req->refcount - old_refcount;
697 i_assert(req->callback_refcount > 0 ||
698 (req->response != NULL && req->response->submitted));
702 http_server_request_client_error(req,
706 http_server_request_fail_close(req,
711 http_server_request_error(req,
716 http_server_request_fail_close(req,
726 void http_server_request_forward_payload(struct http_server_request *req,
730 struct http_server_connection *conn = req->conn;
736 i_assert(req->req.payload != NULL);
743 http_server_request_error(req,
746 http_server_request_fail_close(req,
751 http_server_request_fail_close(req,
759 phandler = p_new(req->pool, struct http_server_payload_handler_pump, 1);
760 http_server_payload_handler_init(&phandler->handler, req);
774 void http_server_request_buffer_payload(struct http_server_request *req,
781 http_server_request_forward_payload(req,
822 struct http_server_request *req = handler->req;
823 struct http_server_connection *conn = req->conn;
825 unsigned int old_refcount = req->refcount;
829 req->callback_refcount += req->refcount - old_refcount;
833 if (req->response == NULL) {
834 http_server_request_client_error(req,
838 http_server_request_fail_close(req,
843 i_assert(req->callback_refcount > 0 ||
844 (req->response != NULL && req->response->submitted));
855 void http_server_request_handle_payload(struct http_server_request *req,
859 struct http_server_connection *conn = req->conn;
861 rhandler = p_new(req->pool, struct http_server_payload_handler_raw, 1);
862 http_server_payload_handler_init(&rhandler->handler, req);