From 6ea91e57e07dd4a4ab74867138a7fb99337e5eca Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 6 Dec 2013 23:17:38 +0900 Subject: [PATCH] Adjust struct/class alignment --- examples/client.c | 10 +-- hdtest/deflatehd.c | 2 +- hdtest/inflatehd.c | 2 +- lib/includes/nghttp2/nghttp2.h | 24 +++--- lib/nghttp2_frame.h | 8 +- lib/nghttp2_hd.h | 22 +++--- lib/nghttp2_map.h | 2 +- lib/nghttp2_outbound_item.h | 6 +- lib/nghttp2_session.h | 108 ++++++++++++-------------- lib/nghttp2_stream.h | 46 +++++------ src/HttpServer.cc | 24 +++--- src/HttpServer.h | 24 +++--- src/nghttp.cc | 103 +++++++++++++------------ src/shrpx_client_handler.cc | 12 +-- src/shrpx_client_handler.h | 10 +-- src/shrpx_config.h | 124 +++++++++++++++--------------- src/shrpx_downstream.cc | 22 +++--- src/shrpx_downstream.h | 49 +++++++----- src/shrpx_http2_session.cc | 10 +-- src/shrpx_http2_session.h | 18 ++--- src/shrpx_http2_upstream.h | 6 +- src/shrpx_listen_handler.cc | 4 +- src/shrpx_listen_handler.h | 6 +- src/shrpx_log.cc | 4 +- src/shrpx_log.h | 6 +- src/shrpx_spdy_upstream.cc | 2 +- src/shrpx_spdy_upstream.h | 4 +- src/shrpx_thread_event_receiver.h | 2 +- src/shrpx_worker.cc | 6 +- src/shrpx_worker.h | 4 +- 30 files changed, 337 insertions(+), 333 deletions(-) diff --git a/examples/client.c b/examples/client.c index 4e951db4..ad7533e4 100644 --- a/examples/client.c +++ b/examples/client.c @@ -64,8 +64,9 @@ struct Connection { }; struct Request { + /* The gzip stream inflater for the compressed response. */ + nghttp2_gzip *inflater; char *host; - uint16_t port; /* In this program, path contains query component as well. */ char *path; /* This is the concatenation of host and port with ":" in @@ -73,19 +74,18 @@ struct Request { char *hostport; /* Stream ID for this request. */ int32_t stream_id; - /* The gzip stream inflater for the compressed response. */ - nghttp2_gzip *inflater; + uint16_t port; }; struct URI { const char *host; - size_t hostlen; - uint16_t port; /* In this program, path contains query component as well. */ const char *path; size_t pathlen; const char *hostport; + size_t hostlen; size_t hostportlen; + uint16_t port; }; /* diff --git a/hdtest/deflatehd.c b/hdtest/deflatehd.c index af03e6b8..1a3a709d 100644 --- a/hdtest/deflatehd.c +++ b/hdtest/deflatehd.c @@ -38,9 +38,9 @@ #include "comp_helper.h" typedef struct { - nghttp2_hd_side side; size_t table_size; size_t deflate_table_size; + nghttp2_hd_side side; int http1text; int dump_header_table; int no_refset; diff --git a/hdtest/inflatehd.c b/hdtest/inflatehd.c index 7a80ebfe..af2f8584 100644 --- a/hdtest/inflatehd.c +++ b/hdtest/inflatehd.c @@ -38,8 +38,8 @@ #include "comp_helper.h" typedef struct { - nghttp2_hd_side side; size_t table_size; + nghttp2_hd_side side; int dump_header_table; } inflate_config; diff --git a/lib/includes/nghttp2/nghttp2.h b/lib/includes/nghttp2/nghttp2.h index a725a12b..377c9bad 100644 --- a/lib/includes/nghttp2/nghttp2.h +++ b/lib/includes/nghttp2/nghttp2.h @@ -616,10 +616,6 @@ typedef struct { * The frame header. */ nghttp2_frame_hd hd; - /** - * The priority. - */ - int32_t pri; /** * The name/value pairs. */ @@ -628,6 +624,10 @@ typedef struct { * The number of name/value pairs in |nva|. */ size_t nvlen; + /** + * The priority. + */ + int32_t pri; nghttp2_headers_category cat; } nghttp2_headers; @@ -704,10 +704,6 @@ typedef struct { * The frame header. */ nghttp2_frame_hd hd; - /** - * The promised stream ID - */ - int32_t promised_stream_id; /** * The name/value pairs. */ @@ -716,6 +712,10 @@ typedef struct { * The number of name/value pairs in |nva|. */ size_t nvlen; + /** + * The promised stream ID + */ + int32_t promised_stream_id; } nghttp2_push_promise; /** @@ -1282,6 +1282,10 @@ typedef enum { * Struct to store option values for nghttp2_session. */ typedef struct { + /** + * :enum:`NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS` + */ + uint32_t peer_max_concurrent_streams; /** * :enum:`NGHTTP2_OPT_NO_AUTO_STREAM_WINDOW_UPDATE` */ @@ -1290,10 +1294,6 @@ typedef struct { * :enum:`NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE` */ uint8_t no_auto_connection_window_update; - /** - * :enum:`NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS` - */ - uint32_t peer_max_concurrent_streams; } nghttp2_opt_set; /** diff --git a/lib/nghttp2_frame.h b/lib/nghttp2_frame.h index 5f953337..7946c9d2 100644 --- a/lib/nghttp2_frame.h +++ b/lib/nghttp2_frame.h @@ -66,16 +66,16 @@ typedef enum { */ typedef struct { nghttp2_frame_hd hd; + /** + * The data to be sent for this DATA frame. + */ + nghttp2_data_provider data_prd; /** * The flag to indicate whether EOF was reached or not. Initially * |eof| is 0. It becomes 1 after all data were read. This is used * exclusively by nghttp2 library and not in the spec. */ uint8_t eof; - /** - * The data to be sent for this DATA frame. - */ - nghttp2_data_provider data_prd; } nghttp2_data; int nghttp2_frame_is_data_frame(uint8_t *head); diff --git a/lib/nghttp2_hd.h b/lib/nghttp2_hd.h index 19306649..63502284 100644 --- a/lib/nghttp2_hd.h +++ b/lib/nghttp2_hd.h @@ -118,13 +118,24 @@ typedef struct { size_t deflate_hd_table_bufsize_max; /* The number of effective entry in |hd_table|. */ size_t deflate_hd_tablelen; + /* The number of entry the |buf_track| contains. */ + size_t buf_tracklen; /* Holding emitted entry in deflating header block to retain reference count. */ nghttp2_hd_entry **emit_set; + /* Keep track of allocated buffers in inflation */ + uint8_t **buf_track; + /* Role of this context; deflate or infalte */ + nghttp2_hd_role role; + /* NGHTTP2_HD_SIDE_REQUEST for processing request, otherwise + response. */ + nghttp2_hd_side side; /* The capacity of the |emit_set| */ uint16_t emit_set_capacity; /* The number of entry the |emit_set| contains */ uint16_t emit_setlen; + /* The capacity of |buf_track| */ + uint16_t buf_track_capacity; /* If inflate/deflate error occurred, this value is set to 1 and further invocation of inflate/deflate will fail with NGHTTP2_ERR_HEADER_COMP. */ @@ -132,17 +143,6 @@ typedef struct { /* Set to this nonzero to clear reference set on each deflation each time. */ uint8_t no_refset; - /* Role of this context; deflate or infalte */ - nghttp2_hd_role role; - /* NGHTTP2_HD_SIDE_REQUEST for processing request, otherwise - response. */ - nghttp2_hd_side side; - /* Keep track of allocated buffers in inflation */ - uint8_t **buf_track; - /* The capacity of |buf_track| */ - uint16_t buf_track_capacity; - /* The number of entry the |buf_track| contains. */ - size_t buf_tracklen; } nghttp2_hd_context; /* diff --git a/lib/nghttp2_map.h b/lib/nghttp2_map.h index 0ee6dbdb..9c03be1a 100644 --- a/lib/nghttp2_map.h +++ b/lib/nghttp2_map.h @@ -37,8 +37,8 @@ typedef uint32_t key_type; typedef struct nghttp2_map_entry { - key_type key; struct nghttp2_map_entry *next; + key_type key; } nghttp2_map_entry; typedef struct { diff --git a/lib/nghttp2_outbound_item.h b/lib/nghttp2_outbound_item.h index a6daec16..5d2d40e4 100644 --- a/lib/nghttp2_outbound_item.h +++ b/lib/nghttp2_outbound_item.h @@ -43,18 +43,18 @@ typedef struct { } nghttp2_headers_aux_data; typedef struct { + int64_t seq; + void *frame; + void *aux_data; /* Type of |frame|. NGHTTP2_CTRL: nghttp2_frame*, NGHTTP2_DATA: nghttp2_data* */ nghttp2_frame_category frame_cat; - void *frame; - void *aux_data; /* The priority used in priority comparion */ int32_t pri; /* The initial priority */ int32_t inipri; /* The amount of priority decrement in next time */ uint32_t pri_decay; - int64_t seq; } nghttp2_outbound_item; /* diff --git a/lib/nghttp2_session.h b/lib/nghttp2_session.h index 489ec94a..9db73844 100644 --- a/lib/nghttp2_session.h +++ b/lib/nghttp2_session.h @@ -81,12 +81,10 @@ typedef enum { typedef struct { nghttp2_frame frame; - nghttp2_inbound_state state; - uint8_t headbuf[NGHTTP2_FRAME_HEAD_LENGTH]; - /* How many bytes are filled in headbuf */ - size_t headbufoff; /* Payload for non-DATA frames. */ uint8_t *buf; + /* How many bytes are filled in headbuf */ + size_t headbufoff; /* Capacity of buf */ size_t bufmax; /* For frames without name/value header block, this is how many @@ -100,8 +98,10 @@ typedef struct { /* How many bytes are received for this frame. off <= payloadlen must be fulfilled. */ size_t off; + nghttp2_inbound_state state; /* Error code */ int error_code; + uint8_t headbuf[NGHTTP2_FRAME_HEAD_LENGTH]; } nghttp2_inbound_frame; typedef enum { @@ -115,7 +115,37 @@ typedef enum { } nghttp2_goaway_flag; struct nghttp2_session { - uint8_t server; + nghttp2_map /* */ streams; + /* Queue for outbound frames other than stream-creating HEADERS */ + nghttp2_pq /* */ ob_pq; + /* Queue for outbound stream-creating HEADERS frame */ + nghttp2_pq /* */ ob_ss_pq; + nghttp2_active_outbound_item aob; + nghttp2_inbound_frame iframe; + nghttp2_hd_context hd_deflater; + nghttp2_hd_context hd_inflater; + nghttp2_session_callbacks callbacks; + /* Sequence number of outbound frame to maintain the order of + enqueue if priority is equal. */ + int64_t next_seq; + /* Buffer used to store inflated name/value pairs in wire format + temporarily on pack/unpack. */ + uint8_t *nvbuf; + void *user_data; + /* In-flight SETTINGS values. NULL does not necessarily mean there + is no in-flight SETTINGS. */ + nghttp2_settings_entry *inflight_iv; + /* The number of entries in |inflight_iv|. -1 if there is no + in-flight SETTINGS. */ + ssize_t inflight_niv; + /* The number of outgoing streams. This will be capped by + remote_settings[NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS]. */ + size_t num_outgoing_streams; + /* The number of incoming streams. This will be capped by + local_settings[NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS]. */ + size_t num_incoming_streams; + /* The number of bytes allocated for nvbuf */ + size_t nvbuflen; /* Next Stream ID. Made unsigned int to detect >= (1 << 31). */ uint32_t next_stream_id; /* The largest stream ID received so far */ @@ -127,51 +157,8 @@ struct nghttp2_session { /* Counter of unique ID of PING. Wraps when it exceeds NGHTTP2_MAX_UNIQUE_ID */ uint32_t next_unique_id; - - /* Sequence number of outbound frame to maintain the order of - enqueue if priority is equal. */ - int64_t next_seq; - - nghttp2_map /* */ streams; - /* The number of outgoing streams. This will be capped by - remote_settings[NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS]. */ - size_t num_outgoing_streams; - /* The number of incoming streams. This will be capped by - local_settings[NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS]. */ - size_t num_incoming_streams; - - /* Queue for outbound frames other than stream-creating HEADERS */ - nghttp2_pq /* */ ob_pq; - /* Queue for outbound stream-creating HEADERS frame */ - nghttp2_pq /* */ ob_ss_pq; - - nghttp2_active_outbound_item aob; - - nghttp2_inbound_frame iframe; - - /* Buffer used to store inflated name/value pairs in wire format - temporarily on pack/unpack. */ - uint8_t *nvbuf; - /* The number of bytes allocated for nvbuf */ - size_t nvbuflen; - - nghttp2_hd_context hd_deflater; - nghttp2_hd_context hd_inflater; - - /* Flags indicating GOAWAY is sent and/or recieved. The flags are - composed by bitwise OR-ing nghttp2_goaway_flag. */ - uint8_t goaway_flags; /* This is the value in GOAWAY frame received from remote endpoint. */ int32_t last_stream_id; - - /* Non-zero indicates connection-level flow control on remote side - is in effect. This will be disabled when WINDOW_UPDATE with - END_FLOW_CONTROL bit set is received. */ - uint8_t remote_flow_control; - /* Non-zero indicates connection-level flow control on local side is - in effect. This will be disabled when WINDOW_UPDATE with - END_FLOW_CONTROL bit set is sent. */ - uint8_t local_flow_control; /* Current sender window size. This value is computed against the current initial window size of remote endpoint. */ int32_t remote_window_size; @@ -187,25 +174,26 @@ struct nghttp2_session { increased/decreased by submitting WINDOW_UPDATE. See nghttp2_submit_window_update(). */ int32_t local_window_size; - /* Settings value received from the remote endpoint. We just use ID as index. The index = 0 is unused. */ uint32_t remote_settings[NGHTTP2_SETTINGS_MAX+1]; /* Settings value of the local endpoint. */ uint32_t local_settings[NGHTTP2_SETTINGS_MAX+1]; - - /* In-flight SETTINGS values. NULL does not necessarily mean there - is no in-flight SETTINGS. */ - nghttp2_settings_entry *inflight_iv; - /* The number of entries in |inflight_iv|. -1 if there is no - in-flight SETTINGS. */ - ssize_t inflight_niv; - /* Option flags. This is bitwise-OR of 0 or more of nghttp2_optmask. */ uint32_t opt_flags; - - nghttp2_session_callbacks callbacks; - void *user_data; + /* Nonzero if the session is server side. */ + uint8_t server; + /* Flags indicating GOAWAY is sent and/or recieved. The flags are + composed by bitwise OR-ing nghttp2_goaway_flag. */ + uint8_t goaway_flags; + /* Non-zero indicates connection-level flow control on remote side + is in effect. This will be disabled when WINDOW_UPDATE with + END_FLOW_CONTROL bit set is received. */ + uint8_t remote_flow_control; + /* Non-zero indicates connection-level flow control on local side is + in effect. This will be disabled when WINDOW_UPDATE with + END_FLOW_CONTROL bit set is sent. */ + uint8_t local_flow_control; }; /* Struct used when updating initial window size of each active diff --git a/lib/nghttp2_stream.h b/lib/nghttp2_stream.h index 0f9e72a2..b2007331 100644 --- a/lib/nghttp2_stream.h +++ b/lib/nghttp2_stream.h @@ -81,19 +81,33 @@ typedef enum { typedef struct { /* Intrusive Map */ nghttp2_map_entry map_entry; - /* stream ID */ - int32_t stream_id; - nghttp2_stream_state state; - /* Use same value in SYN_STREAM frame */ - uint8_t flags; - /* Use same value in SYN_STREAM frame */ - int32_t pri; - /* Bitwise OR of zero or more nghttp2_shut_flag values */ - uint8_t shut_flags; /* The arbitrary data provided by user for this stream. */ void *stream_user_data; /* Deferred DATA frame */ nghttp2_outbound_item *deferred_data; + /* stream ID */ + int32_t stream_id; + /* Use same value in SYN_STREAM frame */ + int32_t pri; + /* Current remote window size. This value is computed against the + current initial window size of remote endpoint. */ + int32_t remote_window_size; + /* Keep track of the number of bytes received without + WINDOW_UPDATE. This could be negative after submitting negative + value to WINDOW_UPDATE */ + int32_t recv_window_size; + /* The amount of recv_window_size cut using submitting negative + value to WINDOW_UPDATE */ + int32_t recv_reduction; + /* window size for local flow control. It is initially set to + NGHTTP2_INITIAL_WINDOW_SIZE and could be increased/decreased by + submitting WINDOW_UPDATE. See nghttp2_submit_window_update(). */ + int32_t local_window_size; + nghttp2_stream_state state; + /* Use same value in SYN_STREAM frame */ + uint8_t flags; + /* Bitwise OR of zero or more nghttp2_shut_flag values */ + uint8_t shut_flags; /* The flags for defered DATA. Bitwise OR of zero or more nghttp2_deferred_flag values */ uint8_t deferred_flags; @@ -109,20 +123,6 @@ typedef struct { flow control options off or sending WINDOW_UPDATE with END_FLOW_CONTROL bit set. */ uint8_t local_flow_control; - /* Current remote window size. This value is computed against the - current initial window size of remote endpoint. */ - int32_t remote_window_size; - /* Keep track of the number of bytes received without - WINDOW_UPDATE. This could be negative after submitting negative - value to WINDOW_UPDATE */ - int32_t recv_window_size; - /* The amount of recv_window_size cut using submitting negative - value to WINDOW_UPDATE */ - int32_t recv_reduction; - /* window size for local flow control. It is initially set to - NGHTTP2_INITIAL_WINDOW_SIZE and could be increased/decreased by - submitting WINDOW_UPDATE. See nghttp2_submit_window_update(). */ - int32_t local_window_size; } nghttp2_stream; void nghttp2_stream_init(nghttp2_stream *stream, int32_t stream_id, diff --git a/src/HttpServer.cc b/src/HttpServer.cc index 1ff07a91..80f439c0 100644 --- a/src/HttpServer.cc +++ b/src/HttpServer.cc @@ -64,16 +64,16 @@ const std::string NGHTTPD_SERVER = "nghttpd nghttp2/" NGHTTP2_VERSION; } // namespace Config::Config() - : verbose(false), - daemon(false), - port(0), + : data_ptr(nullptr), on_request_recv_callback(nullptr), - data_ptr(nullptr), + output_upper_thres(1024*1024), + header_table_size(-1), + port(0), + verbose(false), + daemon(false), verify_client(false), no_tls(false), - no_flow_control(false), - output_upper_thres(1024*1024), - header_table_size(-1) + no_flow_control(false) {} Request::Request(int32_t stream_id) @@ -175,10 +175,14 @@ void fill_callback(nghttp2_session_callbacks& callbacks, const Config *config); Http2Handler::Http2Handler(Sessions *sessions, int fd, SSL *ssl, int64_t session_id) - : session_(nullptr), sessions_(sessions), bev_(nullptr), fd_(fd), ssl_(ssl), - session_id_(session_id), + : session_id_(session_id), + session_(nullptr), + sessions_(sessions), + bev_(nullptr), + ssl_(ssl), + settings_timerev_(nullptr), left_connhd_len_(NGHTTP2_CLIENT_CONNECTION_HEADER_LEN), - settings_timerev_(nullptr) + fd_(fd) {} Http2Handler::~Http2Handler() diff --git a/src/HttpServer.h b/src/HttpServer.h index 458bcfd3..e9d6af4c 100644 --- a/src/HttpServer.h +++ b/src/HttpServer.h @@ -48,29 +48,29 @@ namespace nghttp2 { struct Config { std::string htdocs; - bool verbose; - bool daemon; std::string host; - uint16_t port; std::string private_key_file; std::string cert_file; - nghttp2_on_request_recv_callback on_request_recv_callback; void *data_ptr; + nghttp2_on_request_recv_callback on_request_recv_callback; + size_t output_upper_thres; + ssize_t header_table_size; + uint16_t port; + bool verbose; + bool daemon; bool verify_client; bool no_tls; bool no_flow_control; - size_t output_upper_thres; - ssize_t header_table_size; Config(); }; class Sessions; struct Request { - int32_t stream_id; std::vector> headers; - int file; std::pair response_body; + int32_t stream_id; + int file; Request(int32_t stream_id); ~Request(); }; @@ -118,15 +118,15 @@ public: void remove_settings_timer(); void submit_goaway(nghttp2_error_code error_code); private: + std::map> id2req_; + int64_t session_id_; nghttp2_session *session_; Sessions *sessions_; bufferevent *bev_; - int fd_; SSL* ssl_; - int64_t session_id_; - std::map> id2req_; - size_t left_connhd_len_; event *settings_timerev_; + size_t left_connhd_len_; + int fd_; }; class HttpServer { diff --git a/src/nghttp.cc b/src/nghttp.cc index 32135d2a..128404b8 100644 --- a/src/nghttp.cc +++ b/src/nghttp.cc @@ -78,6 +78,19 @@ namespace nghttp2 { namespace { struct Config { + std::vector> headers; + std::string certfile; + std::string keyfile; + std::string datafile; + size_t output_upper_thres; + ssize_t peer_max_concurrent_streams; + ssize_t header_table_size; + int32_t pri; + int multiply; + // milliseconds + int timeout; + int window_bits; + int connection_window_bits; bool null_out; bool remote_name; bool verbose; @@ -85,35 +98,22 @@ struct Config { bool stat; bool no_flow_control; bool upgrade; - int32_t pri; - int multiply; - // milliseconds - int timeout; - std::string certfile; - std::string keyfile; - int window_bits; - int connection_window_bits; - std::vector> headers; - std::string datafile; - size_t output_upper_thres; - ssize_t peer_max_concurrent_streams; - ssize_t header_table_size; Config() - : null_out(false), - remote_name(false), - verbose(false), - get_assets(false), - stat(false), - no_flow_control(false), - upgrade(false), + : output_upper_thres(1024*1024), + peer_max_concurrent_streams(NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS), + header_table_size(-1), pri(NGHTTP2_PRI_DEFAULT), multiply(1), timeout(-1), window_bits(-1), connection_window_bits(-1), - output_upper_thres(1024*1024), - peer_max_concurrent_streams(NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS), - header_table_size(-1) + null_out(false), + remote_name(false), + verbose(false), + get_assets(false), + stat(false), + no_flow_control(false), + upgrade(false) {} }; } // namespace @@ -248,23 +248,28 @@ namespace { struct Request { // URI without fragment std::string uri; + std::string status; http_parser_url u; + RequestStat stat; + int64_t data_length; + int64_t data_offset; nghttp2_gzip *inflater; HtmlParser *html_parser; const nghttp2_data_provider *data_prd; - int64_t data_length; - int64_t data_offset; int32_t pri; // Recursion level: 0: first entity, 1: entity linked from first entity int level; - RequestStat stat; - std::string status; Request(const std::string& uri, const http_parser_url &u, const nghttp2_data_provider *data_prd, int64_t data_length, int32_t pri, int level = 0) - : uri(uri), u(u), - inflater(nullptr), html_parser(nullptr), data_prd(data_prd), - data_length(data_length), data_offset(0), pri(pri), + : uri(uri), + u(u), + data_length(data_length), + data_offset(0), + inflater(nullptr), + html_parser(nullptr), + data_prd(data_prd), + pri(pri), level(level) {} @@ -422,6 +427,17 @@ enum client_state { namespace { struct HttpClient { + std::vector> reqvec; + // Map from stream ID to Request object. + std::map streams; + // Insert path already added in reqvec to prevent multiple request + // for 1 resource. + std::set path_cache; + std::string scheme; + std::string hostport; + // Used for parse the HTTP upgrade response from server + std::unique_ptr htp; + SessionStat stat; nghttp2_session *session; const nghttp2_session_callbacks *callbacks; event_base *evbase; @@ -430,29 +446,18 @@ struct HttpClient { SSL *ssl; bufferevent *bev; event *settings_timerev; - client_state state; - std::vector> reqvec; - // Map from stream ID to Request object. - std::map streams; - // Insert path already added in reqvec to prevent multiple request - // for 1 resource. - std::set path_cache; // The number of completed requests, including failed ones. size_t complete; - std::string scheme; - std::string hostport; - SessionStat stat; - // Used for parse the HTTP upgrade response from server - std::unique_ptr htp; + // The length of settings_payload + size_t settings_payloadlen; + client_state state; + // The HTTP status code of the response message of HTTP Upgrade. + unsigned int upgrade_response_status_code; // true if the response message of HTTP Upgrade request is fully // received. It is not relevant the upgrade succeeds, or not. bool upgrade_response_complete; - // The HTTP status code of the response message of HTTP Upgrade. - unsigned int upgrade_response_status_code; // SETTINGS payload sent as token68 in HTTP Upgrade uint8_t settings_payload[16]; - // The length of settings_payload - size_t settings_payloadlen; HttpClient(const nghttp2_session_callbacks* callbacks, event_base *evbase, SSL_CTX *ssl_ctx) @@ -464,11 +469,11 @@ struct HttpClient { ssl(nullptr), bev(nullptr), settings_timerev(nullptr), - state(STATE_IDLE), complete(0), - upgrade_response_complete(false), + settings_payloadlen(0), + state(STATE_IDLE), upgrade_response_status_code(0), - settings_payloadlen(0) + upgrade_response_complete(false) {} ~HttpClient() diff --git a/src/shrpx_client_handler.cc b/src/shrpx_client_handler.cc index 7c9d4c23..bd640f99 100644 --- a/src/shrpx_client_handler.cc +++ b/src/shrpx_client_handler.cc @@ -213,13 +213,13 @@ void upstream_http1_connhd_readcb(bufferevent *bev, void *arg) ClientHandler::ClientHandler(bufferevent *bev, int fd, SSL *ssl, const char *ipaddr) - : bev_(bev), - fd_(fd), - ssl_(ssl), - ipaddr_(ipaddr), - should_close_after_write_(false), + : ipaddr_(ipaddr), + bev_(bev), http2session_(nullptr), - left_connhd_len_(NGHTTP2_CLIENT_CONNECTION_HEADER_LEN) + ssl_(ssl), + left_connhd_len_(NGHTTP2_CLIENT_CONNECTION_HEADER_LEN), + fd_(fd), + should_close_after_write_(false) { bufferevent_set_rate_limit(bev_, get_config()->rate_limit_cfg); bufferevent_enable(bev_, EV_READ | EV_WRITE); diff --git a/src/shrpx_client_handler.h b/src/shrpx_client_handler.h index abbc6f99..1ebaf457 100644 --- a/src/shrpx_client_handler.h +++ b/src/shrpx_client_handler.h @@ -76,18 +76,18 @@ public: int perform_http2_upgrade(HttpsUpstream *http); bool get_http2_upgrade_allowed() const; private: - bufferevent *bev_; - int fd_; - SSL *ssl_; + std::set dconn_pool_; std::unique_ptr upstream_; std::string ipaddr_; - bool should_close_after_write_; - std::set dconn_pool_; + bufferevent *bev_; // Shared HTTP2 session for each thread. NULL if backend is not // HTTP2. Not deleted by this object. Http2Session *http2session_; + SSL *ssl_; // The number of bytes of HTTP/2.0 client connection header to read size_t left_connhd_len_; + int fd_; + bool should_close_after_write_; }; } // namespace shrpx diff --git a/src/shrpx_config.h b/src/shrpx_config.h index 1afb4815..009e5e7e 100644 --- a/src/shrpx_config.h +++ b/src/shrpx_config.h @@ -115,89 +115,41 @@ enum shrpx_proto { }; struct Config { - bool verbose; - bool daemon; - char *host; - uint16_t port; - char *private_key_file; - char *private_key_passwd; - char *cert_file; - char *dh_param_file; - SSL_CTX *default_ssl_ctx; - ssl::CertLookupTree *cert_tree; - bool verify_client; - const char *server_name; - char *downstream_host; - uint16_t downstream_port; - char *downstream_hostport; + // The list of (private key file, certificate file) pair + std::vector> subcerts; sockaddr_union downstream_addr; - size_t downstream_addrlen; + // binary form of http proxy host and port + sockaddr_union downstream_http_proxy_addr; timeval http2_upstream_read_timeout; timeval upstream_read_timeout; timeval upstream_write_timeout; timeval downstream_read_timeout; timeval downstream_write_timeout; timeval downstream_idle_read_timeout; - size_t num_worker; - size_t http2_max_concurrent_streams; - bool http2_proxy; - bool http2_bridge; - bool client_proxy; - bool add_x_forwarded_for; - bool no_via; - bool accesslog; - size_t http2_upstream_window_bits; - size_t http2_downstream_window_bits; - size_t http2_upstream_connection_window_bits; - size_t http2_downstream_connection_window_bits; - bool upstream_no_tls; - bool downstream_no_tls; + char *host; + char *private_key_file; + char *private_key_passwd; + char *cert_file; + char *dh_param_file; + SSL_CTX *default_ssl_ctx; + ssl::CertLookupTree *cert_tree; + const char *server_name; + char *downstream_host; + char *downstream_hostport; char *backend_tls_sni_name; char *pid_file; - uid_t uid; - gid_t gid; char *conf_path; - bool syslog; - int syslog_facility; - // This member finally decides syslog is used or not - bool use_syslog; - int backlog; char *ciphers; - bool honor_cipher_order; - bool client; - // true if --client or --client-proxy are enabled. - bool client_mode; - // downstream protocol; this will be determined by given options. - shrpx_proto downstream_proto; - bool insecure; char *cacert; - bool backend_ipv4; - bool backend_ipv6; - // true if stderr refers to a terminal. - bool tty; // userinfo in http proxy URI, not percent-encoded form char *downstream_http_proxy_userinfo; // host in http proxy URI char *downstream_http_proxy_host; - // port in http proxy URI - uint16_t downstream_http_proxy_port; - // binary form of http proxy host and port - sockaddr_union downstream_http_proxy_addr; - // actual size of downstream_http_proxy_addr - size_t downstream_http_proxy_addrlen; // Rate limit configuration ev_token_bucket_cfg *rate_limit_cfg; - size_t read_rate; - size_t read_burst; - size_t write_rate; - size_t write_burst; // Comma delimited list of NPN protocol strings in the order of // preference. char **npn_list; - // The number of elements in npn_list - size_t npn_list_len; - // The list of (private key file, certificate file) pair - std::vector> subcerts; // Path to file containing CA certificate solely used for client // certificate validation char *verify_client_cacert; @@ -205,6 +157,54 @@ struct Config { char *client_cert_file; FILE *http2_upstream_dump_request_header; FILE *http2_upstream_dump_response_header; + size_t downstream_addrlen; + size_t num_worker; + size_t http2_max_concurrent_streams; + size_t http2_upstream_window_bits; + size_t http2_downstream_window_bits; + size_t http2_upstream_connection_window_bits; + size_t http2_downstream_connection_window_bits; + // actual size of downstream_http_proxy_addr + size_t downstream_http_proxy_addrlen; + size_t read_rate; + size_t read_burst; + size_t write_rate; + size_t write_burst; + // The number of elements in npn_list + size_t npn_list_len; + // downstream protocol; this will be determined by given options. + shrpx_proto downstream_proto; + int syslog_facility; + int backlog; + uid_t uid; + gid_t gid; + uint16_t port; + uint16_t downstream_port; + // port in http proxy URI + uint16_t downstream_http_proxy_port; + bool verbose; + bool daemon; + bool verify_client; + bool http2_proxy; + bool http2_bridge; + bool client_proxy; + bool add_x_forwarded_for; + bool no_via; + bool accesslog; + bool upstream_no_tls; + bool downstream_no_tls; + bool syslog; + // This member finally decides syslog is used or not + bool use_syslog; + bool honor_cipher_order; + bool client; + // true if --client or --client-proxy are enabled. + bool client_mode; + bool insecure; + bool backend_ipv4; + bool backend_ipv6; + // true if stderr refers to a terminal. + bool tty; bool http2_no_cookie_crumbling; }; diff --git a/src/shrpx_downstream.cc b/src/shrpx_downstream.cc index 285c38c6..ac0a733e 100644 --- a/src/shrpx_downstream.cc +++ b/src/shrpx_downstream.cc @@ -38,30 +38,30 @@ using namespace nghttp2; namespace shrpx { Downstream::Downstream(Upstream *upstream, int stream_id, int priority) - : upstream_(upstream), + : request_bodylen_(0), + upstream_(upstream), dconn_(nullptr), + response_body_buf_(nullptr), stream_id_(stream_id), priority_(priority), downstream_stream_id_(-1), - upgrade_request_(false), - upgraded_(false), + response_rst_stream_error_code_(NGHTTP2_NO_ERROR), request_state_(INITIAL), request_major_(1), request_minor_(1), - chunked_request_(false), - request_connection_close_(false), - request_expect_100_continue_(false), - request_header_key_prev_(false), - request_bodylen_(0), response_state_(INITIAL), response_http_status_(0), response_major_(1), response_minor_(1), + upgrade_request_(false), + upgraded_(false), + chunked_request_(false), + request_connection_close_(false), + request_expect_100_continue_(false), + request_header_key_prev_(false), chunked_response_(false), response_connection_close_(false), - response_header_key_prev_(false), - response_body_buf_(nullptr), - response_rst_stream_error_code_(NGHTTP2_NO_ERROR) + response_header_key_prev_(false) {} Downstream::~Downstream() diff --git a/src/shrpx_downstream.h b/src/shrpx_downstream.h index 9b81d1ed..bcba617a 100644 --- a/src/shrpx_downstream.h +++ b/src/shrpx_downstream.h @@ -178,47 +178,54 @@ public: static const size_t OUTPUT_UPPER_THRES = 64*1024; private: + Headers request_headers_; + Headers response_headers_; + + std::string request_method_; + std::string request_path_; + std::string request_http2_scheme_; + std::string request_http2_authority_; + std::string assembled_request_cookie_; + // the length of request body + int64_t request_bodylen_; + Upstream *upstream_; DownstreamConnection *dconn_; + // This buffer is used to temporarily store downstream response + // body. nghttp2 library reads data from this in the callback. + evbuffer *response_body_buf_; + int32_t stream_id_; int32_t priority_; // stream ID in backend connection int32_t downstream_stream_id_; + + // RST_STREAM error_code from downstream HTTP2 connection + nghttp2_error_code response_rst_stream_error_code_; + + int request_state_; + int request_major_; + int request_minor_; + + int response_state_; + unsigned int response_http_status_; + int response_major_; + int response_minor_; + // true if the request contains upgrade token (HTTP Upgrade or // CONNECT) bool upgrade_request_; // true if the connection is upgraded (HTTP Upgrade or CONNECT) bool upgraded_; - int request_state_; - std::string request_method_; - std::string request_path_; - std::string request_http2_scheme_; - std::string request_http2_authority_; - int request_major_; - int request_minor_; bool chunked_request_; bool request_connection_close_; bool request_expect_100_continue_; - std::string assembled_request_cookie_; - Headers request_headers_; bool request_header_key_prev_; - // the length of request body - int64_t request_bodylen_; - int response_state_; - unsigned int response_http_status_; - int response_major_; - int response_minor_; bool chunked_response_; bool response_connection_close_; - Headers response_headers_; bool response_header_key_prev_; - // This buffer is used to temporarily store downstream response - // body. nghttp2 library reads data from this in the callback. - evbuffer *response_body_buf_; - // RST_STREAM error_code from downstream HTTP2 connection - nghttp2_error_code response_rst_stream_error_code_; }; } // namespace shrpx diff --git a/src/shrpx_http2_session.cc b/src/shrpx_http2_session.cc index e3b88140..046564bf 100644 --- a/src/shrpx_http2_session.cc +++ b/src/shrpx_http2_session.cc @@ -52,15 +52,15 @@ Http2Session::Http2Session(event_base *evbase, SSL_CTX *ssl_ctx) : evbase_(evbase), ssl_ctx_(ssl_ctx), ssl_(nullptr), - fd_(-1), session_(nullptr), bev_(nullptr), - state_(DISCONNECTED), - notified_(false), wrbev_(nullptr), rdbev_(nullptr), - flow_control_(false), - settings_timerev_(nullptr) + settings_timerev_(nullptr), + fd_(-1), + state_(DISCONNECTED), + notified_(false), + flow_control_(false) {} Http2Session::~Http2Session() diff --git a/src/shrpx_http2_session.h b/src/shrpx_http2_session.h index 61195df3..8622bfda 100644 --- a/src/shrpx_http2_session.h +++ b/src/shrpx_http2_session.h @@ -117,27 +117,27 @@ public: CONNECTED }; private: + std::set dconns_; + std::set streams_; + // Used to parse the response from HTTP proxy + std::unique_ptr proxy_htp_; event_base *evbase_; // NULL if no TLS is configured SSL_CTX *ssl_ctx_; SSL *ssl_; + nghttp2_session *session_; + bufferevent *bev_; + bufferevent *wrbev_; + bufferevent *rdbev_; + event *settings_timerev_; // fd_ is used for proxy connection and no TLS connection. For // direct or TLS connection, it may be -1 even after connection is // established. Use bufferevent_getfd(bev_) to get file descriptor // in these cases. int fd_; - nghttp2_session *session_; - bufferevent *bev_; - std::set dconns_; - std::set streams_; int state_; bool notified_; - bufferevent *wrbev_; - bufferevent *rdbev_; bool flow_control_; - // Used to parse the response from HTTP proxy - std::unique_ptr proxy_htp_; - event *settings_timerev_; }; } // namespace shrpx diff --git a/src/shrpx_http2_upstream.h b/src/shrpx_http2_upstream.h index 31eb97b0..e88f726c 100644 --- a/src/shrpx_http2_upstream.h +++ b/src/shrpx_http2_upstream.h @@ -80,12 +80,12 @@ public: int start_settings_timer(); void stop_settings_timer(); private: - ClientHandler *handler_; - nghttp2_session *session_; - bool flow_control_; DownstreamQueue downstream_queue_; std::unique_ptr pre_upstream_; + ClientHandler *handler_; + nghttp2_session *session_; event *settings_timerev_; + bool flow_control_; }; } // namespace shrpx diff --git a/src/shrpx_listen_handler.cc b/src/shrpx_listen_handler.cc index 2e995fc8..7ef396d5 100644 --- a/src/shrpx_listen_handler.cc +++ b/src/shrpx_listen_handler.cc @@ -46,10 +46,10 @@ ListenHandler::ListenHandler(event_base *evbase, SSL_CTX *sv_ssl_ctx, : evbase_(evbase), sv_ssl_ctx_(sv_ssl_ctx), cl_ssl_ctx_(cl_ssl_ctx), - worker_round_robin_cnt_(0), workers_(nullptr), + http2session_(nullptr), num_worker_(0), - http2session_(nullptr) + worker_round_robin_cnt_(0) {} ListenHandler::~ListenHandler() diff --git a/src/shrpx_listen_handler.h b/src/shrpx_listen_handler.h index fc0f7e90..26341aaa 100644 --- a/src/shrpx_listen_handler.h +++ b/src/shrpx_listen_handler.h @@ -37,10 +37,10 @@ namespace shrpx { struct WorkerInfo { - int sv[2]; SSL_CTX *sv_ssl_ctx; SSL_CTX *cl_ssl_ctx; bufferevent *bev; + int sv[2]; }; class Http2Session; @@ -59,12 +59,12 @@ private: SSL_CTX *sv_ssl_ctx_; // The backend server SSL_CTX SSL_CTX *cl_ssl_ctx_; - unsigned int worker_round_robin_cnt_; WorkerInfo *workers_; - size_t num_worker_; // Shared backend HTTP2 session. NULL if multi-threaded. In // multi-threaded case, see shrpx_worker.cc. Http2Session *http2session_; + size_t num_worker_; + unsigned int worker_round_robin_cnt_; }; } // namespace shrpx diff --git a/src/shrpx_log.cc b/src/shrpx_log.cc index 4519190d..192786de 100644 --- a/src/shrpx_log.cc +++ b/src/shrpx_log.cc @@ -83,8 +83,8 @@ int severity_to_syslog_level(int severity) } Log::Log(int severity, const char *filename, int linenum) - : severity_(severity), - filename_(filename), + : filename_(filename), + severity_(severity), linenum_(linenum) {} diff --git a/src/shrpx_log.h b/src/shrpx_log.h index 3379d55e..c9a739fd 100644 --- a/src/shrpx_log.h +++ b/src/shrpx_log.h @@ -88,10 +88,10 @@ public: return severity >= severity_thres_; } private: - int severity_; - const char *filename_; - int linenum_; std::stringstream stream_; + const char *filename_; + int severity_; + int linenum_; static int severity_thres_; }; diff --git a/src/shrpx_spdy_upstream.cc b/src/shrpx_spdy_upstream.cc index 10bd9aeb..aca23332 100644 --- a/src/shrpx_spdy_upstream.cc +++ b/src/shrpx_spdy_upstream.cc @@ -372,7 +372,7 @@ uint32_t infer_upstream_rst_stream_status_code SpdyUpstream::SpdyUpstream(uint16_t version, ClientHandler *handler) : handler_(handler), - session_(0) + session_(nullptr) { //handler->set_bev_cb(spdy_readcb, 0, spdy_eventcb); handler->set_upstream_timeouts(&get_config()->http2_upstream_read_timeout, diff --git a/src/shrpx_spdy_upstream.h b/src/shrpx_spdy_upstream.h index 490312f4..aa33ec2d 100644 --- a/src/shrpx_spdy_upstream.h +++ b/src/shrpx_spdy_upstream.h @@ -68,11 +68,11 @@ public: bool get_flow_control() const; private: + DownstreamQueue downstream_queue_; ClientHandler *handler_; spdylay_session *session_; - bool flow_control_; int32_t initial_window_size_; - DownstreamQueue downstream_queue_; + bool flow_control_; }; } // namespace shrpx diff --git a/src/shrpx_thread_event_receiver.h b/src/shrpx_thread_event_receiver.h index 064dc72f..9a9ee972 100644 --- a/src/shrpx_thread_event_receiver.h +++ b/src/shrpx_thread_event_receiver.h @@ -38,9 +38,9 @@ namespace shrpx { class Http2Session; struct WorkerEvent { - evutil_socket_t client_fd; sockaddr_union client_addr; size_t client_addrlen; + evutil_socket_t client_fd; }; class ThreadEventReceiver { diff --git a/src/shrpx_worker.cc b/src/shrpx_worker.cc index 8d9e94a7..1e0099da 100644 --- a/src/shrpx_worker.cc +++ b/src/shrpx_worker.cc @@ -43,9 +43,9 @@ using namespace nghttp2; namespace shrpx { Worker::Worker(WorkerInfo *info) - : fd_(info->sv[1]), - sv_ssl_ctx_(info->sv_ssl_ctx), - cl_ssl_ctx_(info->cl_ssl_ctx) + : sv_ssl_ctx_(info->sv_ssl_ctx), + cl_ssl_ctx_(info->cl_ssl_ctx), + fd_(info->sv[1]) {} Worker::~Worker() diff --git a/src/shrpx_worker.h b/src/shrpx_worker.h index f7d9ffe6..bac6b8aa 100644 --- a/src/shrpx_worker.h +++ b/src/shrpx_worker.h @@ -40,10 +40,10 @@ public: ~Worker(); void run(); private: - // Channel to the main thread - int fd_; SSL_CTX *sv_ssl_ctx_; SSL_CTX *cl_ssl_ctx_; + // Channel to the main thread + int fd_; }; void start_threaded_worker(WorkerInfo *info);