Lines Matching refs:conn
22 http_server_connection_disconnect(struct http_server_connection *conn,
26 http_server_connection_unref_is_closed(struct http_server_connection *conn);
33 http_server_connection_debug(struct http_server_connection *conn,
37 http_server_connection_debug(struct http_server_connection *conn,
42 if (conn->server->set.debug) {
45 i_debug("http-server: conn %s: %s",
46 http_server_connection_label(conn), t_strdup_vprintf(format, args));
52 http_server_connection_error(struct http_server_connection *conn,
56 http_server_connection_error(struct http_server_connection *conn,
62 i_error("http-server: conn %s: %s",
63 http_server_connection_label(conn), t_strdup_vprintf(format, args));
68 http_server_connection_client_error(struct http_server_connection *conn,
72 http_server_connection_client_error(struct http_server_connection *conn,
78 i_info("http-server: conn %s: %s",
79 http_server_connection_label(conn), t_strdup_vprintf(format, args));
92 http_server_connection_update_stats(struct http_server_connection *conn)
94 if (conn->conn.input != NULL)
95 conn->stats.input = conn->conn.input->v_offset;
96 if (conn->conn.output != NULL)
97 conn->stats.output = conn->conn.output->offset;
101 http_server_connection_get_stats(struct http_server_connection *conn)
103 http_server_connection_update_stats(conn);
104 return &conn->stats;
108 http_server_connection_input_halt(struct http_server_connection *conn)
110 connection_input_halt(&conn->conn);
114 http_server_connection_input_resume(struct http_server_connection *conn)
116 if (!conn->closed && !conn->input_broken && !conn->close_indicated &&
117 !conn->in_req_callback && conn->incoming_payload == NULL) {
118 connection_input_resume(&conn->conn);
123 http_server_connection_idle_timeout(struct http_server_connection *conn)
125 http_server_connection_client_error(conn, "Disconnected for inactivity");
126 http_server_connection_close(&conn, "Disconnected for inactivity");
130 http_server_connection_timeout_stop(struct http_server_connection *conn)
132 timeout_remove(&conn->to_idle);
136 http_server_connection_timeout_start(struct http_server_connection *conn)
138 if (conn->to_idle == NULL && conn->server->set.max_client_idle_time_msecs > 0) {
139 conn->to_idle = timeout_add(conn->server->set.max_client_idle_time_msecs,
140 http_server_connection_idle_timeout, conn);
145 http_server_connection_timeout_reset(struct http_server_connection *conn)
147 if (conn->to_idle != NULL)
148 timeout_reset(conn->to_idle);
151 bool http_server_connection_shut_down(struct http_server_connection *conn)
153 if (conn->request_queue_head == NULL ||
154 conn->request_queue_head->state == HTTP_SERVER_REQUEST_STATE_NEW) {
155 http_server_connection_close(&conn, "Server shutting down");
161 static void http_server_connection_ready(struct http_server_connection *conn)
165 if (conn->server->set.rawlog_dir != NULL &&
166 stat(conn->server->set.rawlog_dir, &st) == 0) {
167 iostream_rawlog_create(conn->server->set.rawlog_dir,
168 &conn->conn.input, &conn->conn.output);
171 conn->http_parser = http_request_parser_init
172 (conn->conn.input, &conn->server->set.request_limits,
174 o_stream_set_flush_callback(conn->conn.output,
175 http_server_connection_output, conn);
180 struct http_server_connection *conn =
183 http_server_connection_disconnect(conn, NULL);
184 http_server_connection_unref(&conn);
187 static void http_server_payload_finished(struct http_server_connection *conn)
189 timeout_remove(&conn->to_input);
190 http_server_connection_input_resume(conn);
194 http_server_payload_destroyed_timeout(struct http_server_connection *conn)
196 http_server_connection_input(&conn->conn);
201 struct http_server_connection *conn = req->conn;
204 i_assert(conn != NULL);
205 i_assert(conn->request_queue_tail == req ||
207 i_assert(conn->conn.io == NULL);
209 http_server_connection_debug(conn, "Request payload stream destroyed");
213 net_set_nonblock(conn->conn.fd_in, TRUE);
215 stream_errno = conn->incoming_payload->stream_errno;
216 conn->incoming_payload = NULL;
218 if (conn->payload_handler != NULL)
219 http_server_payload_handler_destroy(&conn->payload_handler);
223 conn->conn.input->stream_errno == 0) {
226 conn->input_broken = TRUE;
227 http_server_connection_client_error(conn,
232 conn->input_broken = TRUE;
233 http_server_connection_client_error(conn,
248 http_server_connection_timeout_stop(conn);
274 if (!conn->input_broken && !conn->in_req_callback) {
275 conn->to_input =
276 timeout_add_short(0, http_server_payload_destroyed_timeout, conn);
281 struct http_server_connection *conn, struct http_server_request *req)
285 if (conn->callbacks->handle_connect_request == NULL) {
293 conn->callbacks->handle_connect_request
294 (conn->context, req, req->req.target.url);
298 if (conn->callbacks->handle_request == NULL) {
302 conn->callbacks->handle_request(conn->context, req);
307 http_server_connection_handle_request(struct http_server_connection *conn,
310 const struct http_server_settings *set = &conn->server->set;
315 i_assert(!conn->in_req_callback);
316 i_assert(conn->incoming_payload == NULL);
328 conn->incoming_payload = req->req.payload =
333 http_server_connection_timeout_stop(conn);
335 conn->incoming_payload = req->req.payload =
342 http_server_connection_input_halt(conn);
345 conn->in_req_callback = TRUE;
346 http_server_connection_request_callback(conn, req);
347 if (conn->closed) {
351 conn->in_req_callback = FALSE;
358 http_server_connection_trigger_responses(conn);
367 if (conn->to_input != NULL) {
369 http_server_payload_finished(conn);
375 (conn->incoming_payload == NULL ||
376 !i_stream_have_bytes_left(conn->incoming_payload))) {
386 if (conn->incoming_payload == NULL) {
387 if (conn->conn.io == NULL && conn->to_input == NULL)
388 http_server_connection_input_resume(conn);
397 http_server_connection_ssl_init(struct http_server_connection *conn)
401 if (conn->server->set.debug)
402 http_server_connection_debug(conn, "Starting SSL handshake");
404 http_server_connection_input_halt(conn);
406 &conn->conn.input, &conn->conn.output,
407 &conn->ssl_iostream, &error) < 0) {
408 http_server_connection_error(conn,
409 "Couldn't initialize SSL server for %s: %s", conn->conn.name, error);
412 http_server_connection_input_resume(conn);
414 if (ssl_iostream_handshake(conn->ssl_iostream) < 0) {
415 http_server_connection_error(conn,"SSL handshake failed: %s",
416 ssl_iostream_get_last_error(conn->ssl_iostream));
420 http_server_connection_ready(conn);
425 http_server_connection_pipeline_is_full(struct http_server_connection *conn)
427 return (conn->request_queue_count >=
428 conn->server->set.max_pipelined_requests ||
429 conn->server->shutting_down);
434 struct http_server_connection *conn)
436 if (conn->server->shutting_down) {
437 http_server_connection_debug(conn,
439 conn->request_queue_count);
441 http_server_connection_debug(conn,
443 conn->request_queue_count,
444 conn->server->set.max_pipelined_requests);
446 http_server_connection_input_halt(conn);
450 http_server_connection_check_input(struct http_server_connection *conn)
452 struct istream *input = conn->conn.input;
463 http_server_connection_client_error(conn,
467 http_server_connection_close(&conn, "Read failure");
469 http_server_connection_debug(conn,
472 if (conn->request_queue_head == NULL) {
474 http_server_connection_close(&conn,
476 } else if (conn->request_queue_head->state <
479 http_server_connection_close(&conn,
484 conn->input_broken = TRUE;
485 http_server_connection_input_halt(conn);
494 http_server_connection_finish_request(struct http_server_connection *conn)
501 req = conn->request_queue_tail;
505 http_server_connection_debug(conn, "Finish receiving request");
508 (conn->http_parser, &error_code, &error);
510 !http_server_connection_check_input(conn))
513 http_server_connection_ref(conn);
515 http_server_connection_client_error(conn,
520 conn->input_broken = TRUE;
528 http_server_connection_unref(&conn);
541 struct http_server_connection *conn =
549 if (conn->server->shutting_down) {
550 if (!http_server_connection_shut_down(conn))
551 http_server_connection_pipeline_handle_full(conn);
555 i_assert(!conn->in_req_callback);
556 i_assert(!conn->input_broken && conn->incoming_payload == NULL);
557 i_assert(!conn->close_indicated);
559 http_server_connection_timeout_reset(conn);
561 if (conn->ssl && conn->ssl_iostream == NULL) {
562 if (http_server_connection_ssl_init(conn) < 0) {
564 http_server_connection_close(&conn, "SSL Initialization failed");
569 if (conn->to_input != NULL) {
575 http_server_payload_finished(conn);
579 if (!http_server_connection_finish_request(conn))
583 if (conn->request_queue_tail != NULL &&
584 conn->request_queue_tail->state == HTTP_SERVER_REQUEST_STATE_NEW) {
585 if (conn->request_queue_count >
586 conn->server->set.max_pipelined_requests) {
588 http_server_connection_pipeline_handle_full(conn);
592 req = conn->request_queue_tail;
594 if (conn->request_queue_count >=
595 conn->server->set.max_pipelined_requests) {
597 http_server_connection_pipeline_handle_full(conn);
601 req = http_server_request_new(conn);
606 while (!conn->close_indicated && ret != 0) {
607 http_server_connection_ref(conn);
608 while ((ret = http_request_parse_next (conn->http_parser,
611 conn->stats.request_count++;
612 http_server_connection_debug(conn,
616 conn->request_queue_count,
617 conn->server->set.max_pipelined_requests);
623 cont = http_server_connection_handle_request(conn, req);
633 http_server_connection_unref(&conn);
637 conn->close_indicated = TRUE;
643 if (conn->closed) {
648 if (conn->close_indicated) {
655 if (!http_server_connection_finish_request(conn)) {
656 http_server_connection_unref(&conn);
660 if (http_server_connection_pipeline_is_full(conn)) {
662 http_server_connection_pipeline_handle_full(conn);
663 http_server_connection_unref(&conn);
668 req = http_server_request_new(conn);
671 if (http_server_connection_unref_is_closed(conn)) {
677 !http_server_connection_check_input(conn))
681 http_server_connection_ref(conn);
683 http_server_connection_client_error(conn,
688 conn->input_broken = TRUE;
694 conn->input_broken = TRUE;
700 conn->input_broken = TRUE;
707 conn->input_broken = TRUE;
714 if (http_server_connection_unref_is_closed(conn)) {
720 if (conn->input_broken || conn->close_indicated) {
721 http_server_connection_input_halt(conn);
728 http_server_connection_discard_input(struct http_server_connection *conn)
730 struct http_server *server = conn->server;
738 (conn->http_parser, &error_code, &error);
741 !http_server_connection_check_input(conn)) {
747 http_server_connection_ref(conn);
749 http_server_connection_client_error(conn,
754 conn->input_broken = TRUE;
755 http_server_request_fail_close(conn->request_queue_head,
762 http_server_connection_unref(&conn);
772 struct http_server_connection *conn)
774 struct http_server *server = conn->server;
777 i_assert(conn->conn.io == NULL);
780 if (conn->payload_handler != NULL)
781 http_server_payload_handler_destroy(&conn->payload_handler);
784 if (conn->incoming_payload != NULL) {
785 i_stream_unref(&conn->incoming_payload);
786 conn->incoming_payload = NULL;
791 (conn->http_parser)) {
792 http_server_connection_debug(conn,
796 http_server_connection_switch_ioloop(conn);
799 conn->conn.io = io_add_istream(conn->conn.input,
800 http_server_connection_discard_input, conn);
801 http_server_connection_discard_input(conn);
804 io_remove(&conn->conn.io);
807 http_server_connection_switch_ioloop(conn);
811 http_server_connection_debug(conn,
816 http_server_connection_ref(conn);
817 (void)http_server_connection_check_input(conn);
818 return http_server_connection_unref_is_closed(conn) ? -1 : 0;
822 struct http_server_connection *conn)
824 struct ostream *output = conn->conn.output;
826 if (conn->closed)
831 http_server_connection_error(conn,
835 http_server_connection_close(&conn,
838 http_server_connection_debug(conn,
840 http_server_connection_close(&conn,
846 http_server_connection_next_response(struct http_server_connection *conn)
851 if (conn->output_locked)
854 req = conn->request_queue_head;
857 http_server_connection_debug(conn, "No more requests pending");
858 http_server_connection_timeout_start(conn);
864 http_server_connection_debug(conn,
866 http_server_connection_timeout_stop(conn);
869 http_server_connection_debug(conn,
871 http_server_connection_timeout_start(conn);
876 && conn->incoming_payload != NULL
881 struct ostream *output = conn->conn.output;
884 http_server_connection_handle_output_error(conn);
888 http_server_connection_debug(conn, "Sent 100 Continue");
897 http_server_connection_debug(conn,
899 http_server_connection_timeout_start(conn);
908 http_server_connection_timeout_reset(conn);
913 struct http_server_connection *conn)
915 http_server_connection_ref(conn);
919 while (!conn->closed && http_server_connection_next_response(conn));
921 if (http_server_connection_unref_is_closed(conn))
925 if (conn->incoming_payload == NULL &&
926 conn->request_queue_count < conn->server->set.max_pipelined_requests &&
927 !conn->server->shutting_down) {
928 http_server_connection_input_resume(conn);
934 int http_server_connection_flush(struct http_server_connection *conn)
936 struct ostream *output = conn->conn.output;
941 http_server_connection_handle_output_error(conn);
945 http_server_connection_timeout_reset(conn);
949 int http_server_connection_output(struct http_server_connection *conn)
952 http_server_connection_pipeline_is_full(conn);
955 if (http_server_connection_flush(conn) < 0)
958 if (!conn->output_locked) {
959 if (http_server_connection_send_responses(conn) < 0)
961 } else if (conn->request_queue_head != NULL) {
962 struct http_server_request *req = conn->request_queue_head;
965 http_server_connection_ref(conn);
970 if (http_server_connection_unref_is_closed(conn) || ret < 0)
973 if (!conn->output_locked) {
975 if (http_server_connection_send_responses(conn) < 0)
977 } else if (conn->io_resp_payload != NULL) {
979 http_server_connection_debug(conn,
982 http_server_connection_timeout_stop(conn);
985 http_server_connection_debug(conn,
988 http_server_connection_timeout_start(conn);
992 if (conn->server->shutting_down &&
993 http_server_connection_shut_down(conn))
996 if (!http_server_connection_pipeline_is_full(conn)) {
997 http_server_connection_input_resume(conn);
998 if (pipeline_was_full && conn->conn.io != NULL)
999 i_stream_set_input_pending(conn->conn.input, TRUE);
1006 struct http_server_connection *conn)
1008 o_stream_set_flush_pending(conn->conn.output, TRUE);
1012 http_server_connection_pending_payload(struct http_server_connection *conn)
1014 return http_request_parser_pending_payload(conn->http_parser);
1041 struct http_server_connection *conn;
1049 conn = i_new(struct http_server_connection, 1);
1050 conn->refcount = 1;
1051 conn->id = id++;
1052 conn->server = server;
1053 conn->ssl = ssl;
1054 conn->callbacks = callbacks;
1055 conn->context = context;
1098 (server->conn_list, &conn->conn, name, fd_in, fd_out);
1101 http_server_connection_ready(conn);
1102 http_server_connection_timeout_start(conn);
1104 http_server_connection_debug(conn, "Connection created");
1105 return conn;
1108 void http_server_connection_ref(struct http_server_connection *conn)
1110 i_assert(conn->refcount > 0);
1111 conn->refcount++;
1115 http_server_connection_disconnect(struct http_server_connection *conn,
1120 if (conn->closed)
1125 http_server_connection_debug(conn, "Disconnected: %s", reason);
1126 conn->disconnect_reason = i_strdup(reason);
1127 conn->closed = TRUE;
1130 http_server_connection_update_stats(conn);
1132 if (conn->incoming_payload != NULL) {
1134 i_stream_remove_destroy_callback(conn->incoming_payload,
1136 conn->incoming_payload = NULL;
1138 if (conn->payload_handler != NULL)
1139 http_server_payload_handler_destroy(&conn->payload_handler);
1142 req = conn->request_queue_head;
1149 timeout_remove(&conn->to_input);
1151 http_server_connection_timeout_stop(conn);
1152 io_remove(&conn->io_resp_payload);
1153 if (conn->conn.output != NULL)
1154 o_stream_uncork(conn->conn.output);
1156 if (conn->http_parser != NULL)
1157 http_request_parser_deinit(&conn->http_parser);
1158 connection_disconnect(&conn->conn);
1163 struct http_server_connection *conn = *_conn;
1165 i_assert(conn->refcount > 0);
1168 if (--conn->refcount > 0)
1171 http_server_connection_disconnect(conn, NULL);
1173 http_server_connection_debug(conn, "Connection destroy");
1175 if (conn->ssl_iostream != NULL)
1176 ssl_iostream_unref(&conn->ssl_iostream);
1177 connection_deinit(&conn->conn);
1179 if (conn->callbacks != NULL &&
1180 conn->callbacks->connection_destroy != NULL) T_BEGIN {
1181 conn->callbacks->connection_destroy
1182 (conn->context, conn->disconnect_reason);
1185 i_free(conn->disconnect_reason);
1186 i_free(conn);
1191 http_server_connection_unref_is_closed(struct http_server_connection *conn)
1193 bool closed = conn->closed;
1195 if (!http_server_connection_unref(&conn))
1203 struct http_server_connection *conn = *_conn;
1205 http_server_connection_disconnect(conn, reason);
1212 struct http_server_connection *conn = *_conn;
1216 http_server_connection_update_stats(conn);
1219 tunnel.input = conn->conn.input;
1220 tunnel.output = conn->conn.output;
1221 tunnel.fd_in = conn->conn.fd_in;
1222 tunnel.fd_out = conn->conn.fd_out;
1224 conn->conn.input = NULL;
1225 conn->conn.output = NULL;
1226 conn->conn.fd_in = conn->conn.fd_out = -1;
1232 void http_server_connection_switch_ioloop(struct http_server_connection *conn)
1234 if (conn->switching_ioloop)
1237 conn->switching_ioloop = TRUE;
1238 if (conn->to_input != NULL)
1239 conn->to_input = io_loop_move_timeout(&conn->to_input);
1240 if (conn->to_idle != NULL)
1241 conn->to_idle = io_loop_move_timeout(&conn->to_idle);
1242 if (conn->io_resp_payload != NULL)
1243 conn->io_resp_payload = io_loop_move_io(&conn->io_resp_payload);
1244 if (conn->payload_handler != NULL)
1245 http_server_payload_handler_switch_ioloop(conn->payload_handler);
1246 if (conn->incoming_payload != NULL)
1247 i_stream_switch_ioloop(conn->incoming_payload);
1248 connection_switch_ioloop(&conn->conn);
1249 conn->switching_ioloop = FALSE;