http-server.c revision 47fee1a942e4797548b1232354f6676b8ff809f4
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen/* Copyright (c) 2013-2016 Dovecot authors, see the included COPYING file */
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen#include "lib.h"
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch#include "net.h"
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch#include "str.h"
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch#include "hash.h"
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch#include "array.h"
a8741f46cb3cf40e58e3d47b263f238918243380Stephan Bosch#include "ioloop.h"
a8741f46cb3cf40e58e3d47b263f238918243380Stephan Bosch#include "istream.h"
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch#include "ostream.h"
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch#include "connection.h"
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch#include "dns-lookup.h"
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch#include "iostream-rawlog.h"
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch#include "iostream-ssl.h"
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch#include "http-url.h"
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen#include "http-server-private.h"
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen/*
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen * Server
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen */
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainenstruct http_server *http_server_init(const struct http_server_settings *set)
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen{
7af70f7646264a2f52b361f9ca78f08681acc4e2Stephan Bosch struct http_server *server;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch pool_t pool;
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen pool = pool_alloconly_create("http server", 1024);
9e7bf91667639a2390207ab4d90bf88e2afcec2aStephan Bosch server = p_new(pool, struct http_server, 1);
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen server->pool = pool;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen if (set->rawlog_dir != NULL && *set->rawlog_dir != '\0')
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen server->set.rawlog_dir = p_strdup(pool, set->rawlog_dir);
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen server->set.max_client_idle_time_msecs = set->max_client_idle_time_msecs;
c9779bb27bb927a49de946e66f178126ecd451b6Stephan Bosch server->set.max_pipelined_requests =
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch (set->max_pipelined_requests > 0 ? set->max_pipelined_requests : 1);
c9779bb27bb927a49de946e66f178126ecd451b6Stephan Bosch server->set.request_limits = set->request_limits;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch server->set.socket_send_buffer_size = set->socket_send_buffer_size;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch server->set.socket_recv_buffer_size = set->socket_recv_buffer_size;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch server->set.debug = set->debug;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch server->conn_list = http_server_connection_list_init();
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch return server;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch}
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschvoid http_server_deinit(struct http_server **_server)
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch{
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch struct http_server *server = *_server;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch *_server = NULL;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch connection_list_deinit(&server->conn_list);
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch if (server->ssl_ctx != NULL)
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch ssl_iostream_context_deinit(&server->ssl_ctx);
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch pool_unref(&server->pool);
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch}
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschvoid http_server_switch_ioloop(struct http_server *server)
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch{
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch struct connection *_conn = server->conn_list->connections;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch /* move connections */
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch /* FIXME: we wouldn't necessarily need to switch all of them
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch immediately, only those that have requests now. but also connections
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch that get new requests before ioloop is switched again.. */
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen for (; _conn != NULL; _conn = _conn->next) {
struct http_server_connection *conn =
(struct http_server_connection *)_conn;
http_server_connection_switch_ioloop(conn);
}
}
void http_server_shut_down(struct http_server *server)
{
struct connection *_conn, *_next;
server->shutting_down = TRUE;
for (_conn = server->conn_list->connections;
_conn != NULL; _conn = _next) {
struct http_server_connection *conn =
(struct http_server_connection *)_conn;
_next = _conn->next;
(void)http_server_connection_shut_down(conn);
}
}