Lines Matching refs:resp

13 	struct http_server_response *resp;  member
23 static void http_server_response_update_event(struct http_server_response *resp) in http_server_response_update_event() argument
25 event_add_int(resp->event, "status", resp->status); in http_server_response_update_event()
26 event_set_append_log_prefix(resp->event, in http_server_response_update_event()
28 resp->status)); in http_server_response_update_event()
35 struct http_server_response *resp; in http_server_response_create() local
40 resp = req->response = p_new(req->pool, in http_server_response_create()
46 resp = req->response; in http_server_response_create()
48 ARRAY_TYPE(string) perm_headers = resp->perm_headers; in http_server_response_create()
49 i_zero(&resp->perm_headers); in http_server_response_create()
51 http_server_response_request_free(resp); in http_server_response_create()
52 i_zero(resp); in http_server_response_create()
54 resp->perm_headers = perm_headers; in http_server_response_create()
57 resp->request = req; in http_server_response_create()
58 resp->status = status; in http_server_response_create()
59 resp->reason = p_strdup(req->pool, reason); in http_server_response_create()
60 resp->headers = str_new(default_pool, 256); in http_server_response_create()
61 resp->date = (time_t)-1; in http_server_response_create()
62 resp->event = event_create(req->event); in http_server_response_create()
63 http_server_response_update_event(resp); in http_server_response_create()
65 if (array_is_created(&resp->perm_headers)) { in http_server_response_create()
67 char *const *headers = array_get(&resp->perm_headers, &count); in http_server_response_create()
69 http_server_response_add_header(resp, headers[i], in http_server_response_create()
72 return resp; in http_server_response_create()
75 void http_server_response_request_free(struct http_server_response *resp) in http_server_response_request_free() argument
77 e_debug(resp->event, "Free"); in http_server_response_request_free()
80 i_assert(resp->payload_stream == NULL); in http_server_response_request_free()
82 i_stream_unref(&resp->payload_input); in http_server_response_request_free()
83 o_stream_unref(&resp->payload_output); in http_server_response_request_free()
84 event_unref(&resp->event); in http_server_response_request_free()
85 str_free(&resp->headers); in http_server_response_request_free()
87 if (array_is_created(&resp->perm_headers)) { in http_server_response_request_free()
90 array_foreach_elem(&resp->perm_headers, headers) in http_server_response_request_free()
92 array_free(&resp->perm_headers); in http_server_response_request_free()
96 void http_server_response_request_destroy(struct http_server_response *resp) in http_server_response_request_destroy() argument
98 e_debug(resp->event, "Destroy"); in http_server_response_request_destroy()
100 if (resp->payload_stream != NULL) in http_server_response_request_destroy()
101 http_server_ostream_response_destroyed(resp->payload_stream); in http_server_response_request_destroy()
104 void http_server_response_request_abort(struct http_server_response *resp, in http_server_response_request_abort() argument
108 e_debug(resp->event, "Abort"); in http_server_response_request_abort()
110 e_debug(resp->event, "Abort: %s", reason); in http_server_response_request_abort()
112 if (resp->payload_stream != NULL) { in http_server_response_request_abort()
113 http_server_ostream_set_error(resp->payload_stream, in http_server_response_request_abort()
118 void http_server_response_ref(struct http_server_response *resp) in http_server_response_ref() argument
120 http_server_request_ref(resp->request); in http_server_response_ref()
125 struct http_server_response *resp = *_resp; in http_server_response_unref() local
129 if (resp == NULL) in http_server_response_unref()
132 req = resp->request; in http_server_response_unref()
136 void http_server_response_add_header(struct http_server_response *resp, in http_server_response_add_header() argument
139 i_assert(!resp->submitted); in http_server_response_add_header()
147 resp->have_hdr_connection = TRUE; in http_server_response_add_header()
149 resp->have_hdr_body_spec = TRUE; in http_server_response_add_header()
153 resp->have_hdr_date = TRUE; in http_server_response_add_header()
157 resp->have_hdr_body_spec = TRUE; in http_server_response_add_header()
160 str_printfa(resp->headers, "%s: %s\r\n", key, value); in http_server_response_add_header()
163 void http_server_response_update_status(struct http_server_response *resp, in http_server_response_update_status() argument
167 i_assert(!resp->submitted); in http_server_response_update_status()
168 resp->status = status; in http_server_response_update_status()
170 resp->reason = p_strdup(resp->request->pool, reason); in http_server_response_update_status()
173 void http_server_response_set_date(struct http_server_response *resp, in http_server_response_set_date() argument
176 i_assert(!resp->submitted); in http_server_response_set_date()
178 resp->date = date; in http_server_response_set_date()
181 void http_server_response_set_payload(struct http_server_response *resp, in http_server_response_set_payload() argument
186 i_assert(!resp->submitted); in http_server_response_set_payload()
187 i_assert(resp->payload_input == NULL); in http_server_response_set_payload()
188 i_assert(resp->payload_stream == NULL); in http_server_response_set_payload()
191 resp->payload_input = input; in http_server_response_set_payload()
192 if ((ret = i_stream_get_size(input, TRUE, &resp->payload_size)) <= 0) { in http_server_response_set_payload()
194 e_error(resp->event, "i_stream_get_size(%s) failed: %s", in http_server_response_set_payload()
198 resp->payload_size = 0; in http_server_response_set_payload()
199 resp->payload_chunked = TRUE; in http_server_response_set_payload()
201 i_assert(input->v_offset <= resp->payload_size); in http_server_response_set_payload()
202 resp->payload_size -= input->v_offset; in http_server_response_set_payload()
204 resp->payload_offset = input->v_offset; in http_server_response_set_payload()
207 void http_server_response_set_payload_data(struct http_server_response *resp, in http_server_response_set_payload_data() argument
214 i_assert(!resp->submitted); in http_server_response_set_payload_data()
215 i_assert(resp->payload_input == NULL); in http_server_response_set_payload_data()
216 i_assert(resp->payload_stream == NULL); in http_server_response_set_payload_data()
221 payload_data = p_malloc(resp->request->pool, size); in http_server_response_set_payload_data()
225 http_server_response_set_payload(resp, input); in http_server_response_set_payload_data()
230 http_server_response_get_payload_output(struct http_server_response *resp, in http_server_response_get_payload_output() argument
233 struct http_server_request *req = resp->request; in http_server_response_get_payload_output()
238 i_assert(!resp->submitted); in http_server_response_get_payload_output()
239 i_assert(resp->payload_input == NULL); in http_server_response_get_payload_output()
240 i_assert(resp->payload_stream == NULL); in http_server_response_get_payload_output()
242 output = http_server_ostream_create(resp, max_buffer_size, blocking); in http_server_response_get_payload_output()
246 http_server_request_label(req), resp->status)); in http_server_response_get_payload_output()
250 void http_server_response_add_auth(struct http_server_response *resp, in http_server_response_add_auth() argument
254 pool_t pool = resp->request->pool; in http_server_response_add_auth()
256 if (!array_is_created(&resp->auth_challenges)) in http_server_response_add_auth()
257 p_array_init(&resp->auth_challenges, pool, 4); in http_server_response_add_auth()
259 new = array_append_space(&resp->auth_challenges); in http_server_response_add_auth()
263 void http_server_response_add_auth_basic(struct http_server_response *resp, in http_server_response_add_auth_basic() argument
269 http_server_response_add_auth(resp, &chlng); in http_server_response_add_auth_basic()
273 http_server_response_do_submit(struct http_server_response *resp) in http_server_response_do_submit() argument
275 i_assert(!resp->submitted); in http_server_response_do_submit()
276 if (resp->date == (time_t)-1) in http_server_response_do_submit()
277 resp->date = ioloop_time; in http_server_response_do_submit()
278 resp->submitted = TRUE; in http_server_response_do_submit()
279 http_server_request_submit_response(resp->request); in http_server_response_do_submit()
282 void http_server_response_submit(struct http_server_response *resp) in http_server_response_submit() argument
284 e_debug(resp->event, "Submitted"); in http_server_response_submit()
286 http_server_response_do_submit(resp); in http_server_response_submit()
289 void http_server_response_submit_close(struct http_server_response *resp) in http_server_response_submit_close() argument
291 http_server_request_connection_close(resp->request, TRUE); in http_server_response_submit_close()
292 http_server_response_submit(resp); in http_server_response_submit_close()
295 void http_server_response_submit_tunnel(struct http_server_response *resp, in http_server_response_submit_tunnel() argument
299 e_debug(resp->event, "Started tunnelling"); in http_server_response_submit_tunnel()
301 resp->tunnel_callback = callback; in http_server_response_submit_tunnel()
302 resp->tunnel_context = context; in http_server_response_submit_tunnel()
303 http_server_request_connection_close(resp->request, TRUE); in http_server_response_submit_tunnel()
304 http_server_response_do_submit(resp); in http_server_response_submit_tunnel()
308 http_server_response_flush_payload(struct http_server_response *resp) in http_server_response_flush_payload() argument
310 struct http_server_request *req = resp->request; in http_server_response_flush_payload()
314 if (resp->payload_output != conn->conn.output && in http_server_response_flush_payload()
315 (ret = o_stream_finish(resp->payload_output)) <= 0) { in http_server_response_flush_payload()
326 void http_server_response_request_finished(struct http_server_response *resp) in http_server_response_request_finished() argument
328 e_debug(resp->event, "Finished"); in http_server_response_request_finished()
330 if (resp->payload_stream != NULL) in http_server_response_request_finished()
331 http_server_ostream_response_finished(resp->payload_stream); in http_server_response_request_finished()
334 int http_server_response_finish_payload_out(struct http_server_response *resp) in http_server_response_finish_payload_out() argument
336 struct http_server_request *req = resp->request; in http_server_response_finish_payload_out()
343 resp->payload_finished = TRUE; in http_server_response_finish_payload_out()
345 if (resp->payload_output != NULL) { in http_server_response_finish_payload_out()
346 ret = http_server_response_flush_payload(resp); in http_server_response_finish_payload_out()
350 e_debug(resp->event, in http_server_response_finish_payload_out()
354 o_stream_unref(&resp->payload_output); in http_server_response_finish_payload_out()
355 resp->payload_output = NULL; in http_server_response_finish_payload_out()
358 e_debug(resp->event, "Finished sending payload"); in http_server_response_finish_payload_out()
363 if (resp->payload_corked && in http_server_response_finish_payload_out()
376 http_server_request_finished(resp->request); in http_server_response_finish_payload_out()
385 struct http_server_response *resp = *_resp; in http_server_response_output_payload() local
386 struct http_server_request *req = resp->request; in http_server_response_output_payload()
394 http_server_response_ref(resp); in http_server_response_output_payload()
396 if (resp->payload_stream == NULL) { in http_server_response_output_payload()
398 resp, IO_BLOCK_SIZE, TRUE); in http_server_response_output_payload()
400 output = http_server_ostream_get_output(resp->payload_stream); in http_server_response_output_payload()
407 http_server_response_unref(&resp); in http_server_response_output_payload()
415 http_server_response_unref(&resp); in http_server_response_output_payload()
426 e_debug(resp->event, in http_server_response_output_payload()
440 if (!http_server_response_unref(&resp)) in http_server_response_output_payload()
450 struct http_server_response *resp = *_resp; in http_server_response_send_payload() local
453 resp->payload_corked = TRUE; in http_server_response_send_payload()
457 ret = http_server_response_output_payload(&resp, data, size); in http_server_response_send_payload()
462 i_assert(resp != NULL); in http_server_response_send_payload()
469 struct http_server_response *resp = *_resp; in http_server_response_finish_payload() local
473 ret = http_server_response_output_payload(&resp, NULL, 0); in http_server_response_finish_payload()
480 struct http_server_response *resp = *_resp; in http_server_response_abort_payload() local
481 struct http_server_request *req = resp->request; in http_server_response_abort_payload()
489 http_server_response_payload_input(struct http_server_response *resp) in http_server_response_payload_input() argument
491 struct http_server_connection *conn = resp->request->conn; in http_server_response_payload_input()
498 int http_server_response_send_more(struct http_server_response *resp) in http_server_response_send_more() argument
500 struct http_server_connection *conn = resp->request->conn; in http_server_response_send_more()
501 struct ostream *output = resp->payload_output; in http_server_response_send_more()
504 i_assert(resp->payload_output != NULL); in http_server_response_send_more()
506 if (resp->payload_finished) { in http_server_response_send_more()
507 e_debug(resp->event, "Finish sending payload (more)"); in http_server_response_send_more()
508 return http_server_response_finish_payload_out(resp); in http_server_response_send_more()
511 if (resp->payload_stream != NULL) { in http_server_response_send_more()
513 return http_server_ostream_continue(resp->payload_stream); in http_server_response_send_more()
516 i_assert(resp->payload_input != NULL); in http_server_response_send_more()
521 res = o_stream_send_istream(output, resp->payload_input); in http_server_response_send_more()
527 if (!resp->payload_chunked && in http_server_response_send_more()
528 (resp->payload_input->v_offset - resp->payload_offset) != in http_server_response_send_more()
529 resp->payload_size) { in http_server_response_send_more()
530 e_error(resp->event, in http_server_response_send_more()
532 i_stream_get_name(resp->payload_input)); in http_server_response_send_more()
538 e_debug(resp->event, "Finish sending payload"); in http_server_response_send_more()
539 return http_server_response_finish_payload_out(resp); in http_server_response_send_more()
544 conn->io_resp_payload = io_add_istream(resp->payload_input, in http_server_response_send_more()
545 http_server_response_payload_input, resp); in http_server_response_send_more()
557 e_error(resp->event, "read(%s) failed: %s", in http_server_response_send_more()
558 i_stream_get_name(resp->payload_input), in http_server_response_send_more()
559 i_stream_get_error(resp->payload_input)); in http_server_response_send_more()
571 static int http_server_response_send_real(struct http_server_response *resp) in http_server_response_send_real() argument
573 struct http_server_request *req = resp->request; in http_server_response_send_real()
585 if (resp->payload_input != NULL) { in http_server_response_send_real()
586 i_assert(resp->tunnel_callback == NULL && in http_server_response_send_real()
587 resp->status / 100 != 1 && in http_server_response_send_real()
588 resp->status != 204 && resp->status != 304); in http_server_response_send_real()
589 if (resp->payload_chunked) { in http_server_response_send_real()
601 content_length = resp->payload_size; in http_server_response_send_real()
604 } else if (resp->payload_stream != NULL) { in http_server_response_send_real()
606 if (!http_server_ostream_get_size(resp->payload_stream, in http_server_response_send_real()
615 } else if (resp->tunnel_callback == NULL && resp->status / 100 != 1 && in http_server_response_send_real()
616 resp->status != 204 && resp->status != 304 && !is_head) { in http_server_response_send_real()
645 e_debug(resp->event, "A HEAD response has no payload"); in http_server_response_send_real()
647 i_assert(resp->payload_input != NULL || in http_server_response_send_real()
648 resp->payload_stream != NULL); in http_server_response_send_real()
650 e_debug(resp->event, "Will send payload in chunks"); in http_server_response_send_real()
652 resp->payload_output = in http_server_response_send_real()
655 i_assert(resp->payload_input != NULL || content_length == 0 || in http_server_response_send_real()
656 resp->payload_stream != NULL); in http_server_response_send_real()
658 e_debug(resp->event, in http_server_response_send_real()
663 resp->payload_output = conn->conn.output; in http_server_response_send_real()
667 i_assert(resp->payload_input != NULL); in http_server_response_send_real()
669 e_debug(resp->event, in http_server_response_send_real()
673 resp->payload_output = conn->conn.output; in http_server_response_send_real()
676 e_debug(resp->event, "Response has no payload"); in http_server_response_send_real()
681 str_printfa(rtext, "%u", resp->status); in http_server_response_send_real()
683 str_append(rtext, resp->reason); in http_server_response_send_real()
687 if (!resp->have_hdr_date) { in http_server_response_send_real()
689 str_append(rtext, http_date_create(resp->date)); in http_server_response_send_real()
692 if (array_is_created(&resp->auth_challenges)) { in http_server_response_send_real()
694 http_auth_create_challenges(rtext, &resp->auth_challenges); in http_server_response_send_real()
698 if (!resp->have_hdr_body_spec) in http_server_response_send_real()
701 if (!resp->have_hdr_body_spec) { in http_server_response_send_real()
706 if (!resp->have_hdr_connection) { in http_server_response_send_real()
709 if (close && resp->tunnel_callback == NULL) in http_server_response_send_real()
719 iov[1].iov_base = str_data(resp->headers); in http_server_response_send_real()
720 iov[1].iov_len = str_len(resp->headers); in http_server_response_send_real()
733 e_debug(resp->event, "Sent header"); in http_server_response_send_real()
735 if (resp->payload_stream != NULL) in http_server_response_send_real()
736 http_server_ostream_output_available(resp->payload_stream); in http_server_response_send_real()
737 if (resp->payload_output != NULL) { in http_server_response_send_real()
739 ret = http_server_response_send_more(resp); in http_server_response_send_real()
744 e_debug(resp->event, "No payload to send"); in http_server_response_send_real()
745 if (resp->payload_stream != NULL) { in http_server_response_send_real()
746 ret = http_server_ostream_continue(resp->payload_stream); in http_server_response_send_real()
751 ret = http_server_response_finish_payload_out(resp); in http_server_response_send_real()
756 if (conn->conn.output != NULL && !resp->payload_corked && in http_server_response_send_real()
764 int http_server_response_send(struct http_server_response *resp) in http_server_response_send() argument
769 ret = http_server_response_send_real(resp); in http_server_response_send()
774 void http_server_response_get_status(struct http_server_response *resp, in http_server_response_get_status() argument
777 i_assert(resp != NULL); in http_server_response_get_status()
778 *status_r = resp->status; in http_server_response_get_status()
779 *reason_r = resp->reason; in http_server_response_get_status()
782 uoff_t http_server_response_get_total_size(struct http_server_response *resp) in http_server_response_get_total_size() argument
784 i_assert(resp != NULL); in http_server_response_get_total_size()
785 return resp->payload_size + str_len(resp->headers); in http_server_response_get_total_size()
788 void http_server_response_add_permanent_header(struct http_server_response *resp, in http_server_response_add_permanent_header() argument
791 http_server_response_add_header(resp, key, value); in http_server_response_add_permanent_header()
793 if (!array_is_created(&resp->perm_headers)) in http_server_response_add_permanent_header()
794 i_array_init(&resp->perm_headers, 4); in http_server_response_add_permanent_header()
797 array_push_back(&resp->perm_headers, &key_dup); in http_server_response_add_permanent_header()
798 array_push_back(&resp->perm_headers, &value_dup); in http_server_response_add_permanent_header()