Lines Matching defs:resp

13 	struct http_server_response *resp;
24 http_server_response_debug(struct http_server_response *resp,
28 http_server_response_debug(struct http_server_response *resp,
33 if (resp->request->server->set.debug) {
36 http_server_request_label(resp->request), resp->status,
43 http_server_response_error(struct http_server_response *resp,
47 http_server_response_error(struct http_server_response *resp,
54 http_server_request_label(resp->request), resp->status,
67 struct http_server_response *resp;
70 resp = req->response = p_new
76 resp = req->response;
77 i_assert(!resp->submitted);
78 http_server_response_free(resp);
79 i_zero(resp);
82 resp->request = req;
83 resp->status = status;
84 resp->reason = p_strdup(req->pool, reason);
85 resp->headers = str_new(default_pool, 256);
86 resp->date = (time_t)-1;
88 return resp;
91 void http_server_response_free(struct http_server_response *resp)
93 http_server_response_debug(resp, "Destroy");
95 i_assert(!resp->payload_blocking);
97 i_stream_unref(&resp->payload_input);
98 o_stream_unref(&resp->payload_output);
99 str_free(&resp->headers);
102 void http_server_response_add_header(struct http_server_response *resp,
105 i_assert(!resp->submitted);
113 resp->have_hdr_connection = TRUE;
115 resp->have_hdr_body_spec = TRUE;
119 resp->have_hdr_date = TRUE;
123 resp->have_hdr_body_spec = TRUE;
126 str_printfa(resp->headers, "%s: %s\r\n", key, value);
129 void http_server_response_update_status(struct http_server_response *resp,
133 i_assert(!resp->submitted);
134 resp->status = status;
136 resp->reason = p_strdup(resp->request->pool, reason);
139 void http_server_response_set_date(struct http_server_response *resp,
142 i_assert(!resp->submitted);
144 resp->date = date;
147 void http_server_response_set_payload(struct http_server_response *resp,
152 i_assert(!resp->submitted);
153 i_assert(resp->blocking_output == NULL);
154 i_assert(resp->payload_input == NULL);
157 resp->payload_input = input;
158 if ((ret = i_stream_get_size(input, TRUE, &resp->payload_size)) <= 0) {
163 resp->payload_size = 0;
164 resp->payload_chunked = TRUE;
166 resp->payload_offset = input->v_offset;
169 void http_server_response_set_payload_data(struct http_server_response *resp,
178 payload_data = p_malloc(resp->request->pool, size);
182 http_server_response_set_payload(resp, input);
187 struct http_server_response *resp,
191 pool_t pool = resp->request->pool;
193 if (!array_is_created(&resp->auth_challenges))
194 p_array_init(&resp->auth_challenges, pool, 4);
196 new = array_append_space(&resp->auth_challenges);
201 struct http_server_response *resp, const char *realm)
206 http_server_response_add_auth(resp, &chlng);
210 http_server_response_do_submit(struct http_server_response *resp)
212 i_assert(!resp->submitted);
213 if (resp->date == (time_t)-1)
214 resp->date = ioloop_time;
215 resp->submitted = TRUE;
216 http_server_request_submit_response(resp->request);
219 void http_server_response_submit(struct http_server_response *resp)
221 http_server_response_debug(resp, "Submitted");
223 http_server_response_do_submit(resp);
226 void http_server_response_submit_close(struct http_server_response *resp)
228 http_server_request_connection_close(resp->request, TRUE);
229 http_server_response_submit(resp);
232 void http_server_response_submit_tunnel(struct http_server_response *resp,
235 http_server_response_debug(resp, "Started tunnelling");
237 resp->tunnel_callback = callback;
238 resp->tunnel_context = context;
239 http_server_request_connection_close(resp->request, TRUE);
240 http_server_response_do_submit(resp);
244 http_server_response_finish_payload_out(struct http_server_response *resp)
246 struct http_server_connection *conn = resp->request->conn;
248 if (resp->payload_output != NULL) {
249 o_stream_unref(&resp->payload_output);
250 resp->payload_output = NULL;
253 http_server_response_debug(resp, "Finished sending payload");
258 if (resp->payload_corked &&
265 http_server_request_finished(resp->request);
272 struct http_server_response *resp = rpay->resp;
273 struct http_server_connection *conn = resp->request->conn;
274 struct http_server *server = resp->request->server;
275 struct ostream *output = resp->payload_output;
319 struct http_server_response *resp = *_resp;
320 struct http_server_request *req = resp->request;
328 i_assert(resp->payload_input == NULL);
337 resp->payload_blocking = TRUE;
340 rpay.resp = resp;
343 resp->payload_direct = FALSE;
345 http_server_response_finish_payload_out(resp);
347 resp->payload_direct = TRUE;
353 resp->payload_size = 0;
354 resp->payload_chunked = TRUE;
357 http_server_response_submit(resp);
368 http_server_response_debug(resp,
372 } else if (resp->payload_output != NULL) {
373 http_server_response_debug(resp,
376 o_stream_set_flush_callback(resp->payload_output,
378 o_stream_set_flush_pending(resp->payload_output, TRUE);
381 http_server_response_finish_payload_out(resp);
403 http_server_response_debug(resp,
412 resp->payload_blocking = FALSE;
413 resp->payload_direct = FALSE;
430 struct http_server_response *resp = *_resp;
434 i_assert(resp->blocking_output == NULL);
436 resp->payload_corked = TRUE;
443 ret = http_server_response_output_payload(&resp, &iov, 1);
448 i_assert(resp != NULL);
455 struct http_server_response *resp = *_resp;
458 i_assert(resp->blocking_output == NULL);
461 ret = http_server_response_output_payload(&resp, NULL, 0);
468 struct http_server_response *resp = *_resp;
469 struct http_server_request *req = resp->request;
478 http_server_response_payload_input(struct http_server_response *resp)
480 struct http_server_connection *conn = resp->request->conn;
487 int http_server_response_send_more(struct http_server_response *resp)
489 struct http_server_connection *conn = resp->request->conn;
490 struct ostream *output = resp->payload_output;
494 i_assert(!resp->payload_blocking);
495 i_assert(resp->payload_input != NULL);
496 i_assert(resp->payload_output != NULL);
502 res = o_stream_send_istream(output, resp->payload_input);
508 if (!resp->payload_chunked &&
509 resp->payload_input->v_offset - resp->payload_offset !=
510 resp->payload_size) {
511 http_server_response_error(resp,
513 i_stream_get_name(resp->payload_input));
524 conn->io_resp_payload = io_add_istream(resp->payload_input,
525 http_server_response_payload_input, resp);
531 //http_server_response_debug(resp, "Partially sent payload");
536 http_server_response_error(resp,
538 i_stream_get_name(resp->payload_input),
539 i_stream_get_error(resp->payload_input));
553 http_server_response_finish_payload_out(resp);
558 static int http_server_response_send_real(struct http_server_response *resp)
560 struct http_server_request *req = resp->request;
572 str_printfa(rtext, "%u", resp->status);
574 str_append(rtext, resp->reason);
578 if (!resp->have_hdr_date) {
580 str_append(rtext, http_date_create(resp->date));
583 if (array_is_created(&resp->auth_challenges)) {
585 http_auth_create_challenges(rtext, &resp->auth_challenges);
588 if (resp->payload_input != NULL || resp->payload_direct) {
589 i_assert(resp->tunnel_callback == NULL && resp->status / 100 != 1 &&
590 resp->status != 204 && resp->status != 304);
591 if (resp->payload_chunked) {
595 resp->payload_output = conn->conn.output;
601 if (!resp->have_hdr_body_spec)
604 resp->payload_output =
611 if (!resp->have_hdr_body_spec) {
613 resp->payload_size);
616 resp->payload_output = conn->conn.output;
620 } else if (resp->tunnel_callback == NULL && resp->status / 100 != 1
621 && resp->status != 204 && resp->status != 304 && !is_head) {
642 if (!resp->have_hdr_body_spec)
645 if (!resp->have_hdr_connection) {
648 if (close && resp->tunnel_callback == NULL)
658 iov[1].iov_base = str_data(resp->headers);
659 iov[1].iov_len = str_len(resp->headers);
671 http_server_response_debug(resp, "Sent header");
673 if (resp->payload_blocking) {
678 } else if (resp->payload_output != NULL) {
680 if (http_server_response_send_more(resp) < 0)
685 http_server_response_finish_payload_out(resp);
688 if (conn->conn.output != NULL && !resp->payload_corked &&
696 int http_server_response_send(struct http_server_response *resp)
701 ret = http_server_response_send_real(resp);
713 struct http_server_response *resp;
726 (&hsostream->resp, iov, iov_count) < 0) {
751 if (hsostream->resp == NULL)
753 hsostream->resp->blocking_output = NULL;
756 (&hsostream->resp, NULL, 0) < 0) {
765 hsostream->resp = NULL;
773 if (hsostream->resp != NULL) {
774 hsostream->resp->blocking_output = NULL;
775 http_server_response_abort_payload(&hsostream->resp);
780 http_server_response_get_payload_output(struct http_server_response *resp,
783 struct http_server_connection *conn = resp->request->conn;
786 i_assert(resp->payload_input == NULL);
787 i_assert(resp->blocking_output == NULL);
795 hsostream->resp = resp;
797 resp->blocking_output =
799 return resp->blocking_output;
802 void http_server_response_get_status(struct http_server_response *resp,
805 i_assert(resp != NULL);
806 *status_r = resp->status;
807 *reason_r = resp->reason;
810 uoff_t http_server_response_get_total_size(struct http_server_response *resp)
812 i_assert(resp != NULL);
813 return resp->payload_size + str_len(resp->headers);