http-server.c revision f9d2a1f21ad65262bc630f0834d7eead06a1bac3
a8c5a86d183db25a57bf193c06b41e092ec2e151Timo Sirainen/* Copyright (c) 2013-2016 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "lib.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "net.h"
7e209b78ca757294dbbc15604c88673b3a6b0c39Timo Sirainen#include "str.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "hash.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "array.h"
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen#include "ioloop.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "istream.h"
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen#include "ostream.h"
7a7d2aa11e46195e2d92d6c337d7e78052a5ce67Timo Sirainen#include "connection.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "dns-lookup.h"
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen#include "iostream-rawlog.h"
a8fe899601735459641edae975c0fa08be8482e2Timo Sirainen#include "iostream-ssl.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "http-url.h"
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "http-server-private.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/*
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen * Server
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct http_server *http_server_init(const struct http_server_settings *set)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct http_server *server;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen pool_t pool;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen pool = pool_alloconly_create("http server", 1024);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen server = p_new(pool, struct http_server, 1);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen server->pool = pool;
8a524e87e44ae629cf90262e92f7972ea3450c35Timo Sirainen if (set->rawlog_dir != NULL && *set->rawlog_dir != '\0')
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen server->set.rawlog_dir = p_strdup(pool, set->rawlog_dir);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen server->set.max_client_idle_time_msecs = set->max_client_idle_time_msecs;
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen server->set.max_pipelined_requests =
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen (set->max_pipelined_requests > 0 ? set->max_pipelined_requests : 1);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen server->set.request_limits = set->request_limits;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen server->set.debug = set->debug;
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen server->conn_list = http_server_connection_list_init();
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen return server;
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid http_server_deinit(struct http_server **_server)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen struct http_server *server = *_server;
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen *_server = NULL;
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen connection_list_deinit(&server->conn_list);
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (server->ssl_ctx != NULL)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ssl_iostream_context_deinit(&server->ssl_ctx);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen pool_unref(&server->pool);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen}
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid http_server_switch_ioloop(struct http_server *server)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen struct connection *_conn = server->conn_list->connections;
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen /* move connections */
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainen /* FIXME: we wouldn't necessarily need to switch all of them
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen immediately, only those that have requests now. but also connections
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen that get new requests before ioloop is switched again.. */
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen for (; _conn != NULL; _conn = _conn->next) {
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen struct http_server_connection *conn =
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen (struct http_server_connection *)_conn;
428fb4dc39c6e9b2eb36216c396dad6096a65f8fTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen http_server_connection_switch_ioloop(conn);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen