2012-06-04 16:48:31 +02:00
|
|
|
/*
|
2014-03-30 12:09:21 +02:00
|
|
|
* nghttp2 - HTTP/2 C Library
|
2012-06-04 16:48:31 +02:00
|
|
|
*
|
|
|
|
* Copyright (c) 2012 Tatsuhiro Tsujikawa
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
|
|
* a copy of this software and associated documentation files (the
|
|
|
|
* "Software"), to deal in the Software without restriction, including
|
|
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
|
|
* the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be
|
|
|
|
* included in all copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
|
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
|
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
|
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
#ifndef SHRPX_CONFIG_H
|
|
|
|
#define SHRPX_CONFIG_H
|
|
|
|
|
2012-06-04 20:11:43 +02:00
|
|
|
#include "shrpx.h"
|
|
|
|
|
2012-06-04 16:48:31 +02:00
|
|
|
#include <sys/types.h>
|
2015-05-13 15:30:35 +02:00
|
|
|
#ifdef HAVE_SYS_SOCKET_H
|
2012-06-04 16:48:31 +02:00
|
|
|
#include <sys/socket.h>
|
2015-05-13 15:30:35 +02:00
|
|
|
#endif // HAVE_SYS_SOCKET_H
|
2015-02-22 04:27:51 +01:00
|
|
|
#include <sys/un.h>
|
2015-05-13 15:30:35 +02:00
|
|
|
#ifdef HAVE_NETINET_IN_H
|
2012-06-04 16:48:31 +02:00
|
|
|
#include <netinet/in.h>
|
2015-05-13 15:30:35 +02:00
|
|
|
#endif // HAVE_NETINET_IN_H
|
|
|
|
#ifdef HAVE_ARPA_INET_H
|
2012-06-04 16:48:31 +02:00
|
|
|
#include <arpa/inet.h>
|
2015-05-13 15:30:35 +02:00
|
|
|
#endif // HAVE_ARPA_INET_H
|
2015-05-13 17:17:45 +02:00
|
|
|
#include <cinttypes>
|
2013-11-17 15:52:19 +01:00
|
|
|
#include <cstdio>
|
2013-02-06 15:27:05 +01:00
|
|
|
#include <vector>
|
2014-04-08 15:44:30 +02:00
|
|
|
#include <memory>
|
2015-07-13 14:44:06 +02:00
|
|
|
#include <set>
|
2013-02-06 15:27:05 +01:00
|
|
|
|
|
|
|
#include <openssl/ssl.h>
|
2012-06-04 16:48:31 +02:00
|
|
|
|
2014-12-27 18:59:06 +01:00
|
|
|
#include <ev.h>
|
|
|
|
|
2014-04-04 14:57:47 +02:00
|
|
|
#include <nghttp2/nghttp2.h>
|
|
|
|
|
2015-09-25 19:38:45 +02:00
|
|
|
#include "shrpx_router.h"
|
2015-07-14 15:40:33 +02:00
|
|
|
#include "template.h"
|
2016-02-13 14:19:05 +01:00
|
|
|
#include "http2.h"
|
2016-02-21 07:28:11 +01:00
|
|
|
#include "network.h"
|
2015-07-14 15:40:33 +02:00
|
|
|
|
|
|
|
using namespace nghttp2;
|
|
|
|
|
2012-06-04 16:48:31 +02:00
|
|
|
namespace shrpx {
|
|
|
|
|
2014-11-18 16:56:44 +01:00
|
|
|
struct LogFragment;
|
2016-02-21 06:53:06 +01:00
|
|
|
class ConnectBlocker;
|
2016-02-27 11:39:03 +01:00
|
|
|
class Http2Session;
|
2014-11-18 16:56:44 +01:00
|
|
|
|
2013-02-06 15:27:05 +01:00
|
|
|
namespace ssl {
|
|
|
|
|
2015-02-02 14:47:12 +01:00
|
|
|
class CertLookupTree;
|
2013-02-06 15:27:05 +01:00
|
|
|
|
|
|
|
} // namespace ssl
|
|
|
|
|
2016-03-24 13:05:02 +01:00
|
|
|
constexpr auto SHRPX_OPT_PRIVATE_KEY_FILE =
|
|
|
|
StringRef::from_lit("private-key-file");
|
|
|
|
constexpr auto SHRPX_OPT_PRIVATE_KEY_PASSWD_FILE =
|
|
|
|
StringRef::from_lit("private-key-passwd-file");
|
|
|
|
constexpr auto SHRPX_OPT_CERTIFICATE_FILE =
|
|
|
|
StringRef::from_lit("certificate-file");
|
|
|
|
constexpr auto SHRPX_OPT_DH_PARAM_FILE = StringRef::from_lit("dh-param-file");
|
|
|
|
constexpr auto SHRPX_OPT_SUBCERT = StringRef::from_lit("subcert");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND = StringRef::from_lit("backend");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND = StringRef::from_lit("frontend");
|
|
|
|
constexpr auto SHRPX_OPT_WORKERS = StringRef::from_lit("workers");
|
|
|
|
constexpr auto SHRPX_OPT_HTTP2_MAX_CONCURRENT_STREAMS =
|
|
|
|
StringRef::from_lit("http2-max-concurrent-streams");
|
|
|
|
constexpr auto SHRPX_OPT_LOG_LEVEL = StringRef::from_lit("log-level");
|
|
|
|
constexpr auto SHRPX_OPT_DAEMON = StringRef::from_lit("daemon");
|
|
|
|
constexpr auto SHRPX_OPT_HTTP2_PROXY = StringRef::from_lit("http2-proxy");
|
|
|
|
constexpr auto SHRPX_OPT_HTTP2_BRIDGE = StringRef::from_lit("http2-bridge");
|
|
|
|
constexpr auto SHRPX_OPT_CLIENT_PROXY = StringRef::from_lit("client-proxy");
|
|
|
|
constexpr auto SHRPX_OPT_ADD_X_FORWARDED_FOR =
|
|
|
|
StringRef::from_lit("add-x-forwarded-for");
|
|
|
|
constexpr auto SHRPX_OPT_STRIP_INCOMING_X_FORWARDED_FOR =
|
|
|
|
StringRef::from_lit("strip-incoming-x-forwarded-for");
|
|
|
|
constexpr auto SHRPX_OPT_NO_VIA = StringRef::from_lit("no-via");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_READ_TIMEOUT =
|
|
|
|
StringRef::from_lit("frontend-http2-read-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_READ_TIMEOUT =
|
|
|
|
StringRef::from_lit("frontend-read-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_WRITE_TIMEOUT =
|
|
|
|
StringRef::from_lit("frontend-write-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_READ_TIMEOUT =
|
|
|
|
StringRef::from_lit("backend-read-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_WRITE_TIMEOUT =
|
|
|
|
StringRef::from_lit("backend-write-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_STREAM_READ_TIMEOUT =
|
|
|
|
StringRef::from_lit("stream-read-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_STREAM_WRITE_TIMEOUT =
|
|
|
|
StringRef::from_lit("stream-write-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_ACCESSLOG_FILE = StringRef::from_lit("accesslog-file");
|
|
|
|
constexpr auto SHRPX_OPT_ACCESSLOG_SYSLOG =
|
|
|
|
StringRef::from_lit("accesslog-syslog");
|
|
|
|
constexpr auto SHRPX_OPT_ACCESSLOG_FORMAT =
|
|
|
|
StringRef::from_lit("accesslog-format");
|
|
|
|
constexpr auto SHRPX_OPT_ERRORLOG_FILE = StringRef::from_lit("errorlog-file");
|
|
|
|
constexpr auto SHRPX_OPT_ERRORLOG_SYSLOG =
|
|
|
|
StringRef::from_lit("errorlog-syslog");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_KEEP_ALIVE_TIMEOUT =
|
|
|
|
StringRef::from_lit("backend-keep-alive-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_WINDOW_BITS =
|
|
|
|
StringRef::from_lit("frontend-http2-window-bits");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP2_WINDOW_BITS =
|
|
|
|
StringRef::from_lit("backend-http2-window-bits");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_CONNECTION_WINDOW_BITS =
|
|
|
|
StringRef::from_lit("frontend-http2-connection-window-bits");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP2_CONNECTION_WINDOW_BITS =
|
|
|
|
StringRef::from_lit("backend-http2-connection-window-bits");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_NO_TLS =
|
|
|
|
StringRef::from_lit("frontend-no-tls");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_NO_TLS = StringRef::from_lit("backend-no-tls");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_TLS_SNI_FIELD =
|
|
|
|
StringRef::from_lit("backend-tls-sni-field");
|
|
|
|
constexpr auto SHRPX_OPT_PID_FILE = StringRef::from_lit("pid-file");
|
|
|
|
constexpr auto SHRPX_OPT_USER = StringRef::from_lit("user");
|
|
|
|
constexpr auto SHRPX_OPT_SYSLOG_FACILITY =
|
|
|
|
StringRef::from_lit("syslog-facility");
|
|
|
|
constexpr auto SHRPX_OPT_BACKLOG = StringRef::from_lit("backlog");
|
|
|
|
constexpr auto SHRPX_OPT_CIPHERS = StringRef::from_lit("ciphers");
|
|
|
|
constexpr auto SHRPX_OPT_CLIENT = StringRef::from_lit("client");
|
|
|
|
constexpr auto SHRPX_OPT_INSECURE = StringRef::from_lit("insecure");
|
|
|
|
constexpr auto SHRPX_OPT_CACERT = StringRef::from_lit("cacert");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_IPV4 = StringRef::from_lit("backend-ipv4");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_IPV6 = StringRef::from_lit("backend-ipv6");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP_PROXY_URI =
|
|
|
|
StringRef::from_lit("backend-http-proxy-uri");
|
|
|
|
constexpr auto SHRPX_OPT_READ_RATE = StringRef::from_lit("read-rate");
|
|
|
|
constexpr auto SHRPX_OPT_READ_BURST = StringRef::from_lit("read-burst");
|
|
|
|
constexpr auto SHRPX_OPT_WRITE_RATE = StringRef::from_lit("write-rate");
|
|
|
|
constexpr auto SHRPX_OPT_WRITE_BURST = StringRef::from_lit("write-burst");
|
|
|
|
constexpr auto SHRPX_OPT_WORKER_READ_RATE =
|
|
|
|
StringRef::from_lit("worker-read-rate");
|
|
|
|
constexpr auto SHRPX_OPT_WORKER_READ_BURST =
|
|
|
|
StringRef::from_lit("worker-read-burst");
|
|
|
|
constexpr auto SHRPX_OPT_WORKER_WRITE_RATE =
|
|
|
|
StringRef::from_lit("worker-write-rate");
|
|
|
|
constexpr auto SHRPX_OPT_WORKER_WRITE_BURST =
|
|
|
|
StringRef::from_lit("worker-write-burst");
|
|
|
|
constexpr auto SHRPX_OPT_NPN_LIST = StringRef::from_lit("npn-list");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_PROTO_LIST = StringRef::from_lit("tls-proto-list");
|
|
|
|
constexpr auto SHRPX_OPT_VERIFY_CLIENT = StringRef::from_lit("verify-client");
|
|
|
|
constexpr auto SHRPX_OPT_VERIFY_CLIENT_CACERT =
|
|
|
|
StringRef::from_lit("verify-client-cacert");
|
|
|
|
constexpr auto SHRPX_OPT_CLIENT_PRIVATE_KEY_FILE =
|
|
|
|
StringRef::from_lit("client-private-key-file");
|
|
|
|
constexpr auto SHRPX_OPT_CLIENT_CERT_FILE =
|
|
|
|
StringRef::from_lit("client-cert-file");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_DUMP_REQUEST_HEADER =
|
|
|
|
StringRef::from_lit("frontend-http2-dump-request-header");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_DUMP_RESPONSE_HEADER =
|
|
|
|
StringRef::from_lit("frontend-http2-dump-response-header");
|
|
|
|
constexpr auto SHRPX_OPT_HTTP2_NO_COOKIE_CRUMBLING =
|
|
|
|
StringRef::from_lit("http2-no-cookie-crumbling");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_FRAME_DEBUG =
|
|
|
|
StringRef::from_lit("frontend-frame-debug");
|
|
|
|
constexpr auto SHRPX_OPT_PADDING = StringRef::from_lit("padding");
|
|
|
|
constexpr auto SHRPX_OPT_ALTSVC = StringRef::from_lit("altsvc");
|
|
|
|
constexpr auto SHRPX_OPT_ADD_REQUEST_HEADER =
|
|
|
|
StringRef::from_lit("add-request-header");
|
|
|
|
constexpr auto SHRPX_OPT_ADD_RESPONSE_HEADER =
|
|
|
|
StringRef::from_lit("add-response-header");
|
|
|
|
constexpr auto SHRPX_OPT_WORKER_FRONTEND_CONNECTIONS =
|
|
|
|
StringRef::from_lit("worker-frontend-connections");
|
|
|
|
constexpr auto SHRPX_OPT_NO_LOCATION_REWRITE =
|
|
|
|
StringRef::from_lit("no-location-rewrite");
|
|
|
|
constexpr auto SHRPX_OPT_NO_HOST_REWRITE =
|
|
|
|
StringRef::from_lit("no-host-rewrite");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP1_CONNECTIONS_PER_HOST =
|
|
|
|
StringRef::from_lit("backend-http1-connections-per-host");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP1_CONNECTIONS_PER_FRONTEND =
|
|
|
|
StringRef::from_lit("backend-http1-connections-per-frontend");
|
|
|
|
constexpr auto SHRPX_OPT_LISTENER_DISABLE_TIMEOUT =
|
|
|
|
StringRef::from_lit("listener-disable-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_FILE =
|
|
|
|
StringRef::from_lit("tls-ticket-key-file");
|
|
|
|
constexpr auto SHRPX_OPT_RLIMIT_NOFILE = StringRef::from_lit("rlimit-nofile");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_REQUEST_BUFFER =
|
|
|
|
StringRef::from_lit("backend-request-buffer");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_RESPONSE_BUFFER =
|
|
|
|
StringRef::from_lit("backend-response-buffer");
|
|
|
|
constexpr auto SHRPX_OPT_NO_SERVER_PUSH = StringRef::from_lit("no-server-push");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP2_CONNECTIONS_PER_WORKER =
|
|
|
|
StringRef::from_lit("backend-http2-connections-per-worker");
|
|
|
|
constexpr auto SHRPX_OPT_FETCH_OCSP_RESPONSE_FILE =
|
|
|
|
StringRef::from_lit("fetch-ocsp-response-file");
|
|
|
|
constexpr auto SHRPX_OPT_OCSP_UPDATE_INTERVAL =
|
|
|
|
StringRef::from_lit("ocsp-update-interval");
|
|
|
|
constexpr auto SHRPX_OPT_NO_OCSP = StringRef::from_lit("no-ocsp");
|
|
|
|
constexpr auto SHRPX_OPT_HEADER_FIELD_BUFFER =
|
|
|
|
StringRef::from_lit("header-field-buffer");
|
|
|
|
constexpr auto SHRPX_OPT_MAX_HEADER_FIELDS =
|
|
|
|
StringRef::from_lit("max-header-fields");
|
|
|
|
constexpr auto SHRPX_OPT_INCLUDE = StringRef::from_lit("include");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_CIPHER =
|
|
|
|
StringRef::from_lit("tls-ticket-key-cipher");
|
|
|
|
constexpr auto SHRPX_OPT_HOST_REWRITE = StringRef::from_lit("host-rewrite");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED =
|
|
|
|
StringRef::from_lit("tls-session-cache-memcached");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED =
|
|
|
|
StringRef::from_lit("tls-ticket-key-memcached");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_INTERVAL =
|
|
|
|
StringRef::from_lit("tls-ticket-key-memcached-interval");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_MAX_RETRY =
|
|
|
|
StringRef::from_lit("tls-ticket-key-memcached-max-retry");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_MAX_FAIL =
|
|
|
|
StringRef::from_lit("tls-ticket-key-memcached-max-fail");
|
|
|
|
constexpr auto SHRPX_OPT_MRUBY_FILE = StringRef::from_lit("mruby-file");
|
|
|
|
constexpr auto SHRPX_OPT_ACCEPT_PROXY_PROTOCOL =
|
|
|
|
StringRef::from_lit("accept-proxy-protocol");
|
|
|
|
constexpr auto SHRPX_OPT_FASTOPEN = StringRef::from_lit("fastopen");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_DYN_REC_WARMUP_THRESHOLD =
|
|
|
|
StringRef::from_lit("tls-dyn-rec-warmup-threshold");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_DYN_REC_IDLE_TIMEOUT =
|
|
|
|
StringRef::from_lit("tls-dyn-rec-idle-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_ADD_FORWARDED = StringRef::from_lit("add-forwarded");
|
|
|
|
constexpr auto SHRPX_OPT_STRIP_INCOMING_FORWARDED =
|
|
|
|
StringRef::from_lit("strip-incoming-forwarded");
|
|
|
|
constexpr auto SHRPX_OPT_FORWARDED_BY = StringRef::from_lit("forwarded-by");
|
|
|
|
constexpr auto SHRPX_OPT_FORWARDED_FOR = StringRef::from_lit("forwarded-for");
|
|
|
|
constexpr auto SHRPX_OPT_REQUEST_HEADER_FIELD_BUFFER =
|
|
|
|
StringRef::from_lit("request-header-field-buffer");
|
|
|
|
constexpr auto SHRPX_OPT_MAX_REQUEST_HEADER_FIELDS =
|
|
|
|
StringRef::from_lit("max-request-header-fields");
|
|
|
|
constexpr auto SHRPX_OPT_RESPONSE_HEADER_FIELD_BUFFER =
|
|
|
|
StringRef::from_lit("response-header-field-buffer");
|
|
|
|
constexpr auto SHRPX_OPT_MAX_RESPONSE_HEADER_FIELDS =
|
|
|
|
StringRef::from_lit("max-response-header-fields");
|
|
|
|
constexpr auto SHRPX_OPT_NO_HTTP2_CIPHER_BLACK_LIST =
|
|
|
|
StringRef::from_lit("no-http2-cipher-black-list");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP1_TLS =
|
|
|
|
StringRef::from_lit("backend-http1-tls");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED_TLS =
|
|
|
|
StringRef::from_lit("tls-session-cache-memcached-tls");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED_CERT_FILE =
|
|
|
|
StringRef::from_lit("tls-session-cache-memcached-cert-file");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED_PRIVATE_KEY_FILE =
|
|
|
|
StringRef::from_lit("tls-session-cache-memcached-private-key-file");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_SESSION_CACHE_MEMCACHED_ADDRESS_FAMILY =
|
|
|
|
StringRef::from_lit("tls-session-cache-memcached-address-family");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_TLS =
|
|
|
|
StringRef::from_lit("tls-ticket-key-memcached-tls");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_CERT_FILE =
|
|
|
|
StringRef::from_lit("tls-ticket-key-memcached-cert-file");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_PRIVATE_KEY_FILE =
|
|
|
|
StringRef::from_lit("tls-ticket-key-memcached-private-key-file");
|
|
|
|
constexpr auto SHRPX_OPT_TLS_TICKET_KEY_MEMCACHED_ADDRESS_FAMILY =
|
|
|
|
StringRef::from_lit("tls-ticket-key-memcached-address-family");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_ADDRESS_FAMILY =
|
|
|
|
StringRef::from_lit("backend-address-family");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_MAX_CONCURRENT_STREAMS =
|
|
|
|
StringRef::from_lit("frontend-http2-max-concurrent-streams");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP2_MAX_CONCURRENT_STREAMS =
|
|
|
|
StringRef::from_lit("backend-http2-max-concurrent-streams");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_CONNECTIONS_PER_FRONTEND =
|
|
|
|
StringRef::from_lit("backend-connections-per-frontend");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_TLS = StringRef::from_lit("backend-tls");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_CONNECTIONS_PER_HOST =
|
|
|
|
StringRef::from_lit("backend-connections-per-host");
|
|
|
|
constexpr auto SHRPX_OPT_ERROR_PAGE = StringRef::from_lit("error-page");
|
2016-05-06 16:10:09 +02:00
|
|
|
constexpr auto SHRPX_OPT_NO_KQUEUE = StringRef::from_lit("no-kqueue");
|
2016-05-21 07:13:57 +02:00
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_SETTINGS_TIMEOUT =
|
|
|
|
StringRef::from_lit("frontend-http2-settings-timeout");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP2_SETTINGS_TIMEOUT =
|
|
|
|
StringRef::from_lit("backend-http2-settings-timeout");
|
2016-06-04 10:24:54 +02:00
|
|
|
constexpr auto SHRPX_OPT_API_MAX_REQUEST_BODY =
|
|
|
|
StringRef::from_lit("api-max-request-body");
|
2016-06-21 17:13:43 +02:00
|
|
|
constexpr auto SHRPX_OPT_BACKEND_MAX_BACKOFF =
|
|
|
|
StringRef::from_lit("backend-max-backoff");
|
2016-08-26 15:28:09 +02:00
|
|
|
constexpr auto SHRPX_OPT_SERVER_NAME = StringRef::from_lit("server-name");
|
2016-08-31 16:47:15 +02:00
|
|
|
constexpr auto SHRPX_OPT_NO_SERVER_REWRITE =
|
|
|
|
StringRef::from_lit("no-server-rewrite");
|
2016-09-08 15:49:36 +02:00
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_OPTIMIZE_WRITE_BUFFER_SIZE =
|
|
|
|
StringRef::from_lit("frontend-http2-optimize-write-buffer-size");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_OPTIMIZE_WINDOW_SIZE =
|
|
|
|
StringRef::from_lit("frontend-http2-optimize-window-size");
|
2016-09-09 14:05:37 +02:00
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_WINDOW_SIZE =
|
|
|
|
StringRef::from_lit("frontend-http2-window-size");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_CONNECTION_WINDOW_SIZE =
|
|
|
|
StringRef::from_lit("frontend-http2-connection-window-size");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP2_WINDOW_SIZE =
|
|
|
|
StringRef::from_lit("backend-http2-window-size");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP2_CONNECTION_WINDOW_SIZE =
|
|
|
|
StringRef::from_lit("backend-http2-connection-window-size");
|
2016-09-12 15:53:02 +02:00
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_ENCODER_DYNAMIC_TABLE_SIZE =
|
|
|
|
StringRef::from_lit("frontend-http2-encoder-dynamic-table-size");
|
|
|
|
constexpr auto SHRPX_OPT_FRONTEND_HTTP2_DECODER_DYNAMIC_TABLE_SIZE =
|
|
|
|
StringRef::from_lit("frontend-http2-decoder-dynamic-table-size");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP2_ENCODER_DYNAMIC_TABLE_SIZE =
|
|
|
|
StringRef::from_lit("backend-http2-encoder-dynamic-table-size");
|
|
|
|
constexpr auto SHRPX_OPT_BACKEND_HTTP2_DECODER_DYNAMIC_TABLE_SIZE =
|
|
|
|
StringRef::from_lit("backend-http2-decoder-dynamic-table-size");
|
2016-01-15 15:04:58 +01:00
|
|
|
|
|
|
|
constexpr size_t SHRPX_OBFUSCATED_NODE_LENGTH = 8;
|
2012-08-01 17:06:41 +02:00
|
|
|
|
2016-06-02 17:22:55 +02:00
|
|
|
constexpr char DEFAULT_DOWNSTREAM_HOST[] = "127.0.0.1";
|
|
|
|
constexpr int16_t DEFAULT_DOWNSTREAM_PORT = 80;
|
|
|
|
|
2016-02-28 08:56:14 +01:00
|
|
|
enum shrpx_proto { PROTO_NONE, PROTO_HTTP1, PROTO_HTTP2, PROTO_MEMCACHED };
|
2013-02-22 13:54:07 +01:00
|
|
|
|
2016-06-09 15:35:59 +02:00
|
|
|
enum shrpx_session_affinity {
|
|
|
|
// No session affinity
|
|
|
|
AFFINITY_NONE,
|
|
|
|
// Client IP affinity
|
|
|
|
AFFINITY_IP,
|
|
|
|
};
|
|
|
|
|
2016-01-15 15:04:58 +01:00
|
|
|
enum shrpx_forwarded_param {
|
|
|
|
FORWARDED_NONE = 0,
|
|
|
|
FORWARDED_BY = 0x1,
|
|
|
|
FORWARDED_FOR = 0x2,
|
|
|
|
FORWARDED_HOST = 0x4,
|
|
|
|
FORWARDED_PROTO = 0x8,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum shrpx_forwarded_node_type {
|
|
|
|
FORWARDED_NODE_OBFUSCATED,
|
|
|
|
FORWARDED_NODE_IP,
|
|
|
|
};
|
|
|
|
|
2014-04-08 15:28:50 +02:00
|
|
|
struct AltSvc {
|
2015-07-20 15:37:26 +02:00
|
|
|
std::string protocol_id, host, origin, service;
|
2014-04-08 15:28:50 +02:00
|
|
|
|
|
|
|
uint16_t port;
|
|
|
|
};
|
|
|
|
|
2016-06-16 16:30:35 +02:00
|
|
|
enum UpstreamAltMode {
|
|
|
|
// No alternative mode
|
|
|
|
ALTMODE_NONE,
|
|
|
|
// API processing mode
|
|
|
|
ALTMODE_API,
|
2016-06-16 17:00:37 +02:00
|
|
|
// Health monitor mode
|
|
|
|
ALTMODE_HEALTHMON,
|
2016-06-16 16:30:35 +02:00
|
|
|
};
|
|
|
|
|
2016-02-07 09:51:53 +01:00
|
|
|
struct UpstreamAddr {
|
2016-01-31 11:41:56 +01:00
|
|
|
// The frontend address (e.g., FQDN, hostname, IP address). If
|
|
|
|
// |host_unix| is true, this is UNIX domain socket path.
|
|
|
|
ImmutableString host;
|
|
|
|
// For TCP socket, this is <IP address>:<PORT>. For IPv6 address,
|
|
|
|
// address is surrounded by square brackets. If socket is UNIX
|
|
|
|
// domain socket, this is "localhost".
|
|
|
|
ImmutableString hostport;
|
|
|
|
// frontend port. 0 if |host_unix| is true.
|
|
|
|
uint16_t port;
|
|
|
|
// For TCP socket, this is either AF_INET or AF_INET6. For UNIX
|
|
|
|
// domain socket, this is 0.
|
|
|
|
int family;
|
2016-06-16 16:30:35 +02:00
|
|
|
// Alternate mode
|
|
|
|
int alt_mode;
|
2016-01-31 11:41:56 +01:00
|
|
|
// true if |host| contains UNIX domain socket path.
|
|
|
|
bool host_unix;
|
2016-03-23 15:56:09 +01:00
|
|
|
// true if TLS is enabled.
|
|
|
|
bool tls;
|
2016-01-31 11:41:56 +01:00
|
|
|
int fd;
|
|
|
|
};
|
|
|
|
|
2016-02-27 15:24:14 +01:00
|
|
|
struct DownstreamAddrConfig {
|
2015-07-26 18:41:10 +02:00
|
|
|
Address addr;
|
2015-02-22 09:12:00 +01:00
|
|
|
// backend address. If |host_unix| is true, this is UNIX domain
|
|
|
|
// socket path.
|
2016-01-17 03:33:45 +01:00
|
|
|
ImmutableString host;
|
2016-03-14 15:53:10 +01:00
|
|
|
// <HOST>:<PORT>. This does not treat 80 and 443 specially. If
|
|
|
|
// |host_unix| is true, this is "localhost".
|
2016-01-17 03:33:45 +01:00
|
|
|
ImmutableString hostport;
|
2016-04-29 07:42:18 +02:00
|
|
|
// hostname sent as SNI field
|
|
|
|
ImmutableString sni;
|
2016-04-09 14:58:08 +02:00
|
|
|
size_t fall;
|
|
|
|
size_t rise;
|
2016-05-24 16:36:43 +02:00
|
|
|
// Application protocol used in this group
|
|
|
|
shrpx_proto proto;
|
2015-02-22 09:12:00 +01:00
|
|
|
// backend port. 0 if |host_unix| is true.
|
2014-12-06 10:31:46 +01:00
|
|
|
uint16_t port;
|
2015-02-22 09:12:00 +01:00
|
|
|
// true if |host| contains UNIX domain socket path.
|
|
|
|
bool host_unix;
|
2016-05-24 16:36:43 +02:00
|
|
|
bool tls;
|
2014-12-06 10:31:46 +01:00
|
|
|
};
|
|
|
|
|
2016-07-06 15:31:28 +02:00
|
|
|
// Mapping hash to idx which is an index into
|
|
|
|
// DownstreamAddrGroupConfig::addrs.
|
|
|
|
struct AffinityHash {
|
|
|
|
AffinityHash(size_t idx, uint32_t hash) : idx(idx), hash(hash) {}
|
|
|
|
|
|
|
|
size_t idx;
|
|
|
|
uint32_t hash;
|
|
|
|
};
|
|
|
|
|
2016-02-27 15:24:14 +01:00
|
|
|
struct DownstreamAddrGroupConfig {
|
|
|
|
DownstreamAddrGroupConfig(const StringRef &pattern)
|
2016-06-09 15:35:59 +02:00
|
|
|
: pattern(pattern.c_str(), pattern.size()), affinity(AFFINITY_NONE) {}
|
2015-09-25 19:38:45 +02:00
|
|
|
|
2016-02-14 10:47:24 +01:00
|
|
|
ImmutableString pattern;
|
2016-02-27 15:24:14 +01:00
|
|
|
std::vector<DownstreamAddrConfig> addrs;
|
2016-07-06 15:31:28 +02:00
|
|
|
// Bunch of session affinity hash. Only used if affinity ==
|
|
|
|
// AFFINITY_IP.
|
|
|
|
std::vector<AffinityHash> affinity_hash;
|
2016-06-09 15:35:59 +02:00
|
|
|
// Session affinity
|
|
|
|
shrpx_session_affinity affinity;
|
2015-07-09 19:52:11 +02:00
|
|
|
};
|
|
|
|
|
2015-01-07 16:01:09 +01:00
|
|
|
struct TicketKey {
|
2015-07-17 18:49:20 +02:00
|
|
|
const EVP_CIPHER *cipher;
|
|
|
|
const EVP_MD *hmac;
|
|
|
|
size_t hmac_keylen;
|
|
|
|
struct {
|
|
|
|
// name of this ticket configuration
|
2015-07-26 19:12:07 +02:00
|
|
|
std::array<uint8_t, 16> name;
|
2015-07-17 18:49:20 +02:00
|
|
|
// encryption key for |cipher|
|
2015-07-26 19:12:07 +02:00
|
|
|
std::array<uint8_t, 32> enc_key;
|
2015-07-17 18:49:20 +02:00
|
|
|
// hmac key for |hmac|
|
2015-07-26 19:12:07 +02:00
|
|
|
std::array<uint8_t, 32> hmac_key;
|
2015-07-17 18:49:20 +02:00
|
|
|
} data;
|
2015-01-07 16:01:09 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
struct TicketKeys {
|
|
|
|
~TicketKeys();
|
|
|
|
std::vector<TicketKey> keys;
|
|
|
|
};
|
|
|
|
|
2016-01-17 14:51:40 +01:00
|
|
|
struct HttpProxy {
|
|
|
|
Address addr;
|
|
|
|
// host in http proxy URI
|
|
|
|
std::string host;
|
|
|
|
// userinfo in http proxy URI, not percent-encoded form
|
|
|
|
std::string userinfo;
|
2016-01-18 09:00:20 +01:00
|
|
|
// port in http proxy URI
|
2016-01-17 14:51:40 +01:00
|
|
|
uint16_t port;
|
|
|
|
};
|
|
|
|
|
2016-01-18 06:21:09 +01:00
|
|
|
struct TLSConfig {
|
|
|
|
// RFC 5077 Session ticket related configurations
|
|
|
|
struct {
|
|
|
|
struct {
|
|
|
|
Address addr;
|
|
|
|
uint16_t port;
|
2016-02-14 12:59:10 +01:00
|
|
|
// Hostname of memcached server. This is also used as SNI field
|
|
|
|
// if TLS is enabled.
|
|
|
|
ImmutableString host;
|
2016-02-13 10:17:11 +01:00
|
|
|
// Client private key and certificate for authentication
|
|
|
|
ImmutableString private_key_file;
|
|
|
|
ImmutableString cert_file;
|
2016-01-18 06:21:09 +01:00
|
|
|
ev_tstamp interval;
|
|
|
|
// Maximum number of retries when getting TLS ticket key from
|
|
|
|
// mamcached, due to network error.
|
|
|
|
size_t max_retry;
|
|
|
|
// Maximum number of consecutive error from memcached, when this
|
|
|
|
// limit reached, TLS ticket is disabled.
|
|
|
|
size_t max_fail;
|
2016-02-13 10:45:23 +01:00
|
|
|
// Address family of memcached connection. One of either
|
|
|
|
// AF_INET, AF_INET6 or AF_UNSPEC.
|
|
|
|
int family;
|
2016-02-13 10:17:11 +01:00
|
|
|
bool tls;
|
2016-01-18 06:21:09 +01:00
|
|
|
} memcached;
|
|
|
|
std::vector<std::string> files;
|
|
|
|
const EVP_CIPHER *cipher;
|
|
|
|
// true if --tls-ticket-key-cipher is used
|
|
|
|
bool cipher_given;
|
|
|
|
} ticket;
|
|
|
|
|
|
|
|
// Session cache related configurations
|
|
|
|
struct {
|
|
|
|
struct {
|
|
|
|
Address addr;
|
|
|
|
uint16_t port;
|
2016-02-14 12:59:10 +01:00
|
|
|
// Hostname of memcached server. This is also used as SNI field
|
|
|
|
// if TLS is enabled.
|
|
|
|
ImmutableString host;
|
2016-02-12 16:20:38 +01:00
|
|
|
// Client private key and certificate for authentication
|
|
|
|
ImmutableString private_key_file;
|
|
|
|
ImmutableString cert_file;
|
2016-02-13 10:45:23 +01:00
|
|
|
// Address family of memcached connection. One of either
|
|
|
|
// AF_INET, AF_INET6 or AF_UNSPEC.
|
|
|
|
int family;
|
2016-02-11 14:56:45 +01:00
|
|
|
bool tls;
|
2016-01-18 06:21:09 +01:00
|
|
|
} memcached;
|
|
|
|
} session_cache;
|
|
|
|
|
|
|
|
// Dynamic record sizing configurations
|
|
|
|
struct {
|
|
|
|
size_t warmup_threshold;
|
|
|
|
ev_tstamp idle_timeout;
|
|
|
|
} dyn_rec;
|
|
|
|
|
|
|
|
// OCSP realted configurations
|
|
|
|
struct {
|
|
|
|
ev_tstamp update_interval;
|
2016-02-14 13:01:54 +01:00
|
|
|
ImmutableString fetch_ocsp_response_file;
|
2016-01-18 06:21:09 +01:00
|
|
|
bool disabled;
|
|
|
|
} ocsp;
|
|
|
|
|
|
|
|
// Client verification configurations
|
|
|
|
struct {
|
|
|
|
// Path to file containing CA certificate solely used for client
|
|
|
|
// certificate validation
|
2016-02-14 13:09:15 +01:00
|
|
|
ImmutableString cacert;
|
2016-01-18 06:21:09 +01:00
|
|
|
bool enabled;
|
|
|
|
} client_verify;
|
|
|
|
|
|
|
|
// Client private key and certificate used in backend connections.
|
|
|
|
struct {
|
2016-02-14 13:13:46 +01:00
|
|
|
ImmutableString private_key_file;
|
2016-02-14 13:17:25 +01:00
|
|
|
ImmutableString cert_file;
|
2016-01-18 06:21:09 +01:00
|
|
|
} client;
|
|
|
|
|
2013-12-06 15:17:38 +01:00
|
|
|
// The list of (private key file, certificate file) pair
|
|
|
|
std::vector<std::pair<std::string, std::string>> subcerts;
|
2014-06-10 16:15:29 +02:00
|
|
|
std::vector<unsigned char> alpn_prefs;
|
2015-07-20 15:37:26 +02:00
|
|
|
// list of supported NPN/ALPN protocol strings in the order of
|
|
|
|
// preference.
|
|
|
|
std::vector<std::string> npn_list;
|
|
|
|
// list of supported SSL/TLS protocol strings.
|
|
|
|
std::vector<std::string> tls_proto_list;
|
2016-05-07 09:18:58 +02:00
|
|
|
BIO_METHOD *bio_method;
|
2016-01-18 06:21:09 +01:00
|
|
|
// Bit mask to disable SSL/TLS protocol versions. This will be
|
|
|
|
// passed to SSL_CTX_set_options().
|
|
|
|
long int tls_proto_mask;
|
|
|
|
std::string backend_sni_name;
|
|
|
|
std::chrono::seconds session_timeout;
|
2016-02-14 13:13:46 +01:00
|
|
|
ImmutableString private_key_file;
|
2016-02-14 13:20:40 +01:00
|
|
|
ImmutableString private_key_passwd;
|
2016-02-14 13:17:25 +01:00
|
|
|
ImmutableString cert_file;
|
2016-02-14 13:22:28 +01:00
|
|
|
ImmutableString dh_param_file;
|
2016-02-14 13:25:24 +01:00
|
|
|
ImmutableString ciphers;
|
2016-02-14 13:06:16 +01:00
|
|
|
ImmutableString cacert;
|
2016-01-18 06:21:09 +01:00
|
|
|
bool insecure;
|
2016-02-06 09:05:14 +01:00
|
|
|
bool no_http2_cipher_black_list;
|
2016-01-18 06:21:09 +01:00
|
|
|
};
|
|
|
|
|
2016-03-19 15:41:21 +01:00
|
|
|
// custom error page
|
|
|
|
struct ErrorPage {
|
|
|
|
// not NULL-terminated
|
|
|
|
std::vector<uint8_t> content;
|
2016-03-19 15:49:15 +01:00
|
|
|
// 0 is special value, and it matches all HTTP status code.
|
2016-03-19 15:41:21 +01:00
|
|
|
unsigned int http_status;
|
|
|
|
};
|
|
|
|
|
2016-01-18 09:00:20 +01:00
|
|
|
struct HttpConfig {
|
|
|
|
struct {
|
|
|
|
// obfuscated value used in "by" parameter of Forwarded header
|
|
|
|
// field. This is only used when user defined static obfuscated
|
|
|
|
// string is provided.
|
2016-01-21 13:05:07 +01:00
|
|
|
std::string by_obfuscated;
|
2016-01-18 09:00:20 +01:00
|
|
|
// bitwise-OR of one or more of shrpx_forwarded_param values.
|
|
|
|
uint32_t params;
|
|
|
|
// type of value recorded in "by" parameter of Forwarded header
|
|
|
|
// field.
|
|
|
|
shrpx_forwarded_node_type by_node_type;
|
|
|
|
// type of value recorded in "for" parameter of Forwarded header
|
|
|
|
// field.
|
|
|
|
shrpx_forwarded_node_type for_node_type;
|
|
|
|
bool strip_incoming;
|
|
|
|
} forwarded;
|
|
|
|
struct {
|
|
|
|
bool add;
|
|
|
|
bool strip_incoming;
|
|
|
|
} xff;
|
2016-01-18 06:21:09 +01:00
|
|
|
std::vector<AltSvc> altsvcs;
|
2016-03-19 15:41:21 +01:00
|
|
|
std::vector<ErrorPage> error_pages;
|
2016-02-13 14:19:05 +01:00
|
|
|
Headers add_request_headers;
|
|
|
|
Headers add_response_headers;
|
2016-08-26 15:28:09 +02:00
|
|
|
ImmutableString server_name;
|
2016-02-06 09:22:23 +01:00
|
|
|
size_t request_header_field_buffer;
|
|
|
|
size_t max_request_header_fields;
|
2016-02-06 04:25:34 +01:00
|
|
|
size_t response_header_field_buffer;
|
|
|
|
size_t max_response_header_fields;
|
2016-01-18 09:00:20 +01:00
|
|
|
bool no_via;
|
|
|
|
bool no_location_rewrite;
|
|
|
|
bool no_host_rewrite;
|
2016-08-31 16:47:15 +02:00
|
|
|
bool no_server_rewrite;
|
2016-01-18 09:00:20 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
struct Http2Config {
|
|
|
|
struct {
|
|
|
|
struct {
|
|
|
|
struct {
|
2016-02-14 13:28:47 +01:00
|
|
|
ImmutableString request_header_file;
|
|
|
|
ImmutableString response_header_file;
|
2016-01-18 09:00:20 +01:00
|
|
|
FILE *request_header;
|
|
|
|
FILE *response_header;
|
|
|
|
} dump;
|
|
|
|
bool frame_debug;
|
|
|
|
} debug;
|
2016-05-21 07:13:57 +02:00
|
|
|
struct {
|
|
|
|
ev_tstamp settings;
|
|
|
|
} timeout;
|
2016-01-18 09:00:20 +01:00
|
|
|
nghttp2_option *option;
|
2016-06-16 16:30:35 +02:00
|
|
|
nghttp2_option *alt_mode_option;
|
2016-01-18 09:00:20 +01:00
|
|
|
nghttp2_session_callbacks *callbacks;
|
2016-09-12 15:53:02 +02:00
|
|
|
size_t max_concurrent_streams;
|
|
|
|
size_t encoder_dynamic_table_size;
|
|
|
|
size_t decoder_dynamic_table_size;
|
2016-09-09 14:05:37 +02:00
|
|
|
int32_t window_size;
|
|
|
|
int32_t connection_window_size;
|
2016-09-08 15:49:36 +02:00
|
|
|
bool optimize_write_buffer_size;
|
|
|
|
bool optimize_window_size;
|
2016-01-18 09:00:20 +01:00
|
|
|
} upstream;
|
|
|
|
struct {
|
2016-05-21 07:13:57 +02:00
|
|
|
struct {
|
|
|
|
ev_tstamp settings;
|
|
|
|
} timeout;
|
2016-01-18 09:00:20 +01:00
|
|
|
nghttp2_option *option;
|
|
|
|
nghttp2_session_callbacks *callbacks;
|
2016-09-12 15:53:02 +02:00
|
|
|
size_t encoder_dynamic_table_size;
|
|
|
|
size_t decoder_dynamic_table_size;
|
2016-09-09 14:05:37 +02:00
|
|
|
int32_t window_size;
|
|
|
|
int32_t connection_window_size;
|
2016-02-27 16:06:40 +01:00
|
|
|
size_t max_concurrent_streams;
|
2016-01-18 09:00:20 +01:00
|
|
|
} downstream;
|
2016-01-19 08:56:12 +01:00
|
|
|
struct {
|
|
|
|
ev_tstamp stream_read;
|
|
|
|
ev_tstamp stream_write;
|
|
|
|
} timeout;
|
2016-01-18 09:00:20 +01:00
|
|
|
bool no_cookie_crumbling;
|
|
|
|
bool no_server_push;
|
|
|
|
};
|
|
|
|
|
2016-01-18 09:26:27 +01:00
|
|
|
struct LoggingConfig {
|
|
|
|
struct {
|
|
|
|
std::vector<LogFragment> format;
|
2016-02-14 13:32:27 +01:00
|
|
|
ImmutableString file;
|
2016-01-18 09:26:27 +01:00
|
|
|
// Send accesslog to syslog, ignoring accesslog_file.
|
|
|
|
bool syslog;
|
|
|
|
} access;
|
|
|
|
struct {
|
2016-02-14 13:32:27 +01:00
|
|
|
ImmutableString file;
|
2016-01-18 09:26:27 +01:00
|
|
|
// Send errorlog to syslog, ignoring errorlog_file.
|
|
|
|
bool syslog;
|
|
|
|
} error;
|
|
|
|
int syslog_facility;
|
|
|
|
};
|
|
|
|
|
2016-01-19 08:56:12 +01:00
|
|
|
struct RateLimitConfig {
|
|
|
|
size_t rate;
|
|
|
|
size_t burst;
|
|
|
|
};
|
|
|
|
|
2016-06-03 12:13:02 +02:00
|
|
|
// Wildcard host pattern routing. We strips left most '*' from host
|
2016-06-10 16:13:40 +02:00
|
|
|
// field. router includes all path patterns sharing the same wildcard
|
2016-06-03 12:13:02 +02:00
|
|
|
// host.
|
|
|
|
struct WildcardPattern {
|
2016-06-03 16:52:44 +02:00
|
|
|
WildcardPattern(const StringRef &host)
|
|
|
|
: host(std::begin(host), std::end(host)) {}
|
|
|
|
|
2016-06-03 12:13:02 +02:00
|
|
|
ImmutableString host;
|
|
|
|
Router router;
|
|
|
|
};
|
|
|
|
|
2016-06-11 11:21:37 +02:00
|
|
|
// Configuration to select backend to forward request
|
|
|
|
struct RouterConfig {
|
2016-06-03 12:13:02 +02:00
|
|
|
Router router;
|
2016-06-10 16:13:40 +02:00
|
|
|
// Router for reversed wildcard hosts. Since this router has
|
|
|
|
// wildcard hosts reversed without '*', one should call match()
|
|
|
|
// function with reversed host stripping last character. This is
|
|
|
|
// because we require at least one character must match for '*'.
|
|
|
|
// The index stored in this router is index of wildcard_patterns.
|
|
|
|
Router rev_wildcard_router;
|
2016-06-03 12:13:02 +02:00
|
|
|
std::vector<WildcardPattern> wildcard_patterns;
|
2016-06-11 11:21:37 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
struct DownstreamConfig {
|
2016-09-04 16:30:24 +02:00
|
|
|
DownstreamConfig()
|
|
|
|
: timeout{},
|
|
|
|
addr_group_catch_all{0},
|
|
|
|
connections_per_host{0},
|
|
|
|
connections_per_frontend{0},
|
|
|
|
request_buffer_size{0},
|
|
|
|
response_buffer_size{0},
|
|
|
|
family{0} {}
|
|
|
|
|
2016-06-11 11:21:37 +02:00
|
|
|
struct {
|
|
|
|
ev_tstamp read;
|
|
|
|
ev_tstamp write;
|
|
|
|
ev_tstamp idle_read;
|
2016-06-21 17:13:43 +02:00
|
|
|
// The maximum backoff while checking health check for offline
|
|
|
|
// backend or while detaching failed backend from load balancing
|
|
|
|
// group temporarily.
|
|
|
|
ev_tstamp max_backoff;
|
2016-06-11 11:21:37 +02:00
|
|
|
} timeout;
|
|
|
|
RouterConfig router;
|
2016-06-03 12:13:02 +02:00
|
|
|
std::vector<DownstreamAddrGroupConfig> addr_groups;
|
|
|
|
// The index of catch-all group in downstream_addr_groups.
|
|
|
|
size_t addr_group_catch_all;
|
|
|
|
size_t connections_per_host;
|
|
|
|
size_t connections_per_frontend;
|
|
|
|
size_t request_buffer_size;
|
|
|
|
size_t response_buffer_size;
|
|
|
|
// Address family of backend connection. One of either AF_INET,
|
|
|
|
// AF_INET6 or AF_UNSPEC. This is ignored if backend connection
|
|
|
|
// is made via Unix domain socket.
|
|
|
|
int family;
|
|
|
|
};
|
|
|
|
|
2016-01-19 08:56:12 +01:00
|
|
|
struct ConnectionConfig {
|
|
|
|
struct {
|
|
|
|
struct {
|
|
|
|
ev_tstamp sleep;
|
|
|
|
} timeout;
|
2016-01-31 11:41:56 +01:00
|
|
|
// address of frontend acceptors
|
2016-02-07 09:51:53 +01:00
|
|
|
std::vector<UpstreamAddr> addrs;
|
2016-01-19 08:56:12 +01:00
|
|
|
int backlog;
|
|
|
|
// TCP fastopen. If this is positive, it is passed to
|
|
|
|
// setsockopt() along with TCP_FASTOPEN.
|
|
|
|
int fastopen;
|
|
|
|
} listener;
|
|
|
|
|
|
|
|
struct {
|
|
|
|
struct {
|
|
|
|
ev_tstamp http2_read;
|
|
|
|
ev_tstamp read;
|
|
|
|
ev_tstamp write;
|
|
|
|
} timeout;
|
|
|
|
struct {
|
|
|
|
RateLimitConfig read;
|
|
|
|
RateLimitConfig write;
|
|
|
|
} ratelimit;
|
|
|
|
size_t worker_connections;
|
|
|
|
bool accept_proxy_protocol;
|
|
|
|
} upstream;
|
|
|
|
|
2016-06-03 12:13:02 +02:00
|
|
|
std::shared_ptr<DownstreamConfig> downstream;
|
2016-06-02 18:20:49 +02:00
|
|
|
};
|
|
|
|
|
2016-06-04 10:24:54 +02:00
|
|
|
struct APIConfig {
|
|
|
|
// Maximum request body size for one API request
|
|
|
|
size_t max_request_body;
|
2016-06-16 17:09:15 +02:00
|
|
|
// true if at least one of UpstreamAddr has api enabled
|
|
|
|
bool enabled;
|
2016-06-04 10:24:54 +02:00
|
|
|
};
|
|
|
|
|
2016-06-02 18:20:49 +02:00
|
|
|
struct Config {
|
2016-08-25 15:55:12 +02:00
|
|
|
Config() = default;
|
2016-07-31 12:01:29 +02:00
|
|
|
~Config();
|
|
|
|
|
2016-08-25 15:55:12 +02:00
|
|
|
Config(Config &&) = delete;
|
|
|
|
Config(const Config &&) = delete;
|
|
|
|
Config &operator=(Config &&) = delete;
|
|
|
|
Config &operator=(const Config &&) = delete;
|
|
|
|
|
2016-01-17 14:51:40 +01:00
|
|
|
HttpProxy downstream_http_proxy;
|
2016-01-18 09:00:20 +01:00
|
|
|
HttpConfig http;
|
|
|
|
Http2Config http2;
|
2016-01-18 06:21:09 +01:00
|
|
|
TLSConfig tls;
|
2016-01-18 09:26:27 +01:00
|
|
|
LoggingConfig logging;
|
2016-01-19 08:56:12 +01:00
|
|
|
ConnectionConfig conn;
|
2016-06-04 10:24:54 +02:00
|
|
|
APIConfig api;
|
2016-02-14 13:34:33 +01:00
|
|
|
ImmutableString pid_file;
|
2016-02-14 14:20:10 +01:00
|
|
|
ImmutableString conf_path;
|
2016-02-14 14:21:55 +01:00
|
|
|
ImmutableString user;
|
2016-02-14 14:27:59 +01:00
|
|
|
ImmutableString mruby_file;
|
2012-06-05 18:26:04 +02:00
|
|
|
size_t num_worker;
|
2014-02-11 09:23:22 +01:00
|
|
|
size_t padding;
|
2015-01-10 15:17:48 +01:00
|
|
|
size_t rlimit_nofile;
|
2013-12-06 15:17:38 +01:00
|
|
|
uid_t uid;
|
|
|
|
gid_t gid;
|
2014-11-24 06:34:43 +01:00
|
|
|
pid_t pid;
|
2013-12-06 15:17:38 +01:00
|
|
|
bool verbose;
|
|
|
|
bool daemon;
|
2013-11-04 10:14:05 +01:00
|
|
|
bool http2_proxy;
|
2016-05-06 16:10:09 +02:00
|
|
|
// flags passed to ev_default_loop() and ev_loop_new()
|
|
|
|
int ev_loop_flags;
|
2012-06-04 16:48:31 +02:00
|
|
|
};
|
|
|
|
|
2014-11-27 15:39:04 +01:00
|
|
|
const Config *get_config();
|
|
|
|
Config *mod_config();
|
2016-07-31 08:57:41 +02:00
|
|
|
// Replaces the current config with given |new_config|. The old config is
|
|
|
|
// returned.
|
2016-07-31 12:01:29 +02:00
|
|
|
std::unique_ptr<Config> replace_config(std::unique_ptr<Config> new_config);
|
2012-06-04 16:48:31 +02:00
|
|
|
void create_config();
|
|
|
|
|
2016-06-04 10:41:06 +02:00
|
|
|
// generated by gennghttpxfun.py
|
|
|
|
enum {
|
|
|
|
SHRPX_OPTID_ACCEPT_PROXY_PROTOCOL,
|
|
|
|
SHRPX_OPTID_ACCESSLOG_FILE,
|
|
|
|
SHRPX_OPTID_ACCESSLOG_FORMAT,
|
|
|
|
SHRPX_OPTID_ACCESSLOG_SYSLOG,
|
|
|
|
SHRPX_OPTID_ADD_FORWARDED,
|
|
|
|
SHRPX_OPTID_ADD_REQUEST_HEADER,
|
|
|
|
SHRPX_OPTID_ADD_RESPONSE_HEADER,
|
|
|
|
SHRPX_OPTID_ADD_X_FORWARDED_FOR,
|
|
|
|
SHRPX_OPTID_ALTSVC,
|
|
|
|
SHRPX_OPTID_API_MAX_REQUEST_BODY,
|
|
|
|
SHRPX_OPTID_BACKEND,
|
|
|
|
SHRPX_OPTID_BACKEND_ADDRESS_FAMILY,
|
|
|
|
SHRPX_OPTID_BACKEND_CONNECTIONS_PER_FRONTEND,
|
|
|
|
SHRPX_OPTID_BACKEND_CONNECTIONS_PER_HOST,
|
|
|
|
SHRPX_OPTID_BACKEND_HTTP_PROXY_URI,
|
|
|
|
SHRPX_OPTID_BACKEND_HTTP1_CONNECTIONS_PER_FRONTEND,
|
|
|
|
SHRPX_OPTID_BACKEND_HTTP1_CONNECTIONS_PER_HOST,
|
|
|
|
SHRPX_OPTID_BACKEND_HTTP1_TLS,
|
|
|
|
SHRPX_OPTID_BACKEND_HTTP2_CONNECTION_WINDOW_BITS,
|
2016-09-09 14:05:37 +02:00
|
|
|
SHRPX_OPTID_BACKEND_HTTP2_CONNECTION_WINDOW_SIZE,
|
2016-06-04 10:41:06 +02:00
|
|
|
SHRPX_OPTID_BACKEND_HTTP2_CONNECTIONS_PER_WORKER,
|
2016-09-12 15:53:02 +02:00
|
|
|
SHRPX_OPTID_BACKEND_HTTP2_DECODER_DYNAMIC_TABLE_SIZE,
|
|
|
|
SHRPX_OPTID_BACKEND_HTTP2_ENCODER_DYNAMIC_TABLE_SIZE,
|
2016-06-04 10:41:06 +02:00
|
|
|
SHRPX_OPTID_BACKEND_HTTP2_MAX_CONCURRENT_STREAMS,
|
|
|
|
SHRPX_OPTID_BACKEND_HTTP2_SETTINGS_TIMEOUT,
|
|
|
|
SHRPX_OPTID_BACKEND_HTTP2_WINDOW_BITS,
|
2016-09-09 14:05:37 +02:00
|
|
|
SHRPX_OPTID_BACKEND_HTTP2_WINDOW_SIZE,
|
2016-06-04 10:41:06 +02:00
|
|
|
SHRPX_OPTID_BACKEND_IPV4,
|
|
|
|
SHRPX_OPTID_BACKEND_IPV6,
|
|
|
|
SHRPX_OPTID_BACKEND_KEEP_ALIVE_TIMEOUT,
|
2016-06-21 17:13:43 +02:00
|
|
|
SHRPX_OPTID_BACKEND_MAX_BACKOFF,
|
2016-06-04 10:41:06 +02:00
|
|
|
SHRPX_OPTID_BACKEND_NO_TLS,
|
|
|
|
SHRPX_OPTID_BACKEND_READ_TIMEOUT,
|
|
|
|
SHRPX_OPTID_BACKEND_REQUEST_BUFFER,
|
|
|
|
SHRPX_OPTID_BACKEND_RESPONSE_BUFFER,
|
|
|
|
SHRPX_OPTID_BACKEND_TLS,
|
|
|
|
SHRPX_OPTID_BACKEND_TLS_SNI_FIELD,
|
|
|
|
SHRPX_OPTID_BACKEND_WRITE_TIMEOUT,
|
|
|
|
SHRPX_OPTID_BACKLOG,
|
|
|
|
SHRPX_OPTID_CACERT,
|
|
|
|
SHRPX_OPTID_CERTIFICATE_FILE,
|
|
|
|
SHRPX_OPTID_CIPHERS,
|
|
|
|
SHRPX_OPTID_CLIENT,
|
|
|
|
SHRPX_OPTID_CLIENT_CERT_FILE,
|
|
|
|
SHRPX_OPTID_CLIENT_PRIVATE_KEY_FILE,
|
|
|
|
SHRPX_OPTID_CLIENT_PROXY,
|
|
|
|
SHRPX_OPTID_CONF,
|
|
|
|
SHRPX_OPTID_DAEMON,
|
|
|
|
SHRPX_OPTID_DH_PARAM_FILE,
|
|
|
|
SHRPX_OPTID_ERROR_PAGE,
|
|
|
|
SHRPX_OPTID_ERRORLOG_FILE,
|
|
|
|
SHRPX_OPTID_ERRORLOG_SYSLOG,
|
|
|
|
SHRPX_OPTID_FASTOPEN,
|
|
|
|
SHRPX_OPTID_FETCH_OCSP_RESPONSE_FILE,
|
|
|
|
SHRPX_OPTID_FORWARDED_BY,
|
|
|
|
SHRPX_OPTID_FORWARDED_FOR,
|
|
|
|
SHRPX_OPTID_FRONTEND,
|
|
|
|
SHRPX_OPTID_FRONTEND_FRAME_DEBUG,
|
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_CONNECTION_WINDOW_BITS,
|
2016-09-09 14:05:37 +02:00
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_CONNECTION_WINDOW_SIZE,
|
2016-09-12 15:53:02 +02:00
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_DECODER_DYNAMIC_TABLE_SIZE,
|
2016-06-04 10:41:06 +02:00
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_DUMP_REQUEST_HEADER,
|
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_DUMP_RESPONSE_HEADER,
|
2016-09-12 15:53:02 +02:00
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_ENCODER_DYNAMIC_TABLE_SIZE,
|
2016-06-04 10:41:06 +02:00
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_MAX_CONCURRENT_STREAMS,
|
2016-09-08 15:49:36 +02:00
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_OPTIMIZE_WINDOW_SIZE,
|
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_OPTIMIZE_WRITE_BUFFER_SIZE,
|
2016-06-04 10:41:06 +02:00
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_READ_TIMEOUT,
|
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_SETTINGS_TIMEOUT,
|
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_WINDOW_BITS,
|
2016-09-09 14:05:37 +02:00
|
|
|
SHRPX_OPTID_FRONTEND_HTTP2_WINDOW_SIZE,
|
2016-06-04 10:41:06 +02:00
|
|
|
SHRPX_OPTID_FRONTEND_NO_TLS,
|
|
|
|
SHRPX_OPTID_FRONTEND_READ_TIMEOUT,
|
|
|
|
SHRPX_OPTID_FRONTEND_WRITE_TIMEOUT,
|
|
|
|
SHRPX_OPTID_HEADER_FIELD_BUFFER,
|
|
|
|
SHRPX_OPTID_HOST_REWRITE,
|
|
|
|
SHRPX_OPTID_HTTP2_BRIDGE,
|
|
|
|
SHRPX_OPTID_HTTP2_MAX_CONCURRENT_STREAMS,
|
|
|
|
SHRPX_OPTID_HTTP2_NO_COOKIE_CRUMBLING,
|
|
|
|
SHRPX_OPTID_HTTP2_PROXY,
|
|
|
|
SHRPX_OPTID_INCLUDE,
|
|
|
|
SHRPX_OPTID_INSECURE,
|
|
|
|
SHRPX_OPTID_LISTENER_DISABLE_TIMEOUT,
|
|
|
|
SHRPX_OPTID_LOG_LEVEL,
|
|
|
|
SHRPX_OPTID_MAX_HEADER_FIELDS,
|
|
|
|
SHRPX_OPTID_MAX_REQUEST_HEADER_FIELDS,
|
|
|
|
SHRPX_OPTID_MAX_RESPONSE_HEADER_FIELDS,
|
|
|
|
SHRPX_OPTID_MRUBY_FILE,
|
|
|
|
SHRPX_OPTID_NO_HOST_REWRITE,
|
|
|
|
SHRPX_OPTID_NO_HTTP2_CIPHER_BLACK_LIST,
|
|
|
|
SHRPX_OPTID_NO_KQUEUE,
|
|
|
|
SHRPX_OPTID_NO_LOCATION_REWRITE,
|
|
|
|
SHRPX_OPTID_NO_OCSP,
|
|
|
|
SHRPX_OPTID_NO_SERVER_PUSH,
|
2016-08-31 16:47:15 +02:00
|
|
|
SHRPX_OPTID_NO_SERVER_REWRITE,
|
2016-06-04 10:41:06 +02:00
|
|
|
SHRPX_OPTID_NO_VIA,
|
|
|
|
SHRPX_OPTID_NPN_LIST,
|
|
|
|
SHRPX_OPTID_OCSP_UPDATE_INTERVAL,
|
|
|
|
SHRPX_OPTID_PADDING,
|
|
|
|
SHRPX_OPTID_PID_FILE,
|
|
|
|
SHRPX_OPTID_PRIVATE_KEY_FILE,
|
|
|
|
SHRPX_OPTID_PRIVATE_KEY_PASSWD_FILE,
|
|
|
|
SHRPX_OPTID_READ_BURST,
|
|
|
|
SHRPX_OPTID_READ_RATE,
|
|
|
|
SHRPX_OPTID_REQUEST_HEADER_FIELD_BUFFER,
|
|
|
|
SHRPX_OPTID_RESPONSE_HEADER_FIELD_BUFFER,
|
|
|
|
SHRPX_OPTID_RLIMIT_NOFILE,
|
2016-08-26 15:28:09 +02:00
|
|
|
SHRPX_OPTID_SERVER_NAME,
|
2016-06-04 10:41:06 +02:00
|
|
|
SHRPX_OPTID_STREAM_READ_TIMEOUT,
|
|
|
|
SHRPX_OPTID_STREAM_WRITE_TIMEOUT,
|
|
|
|
SHRPX_OPTID_STRIP_INCOMING_FORWARDED,
|
|
|
|
SHRPX_OPTID_STRIP_INCOMING_X_FORWARDED_FOR,
|
|
|
|
SHRPX_OPTID_SUBCERT,
|
|
|
|
SHRPX_OPTID_SYSLOG_FACILITY,
|
|
|
|
SHRPX_OPTID_TLS_DYN_REC_IDLE_TIMEOUT,
|
|
|
|
SHRPX_OPTID_TLS_DYN_REC_WARMUP_THRESHOLD,
|
|
|
|
SHRPX_OPTID_TLS_PROTO_LIST,
|
|
|
|
SHRPX_OPTID_TLS_SESSION_CACHE_MEMCACHED,
|
|
|
|
SHRPX_OPTID_TLS_SESSION_CACHE_MEMCACHED_ADDRESS_FAMILY,
|
|
|
|
SHRPX_OPTID_TLS_SESSION_CACHE_MEMCACHED_CERT_FILE,
|
|
|
|
SHRPX_OPTID_TLS_SESSION_CACHE_MEMCACHED_PRIVATE_KEY_FILE,
|
|
|
|
SHRPX_OPTID_TLS_SESSION_CACHE_MEMCACHED_TLS,
|
|
|
|
SHRPX_OPTID_TLS_TICKET_KEY_CIPHER,
|
|
|
|
SHRPX_OPTID_TLS_TICKET_KEY_FILE,
|
|
|
|
SHRPX_OPTID_TLS_TICKET_KEY_MEMCACHED,
|
|
|
|
SHRPX_OPTID_TLS_TICKET_KEY_MEMCACHED_ADDRESS_FAMILY,
|
|
|
|
SHRPX_OPTID_TLS_TICKET_KEY_MEMCACHED_CERT_FILE,
|
|
|
|
SHRPX_OPTID_TLS_TICKET_KEY_MEMCACHED_INTERVAL,
|
|
|
|
SHRPX_OPTID_TLS_TICKET_KEY_MEMCACHED_MAX_FAIL,
|
|
|
|
SHRPX_OPTID_TLS_TICKET_KEY_MEMCACHED_MAX_RETRY,
|
|
|
|
SHRPX_OPTID_TLS_TICKET_KEY_MEMCACHED_PRIVATE_KEY_FILE,
|
|
|
|
SHRPX_OPTID_TLS_TICKET_KEY_MEMCACHED_TLS,
|
|
|
|
SHRPX_OPTID_USER,
|
|
|
|
SHRPX_OPTID_VERIFY_CLIENT,
|
|
|
|
SHRPX_OPTID_VERIFY_CLIENT_CACERT,
|
|
|
|
SHRPX_OPTID_WORKER_FRONTEND_CONNECTIONS,
|
|
|
|
SHRPX_OPTID_WORKER_READ_BURST,
|
|
|
|
SHRPX_OPTID_WORKER_READ_RATE,
|
|
|
|
SHRPX_OPTID_WORKER_WRITE_BURST,
|
|
|
|
SHRPX_OPTID_WORKER_WRITE_RATE,
|
|
|
|
SHRPX_OPTID_WORKERS,
|
|
|
|
SHRPX_OPTID_WRITE_BURST,
|
|
|
|
SHRPX_OPTID_WRITE_RATE,
|
|
|
|
SHRPX_OPTID_MAXIDX,
|
|
|
|
};
|
|
|
|
|
|
|
|
// Looks up token for given option name |name| of length |namelen|.
|
|
|
|
int option_lookup_token(const char *name, size_t namelen);
|
|
|
|
|
2012-08-01 17:06:41 +02:00
|
|
|
// Parses option name |opt| and value |optarg|. The results are
|
2016-06-02 16:59:59 +02:00
|
|
|
// stored into the object pointed by |config|. This function returns 0
|
|
|
|
// if it succeeds, or -1. The |included_set| contains the all paths
|
|
|
|
// already included while processing this configuration, to avoid loop
|
|
|
|
// in --include option.
|
|
|
|
int parse_config(Config *config, const StringRef &opt, const StringRef &optarg,
|
2016-03-24 13:05:02 +01:00
|
|
|
std::set<StringRef> &included_set);
|
2012-08-01 17:06:41 +02:00
|
|
|
|
2016-06-04 10:41:06 +02:00
|
|
|
// Similar to parse_config() above, but additional |optid| which
|
|
|
|
// should be the return value of option_lookup_token(opt).
|
|
|
|
int parse_config(Config *config, int optid, const StringRef &opt,
|
|
|
|
const StringRef &optarg, std::set<StringRef> &included_set);
|
|
|
|
|
2016-07-31 08:57:41 +02:00
|
|
|
// Loads configurations from |filename| and stores them in |config|.
|
|
|
|
// This function returns 0 if it succeeds, or -1. See parse_config()
|
|
|
|
// for |include_set|.
|
|
|
|
int load_config(Config *config, const char *filename,
|
|
|
|
std::set<StringRef> &include_set);
|
2012-12-03 07:33:04 +01:00
|
|
|
|
2014-04-26 07:56:08 +02:00
|
|
|
// Parses header field in |optarg|. We expect header field is formed
|
|
|
|
// like "NAME: VALUE". We require that NAME is non empty string. ":"
|
|
|
|
// is allowed at the start of the NAME, but NAME == ":" is not
|
|
|
|
// allowed. This function returns pair of NAME and VALUE.
|
2016-03-24 13:05:02 +01:00
|
|
|
Headers::value_type parse_header(const StringRef &optarg);
|
2014-04-26 07:56:08 +02:00
|
|
|
|
2016-03-24 13:05:02 +01:00
|
|
|
std::vector<LogFragment> parse_log_format(const StringRef &optarg);
|
2014-11-18 16:56:44 +01:00
|
|
|
|
2012-08-01 18:20:18 +02:00
|
|
|
// Returns string for syslog |facility|.
|
2016-03-24 13:05:02 +01:00
|
|
|
StringRef str_syslog_facility(int facility);
|
2012-08-01 18:20:18 +02:00
|
|
|
|
|
|
|
// Returns integer value of syslog |facility| string.
|
2016-03-24 13:05:02 +01:00
|
|
|
int int_syslog_facility(const StringRef &strfacility);
|
2012-08-01 18:20:18 +02:00
|
|
|
|
2014-11-27 15:39:04 +01:00
|
|
|
FILE *open_file_for_write(const char *filename);
|
2014-08-12 18:53:44 +02:00
|
|
|
|
2015-01-07 17:26:30 +01:00
|
|
|
// Reads TLS ticket key file in |files| and returns TicketKey which
|
2015-07-17 18:49:20 +02:00
|
|
|
// stores read key data. The given |cipher| and |hmac| determine the
|
|
|
|
// expected file size. This function returns TicketKey if it
|
2015-01-07 17:26:30 +01:00
|
|
|
// succeeds, or nullptr.
|
|
|
|
std::unique_ptr<TicketKeys>
|
2015-07-17 18:49:20 +02:00
|
|
|
read_tls_ticket_key_file(const std::vector<std::string> &files,
|
|
|
|
const EVP_CIPHER *cipher, const EVP_MD *hmac);
|
2015-01-07 17:26:30 +01:00
|
|
|
|
2016-02-28 13:35:26 +01:00
|
|
|
// Returns string representation of |proto|.
|
|
|
|
StringRef strproto(shrpx_proto proto);
|
|
|
|
|
2016-06-02 17:22:55 +02:00
|
|
|
int configure_downstream_group(Config *config, bool http2_proxy,
|
|
|
|
bool numeric_addr_only,
|
|
|
|
const TLSConfig &tlsconf);
|
|
|
|
|
|
|
|
int resolve_hostname(Address *addr, const char *hostname, uint16_t port,
|
|
|
|
int family, int additional_flags = 0);
|
|
|
|
|
2012-06-04 16:48:31 +02:00
|
|
|
} // namespace shrpx
|
|
|
|
|
|
|
|
#endif // SHRPX_CONFIG_H
|