#include "http-date.h"
#include "http-url.h"
#include "http-request-parser.h"
+#include "settings.h"
#include "http-server-private.h"
struct http_server_connection *conn)
{
unsigned int timeout_msecs =
- conn->server->set.max_client_idle_time_msecs;
+ conn->set->max_client_idle_time_msecs;
if (conn->to_idle == NULL && timeout_msecs > 0) {
conn->to_idle = timeout_add(timeout_msecs,
static void http_server_connection_ready(struct http_server_connection *conn)
{
- const struct http_server_settings *set = &conn->server->set;
+ const struct http_server_settings *set = conn->set;
struct http_url base_url;
struct stat st;
- if (conn->server->set.rawlog_dir != NULL &&
- stat(conn->server->set.rawlog_dir, &st) == 0) {
- iostream_rawlog_create(conn->server->set.rawlog_dir,
+ if (set->rawlog_dir != NULL &&
+ stat(set->rawlog_dir, &st) == 0) {
+ iostream_rawlog_create(set->rawlog_dir,
&conn->conn.input, &conn->conn.output);
}
http_server_connection_handle_request(struct http_server_connection *conn,
struct http_server_request *req)
{
- const struct http_server_settings *set = &conn->server->set;
+ const struct http_server_settings *set = conn->set;
unsigned int old_refcount;
struct istream *payload;
e_debug(conn->event, "Starting SSL handshake");
http_server_connection_input_halt(conn);
- if (server->set.ssl == NULL) {
+ if (conn->set->ssl == NULL) {
ret = io_stream_autocreate_ssl_server(server->event,
&conn->conn.input,
&conn->conn.output,
&conn->ssl_iostream,
&error);
- } else if (ssl_iostream_server_context_cache_get(server->set.ssl,
+ } else if (ssl_iostream_server_context_cache_get(conn->set->ssl,
&ssl_ctx, &error) < 0)
ret = -1;
else {
http_server_connection_pipeline_is_full(struct http_server_connection *conn)
{
return ((conn->request_queue_count >=
- conn->server->set.max_pipelined_requests) ||
+ conn->set->max_pipelined_requests) ||
conn->server->shutting_down);
}
e_debug(conn->event, "Pipeline full "
"(%u requests pending; %u maximum)",
conn->request_queue_count,
- conn->server->set.max_pipelined_requests);
+ conn->set->max_pipelined_requests);
}
http_server_connection_input_halt(conn);
}
if (conn->request_queue_tail != NULL &&
conn->request_queue_tail->state == HTTP_SERVER_REQUEST_STATE_NEW) {
if (conn->request_queue_count >
- conn->server->set.max_pipelined_requests) {
+ conn->set->max_pipelined_requests) {
/* Pipeline full */
http_server_connection_pipeline_handle_full(conn);
return;
req = conn->request_queue_tail;
} else {
if (conn->request_queue_count >=
- conn->server->set.max_pipelined_requests) {
+ conn->set->max_pipelined_requests) {
/* Pipeline full */
http_server_connection_pipeline_handle_full(conn);
return;
/* Accept more requests if possible */
if (conn->incoming_payload == NULL &&
(conn->request_queue_count <
- conn->server->set.max_pipelined_requests) &&
+ conn->set->max_pipelined_requests) &&
!conn->server->shutting_down)
http_server_connection_input_resume(conn);
const struct http_server_callbacks *callbacks,
void *context)
{
- const struct http_server_settings *set = &server->set;
struct http_server_connection *conn;
struct event *conn_event;
conn = i_new(struct http_server_connection, 1);
conn->refcount = 1;
conn->server = server;
+ conn->set = &server->set;
+ pool_ref(server->set.pool);
conn->ioloop = current_ioloop;
conn->ssl = ssl;
conn->callbacks = callbacks;
net_set_nonblock(fd_out, TRUE);
(void)net_set_tcp_nodelay(fd_out, TRUE);
- if (set->socket_send_buffer_size > 0 &&
+ if (conn->set->socket_send_buffer_size > 0 &&
net_set_send_buffer_size(fd_out,
- set->socket_send_buffer_size) < 0) {
+ conn->set->socket_send_buffer_size) < 0) {
e_error(conn->event,
"net_set_send_buffer_size(%zu) failed: %m",
- set->socket_send_buffer_size);
+ conn->set->socket_send_buffer_size);
}
- if (set->socket_recv_buffer_size > 0 &&
+ if (conn->set->socket_recv_buffer_size > 0 &&
net_set_recv_buffer_size(fd_in,
- set->socket_recv_buffer_size) < 0) {
+ conn->set->socket_recv_buffer_size) < 0) {
e_error(conn->event,
"net_set_recv_buffer_size(%zu) failed: %m",
- set->socket_recv_buffer_size);
+ conn->set->socket_recv_buffer_size);
}
conn_event = event_create(server->event);
conn->disconnect_reason);
} T_END;
+ settings_free(conn->set);
i_free(conn->disconnect_reason);
i_free(conn);
return FALSE;