Merge branch 'clang-format-3.9'

This commit is contained in:
Tatsuhiro Tsujikawa 2016-10-15 18:39:15 +09:00
commit 4130c68db1
52 changed files with 4847 additions and 4875 deletions

View File

@ -1,57 +1,94 @@
--- ---
Language: Cpp Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -2 AccessModifierOffset: -2
ConstructorInitializerIndentWidth: 4 AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlinesLeft: false AlignEscapedNewlinesLeft: false
AlignOperands: true
AlignTrailingComments: true AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: false AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false AllowShortLoopsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakTemplateDeclarations: false AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false AlwaysBreakBeforeMultilineStrings: false
BreakBeforeBinaryOperators: false AlwaysBreakTemplateDeclarations: false
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeTernaryOperators: true BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false BreakConstructorInitializersBeforeComma: false
BinPackParameters: true BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 80 ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false ExperimentalAutoDetectBinPacking: false
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
- Regex: '^(<|"(gtest|isl|json)/)'
Priority: 3
- Regex: '.*'
Priority: 1
IncludeIsMainRegex: '$'
IndentCaseLabels: false IndentCaseLabels: false
IndentWidth: 2
IndentWrappedFunctionNames: false IndentWrappedFunctionNames: false
IndentFunctionDeclarationAfterType: false JavaScriptQuotes: Leave
MaxEmptyLinesToKeep: 1 JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None NamespaceIndentation: None
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true ObjCSpaceBeforeProtocolList: true
PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300 PenaltyBreakComment: 300
PenaltyBreakString: 1000
PenaltyBreakFirstLessLess: 120 PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000 PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60 PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right PointerAlignment: Right
ReflowComments: true
SortIncludes: false
SpaceAfterCStyleCast: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1 SpacesBeforeTrailingComments: 1
Cpp11BracedListStyle: true SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11 Standard: Cpp11
IndentWidth: 2
TabWidth: 8 TabWidth: 8
UseTab: Never UseTab: Never
BreakBeforeBraces: Attach
SpacesInParentheses: false
SpacesInAngles: false
SpaceInEmptyParentheses: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: true
SpaceBeforeAssignmentOperators: true
ContinuationIndentWidth: 4
CommentPragmas: '^ IWYU pragma:'
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
SpaceBeforeParens: ControlStatements
DisableFormat: false
... ...

View File

@ -27,7 +27,7 @@ We use clang-format to format source code consistently. The
clang-format configuration file .clang-format is located at the root clang-format configuration file .clang-format is located at the root
directory. Since clang-format produces slightly different results directory. Since clang-format produces slightly different results
between versions, we currently use clang-format which comes with between versions, we currently use clang-format which comes with
clang-3.6. clang-3.9.
To detect any violation to the coding style, we recommend to setup git To detect any violation to the coding style, we recommend to setup git
pre-commit hook to check coding style of the changes you introduced. pre-commit hook to check coding style of the changes you introduced.
@ -35,7 +35,7 @@ The pre-commit file is located at the root directory. Copy it under
.git/hooks and make sure that it is executable. The pre-commit script .git/hooks and make sure that it is executable. The pre-commit script
uses clang-format-diff.py to detect any style errors. If it is not in uses clang-format-diff.py to detect any style errors. If it is not in
your PATH or it exists under different name (e.g., your PATH or it exists under different name (e.g.,
clang-format-diff-3.6 in debian), either add it to PATH variable or clang-format-diff-3.9 in debian), either add it to PATH variable or
add git option ``clangformatdiff.binary`` to point to the script. add git option ``clangformatdiff.binary`` to point to the script.
For emacs users, integrating clang-format to emacs is very easy. For emacs users, integrating clang-format to emacs is very easy.

View File

@ -66,13 +66,13 @@ enum { IO_NONE, WANT_READ, WANT_WRITE };
#define MAKE_NV(NAME, VALUE) \ #define MAKE_NV(NAME, VALUE) \
{ \ { \
(uint8_t *) NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1, \ (uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1, \
NGHTTP2_NV_FLAG_NONE \ NGHTTP2_NV_FLAG_NONE \
} }
#define MAKE_NV_CS(NAME, VALUE) \ #define MAKE_NV_CS(NAME, VALUE) \
{ \ { \
(uint8_t *) NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, strlen(VALUE), \ (uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, strlen(VALUE), \
NGHTTP2_NV_FLAG_NONE \ NGHTTP2_NV_FLAG_NONE \
} }
@ -457,11 +457,12 @@ static void ctl_poll(struct pollfd *pollfd, struct Connection *connection) {
static void submit_request(struct Connection *connection, struct Request *req) { static void submit_request(struct Connection *connection, struct Request *req) {
int32_t stream_id; int32_t stream_id;
/* Make sure that the last item is NULL */ /* Make sure that the last item is NULL */
const nghttp2_nv nva[] = { const nghttp2_nv nva[] = {MAKE_NV(":method", "GET"),
MAKE_NV(":method", "GET"), MAKE_NV_CS(":path", req->path), MAKE_NV_CS(":path", req->path),
MAKE_NV(":scheme", "https"), MAKE_NV_CS(":authority", req->hostport), MAKE_NV(":scheme", "https"),
MAKE_NV("accept", "*/*"), MAKE_NV_CS(":authority", req->hostport),
MAKE_NV("user-agent", "nghttp2/" NGHTTP2_VERSION)}; MAKE_NV("accept", "*/*"),
MAKE_NV("user-agent", "nghttp2/" NGHTTP2_VERSION)};
stream_id = nghttp2_submit_request(connection->session, NULL, nva, stream_id = nghttp2_submit_request(connection->session, NULL, nva,
sizeof(nva) / sizeof(nva[0]), NULL, req); sizeof(nva) / sizeof(nva[0]), NULL, req);

View File

@ -33,7 +33,7 @@
#define MAKE_NV(K, V) \ #define MAKE_NV(K, V) \
{ \ { \
(uint8_t *) K, (uint8_t *)V, sizeof(K) - 1, sizeof(V) - 1, \ (uint8_t *)K, (uint8_t *)V, sizeof(K) - 1, sizeof(V) - 1, \
NGHTTP2_NV_FLAG_NONE \ NGHTTP2_NV_FLAG_NONE \
} }

View File

@ -383,13 +383,13 @@ static void send_client_connection_header(http2_session_data *session_data) {
#define MAKE_NV(NAME, VALUE, VALUELEN) \ #define MAKE_NV(NAME, VALUE, VALUELEN) \
{ \ { \
(uint8_t *) NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, VALUELEN, \ (uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, VALUELEN, \
NGHTTP2_NV_FLAG_NONE \ NGHTTP2_NV_FLAG_NONE \
} }
#define MAKE_NV2(NAME, VALUE) \ #define MAKE_NV2(NAME, VALUE) \
{ \ { \
(uint8_t *) NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1, \ (uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1, \
NGHTTP2_NV_FLAG_NONE \ NGHTTP2_NV_FLAG_NONE \
} }

View File

@ -79,7 +79,7 @@
#define MAKE_NV(NAME, VALUE) \ #define MAKE_NV(NAME, VALUE) \
{ \ { \
(uint8_t *) NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1, \ (uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1, \
NGHTTP2_NV_FLAG_NONE \ NGHTTP2_NV_FLAG_NONE \
} }

View File

@ -2802,8 +2802,8 @@ NGHTTP2_EXTERN int nghttp2_session_send(nghttp2_session *session);
* buffer up small chunks of data as necessary to avoid this * buffer up small chunks of data as necessary to avoid this
* situation. * situation.
*/ */
NGHTTP2_EXTERN ssize_t NGHTTP2_EXTERN ssize_t nghttp2_session_mem_send(nghttp2_session *session,
nghttp2_session_mem_send(nghttp2_session *session, const uint8_t **data_ptr); const uint8_t **data_ptr);
/** /**
* @function * @function
@ -3018,9 +3018,8 @@ nghttp2_session_get_outbound_queue_size(nghttp2_session *session);
* *
* This function returns -1 if it fails. * This function returns -1 if it fails.
*/ */
NGHTTP2_EXTERN int32_t NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_effective_recv_data_length(
nghttp2_session_get_stream_effective_recv_data_length(nghttp2_session *session, nghttp2_session *session, int32_t stream_id);
int32_t stream_id);
/** /**
* @function * @function
@ -3039,9 +3038,8 @@ nghttp2_session_get_stream_effective_recv_data_length(nghttp2_session *session,
* *
* This function returns -1 if it fails. * This function returns -1 if it fails.
*/ */
NGHTTP2_EXTERN int32_t NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_effective_local_window_size(
nghttp2_session_get_stream_effective_local_window_size(nghttp2_session *session, nghttp2_session *session, int32_t stream_id);
int32_t stream_id);
/** /**
* @function * @function
@ -3055,9 +3053,8 @@ nghttp2_session_get_stream_effective_local_window_size(nghttp2_session *session,
* *
* This function returns -1 if it fails. * This function returns -1 if it fails.
*/ */
NGHTTP2_EXTERN int32_t NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_local_window_size(
nghttp2_session_get_stream_local_window_size(nghttp2_session *session, nghttp2_session *session, int32_t stream_id);
int32_t stream_id);
/** /**
* @function * @function
@ -3124,9 +3121,8 @@ nghttp2_session_get_local_window_size(nghttp2_session *session);
* *
* This function returns -1 if it fails. * This function returns -1 if it fails.
*/ */
NGHTTP2_EXTERN int32_t NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_remote_window_size(
nghttp2_session_get_stream_remote_window_size(nghttp2_session *session, nghttp2_session *session, int32_t stream_id);
int32_t stream_id);
/** /**
* @function * @function
@ -3279,9 +3275,8 @@ NGHTTP2_EXTERN int nghttp2_submit_shutdown_notice(nghttp2_session *session);
* The |id| must be one of values defined in * The |id| must be one of values defined in
* :enum:`nghttp2_settings_id`. * :enum:`nghttp2_settings_id`.
*/ */
NGHTTP2_EXTERN uint32_t NGHTTP2_EXTERN uint32_t nghttp2_session_get_remote_settings(
nghttp2_session_get_remote_settings(nghttp2_session *session, nghttp2_session *session, nghttp2_settings_id id);
nghttp2_settings_id id);
/** /**
* @function * @function
@ -3290,9 +3285,8 @@ nghttp2_session_get_remote_settings(nghttp2_session *session,
* by the remote endpoint. The |id| must be one of the values defined * by the remote endpoint. The |id| must be one of the values defined
* in :enum:`nghttp2_settings_id`. * in :enum:`nghttp2_settings_id`.
*/ */
NGHTTP2_EXTERN uint32_t NGHTTP2_EXTERN uint32_t nghttp2_session_get_local_settings(
nghttp2_session_get_local_settings(nghttp2_session *session, nghttp2_session *session, nghttp2_settings_id id);
nghttp2_settings_id id);
/** /**
* @function * @function
@ -3587,9 +3581,8 @@ NGHTTP2_EXTERN int nghttp2_session_upgrade2(nghttp2_session *session,
* :enum:`NGHTTP2_ERR_INSUFF_BUFSIZE` * :enum:`NGHTTP2_ERR_INSUFF_BUFSIZE`
* The provided |buflen| size is too small to hold the output. * The provided |buflen| size is too small to hold the output.
*/ */
NGHTTP2_EXTERN ssize_t NGHTTP2_EXTERN ssize_t nghttp2_pack_settings_payload(
nghttp2_pack_settings_payload(uint8_t *buf, size_t buflen, uint8_t *buf, size_t buflen, const nghttp2_settings_entry *iv, size_t niv);
const nghttp2_settings_entry *iv, size_t niv);
/** /**
* @function * @function
@ -3714,12 +3707,10 @@ nghttp2_priority_spec_check_default(const nghttp2_priority_spec *pri_spec);
* frame. * frame.
* *
*/ */
NGHTTP2_EXTERN int32_t NGHTTP2_EXTERN int32_t nghttp2_submit_request(
nghttp2_submit_request(nghttp2_session *session, nghttp2_session *session, const nghttp2_priority_spec *pri_spec,
const nghttp2_priority_spec *pri_spec, const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider *data_prd,
const nghttp2_nv *nva, size_t nvlen, void *stream_user_data);
const nghttp2_data_provider *data_prd,
void *stream_user_data);
/** /**
* @function * @function
@ -3934,11 +3925,10 @@ NGHTTP2_EXTERN int nghttp2_submit_trailer(nghttp2_session *session,
* frame. * frame.
* *
*/ */
NGHTTP2_EXTERN int32_t NGHTTP2_EXTERN int32_t nghttp2_submit_headers(
nghttp2_submit_headers(nghttp2_session *session, uint8_t flags, nghttp2_session *session, uint8_t flags, int32_t stream_id,
int32_t stream_id, const nghttp2_priority_spec *pri_spec, const nghttp2_priority_spec *pri_spec, const nghttp2_nv *nva, size_t nvlen,
const nghttp2_nv *nva, size_t nvlen, void *stream_user_data);
void *stream_user_data);
/** /**
* @function * @function
@ -4146,10 +4136,9 @@ NGHTTP2_EXTERN int nghttp2_submit_settings(nghttp2_session *session,
* is called for this frame. * is called for this frame.
* *
*/ */
NGHTTP2_EXTERN int32_t NGHTTP2_EXTERN int32_t nghttp2_submit_push_promise(
nghttp2_submit_push_promise(nghttp2_session *session, uint8_t flags, nghttp2_session *session, uint8_t flags, int32_t stream_id,
int32_t stream_id, const nghttp2_nv *nva, const nghttp2_nv *nva, size_t nvlen, void *promised_stream_user_data);
size_t nvlen, void *promised_stream_user_data);
/** /**
* @function * @function
@ -4693,9 +4682,10 @@ nghttp2_hd_deflate_change_table_size(nghttp2_hd_deflater *deflater,
* :enum:`NGHTTP2_ERR_INSUFF_BUFSIZE` * :enum:`NGHTTP2_ERR_INSUFF_BUFSIZE`
* The provided |buflen| size is too small to hold the output. * The provided |buflen| size is too small to hold the output.
*/ */
NGHTTP2_EXTERN ssize_t NGHTTP2_EXTERN ssize_t nghttp2_hd_deflate_hd(nghttp2_hd_deflater *deflater,
nghttp2_hd_deflate_hd(nghttp2_hd_deflater *deflater, uint8_t *buf, uint8_t *buf, size_t buflen,
size_t buflen, const nghttp2_nv *nva, size_t nvlen); const nghttp2_nv *nva,
size_t nvlen);
/** /**
* @function * @function
@ -4724,9 +4714,11 @@ nghttp2_hd_deflate_hd(nghttp2_hd_deflater *deflater, uint8_t *buf,
* :enum:`NGHTTP2_ERR_INSUFF_BUFSIZE` * :enum:`NGHTTP2_ERR_INSUFF_BUFSIZE`
* The provided |buflen| size is too small to hold the output. * The provided |buflen| size is too small to hold the output.
*/ */
NGHTTP2_EXTERN ssize_t NGHTTP2_EXTERN ssize_t nghttp2_hd_deflate_hd_vec(nghttp2_hd_deflater *deflater,
nghttp2_hd_deflate_hd_vec(nghttp2_hd_deflater *deflater, const nghttp2_vec *vec, const nghttp2_vec *vec,
size_t veclen, const nghttp2_nv *nva, size_t nvlen); size_t veclen,
const nghttp2_nv *nva,
size_t nvlen);
/** /**
* @function * @function
@ -5046,10 +5038,11 @@ NGHTTP2_EXTERN ssize_t nghttp2_hd_inflate_hd(nghttp2_hd_inflater *inflater,
* } * }
* *
*/ */
NGHTTP2_EXTERN ssize_t NGHTTP2_EXTERN ssize_t nghttp2_hd_inflate_hd2(nghttp2_hd_inflater *inflater,
nghttp2_hd_inflate_hd2(nghttp2_hd_inflater *inflater, nghttp2_nv *nv_out, nghttp2_nv *nv_out,
int *inflate_flags, const uint8_t *in, size_t inlen, int *inflate_flags,
int in_final); const uint8_t *in, size_t inlen,
int in_final);
/** /**
* @function * @function

View File

@ -35,8 +35,8 @@
/* Make scalar initialization form of nghttp2_hd_entry */ /* Make scalar initialization form of nghttp2_hd_entry */
#define MAKE_STATIC_ENT(N, V, T, H) \ #define MAKE_STATIC_ENT(N, V, T, H) \
{ \ { \
{ NULL, NULL, (uint8_t *)(N), sizeof((N)) - 1, -1 } \ {NULL, NULL, (uint8_t *)(N), sizeof((N)) - 1, -1}, \
, {NULL, NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, \ {NULL, NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, \
{(uint8_t *)(N), (uint8_t *)(V), sizeof((N)) - 1, sizeof((V)) - 1, 0}, \ {(uint8_t *)(N), (uint8_t *)(V), sizeof((N)) - 1, sizeof((V)) - 1, 0}, \
T, H \ T, H \
} }
@ -828,7 +828,7 @@ static size_t encode_length(uint8_t *buf, size_t n, size_t prefix) {
* If the |initial| is nonzero, it is used as a initial value, this * If the |initial| is nonzero, it is used as a initial value, this
* function assumes the |in| starts with intermediate data. * function assumes the |in| starts with intermediate data.
* *
* An entire integer is decoded successfully, decoded, the |*final| is * An entire integer is decoded successfully, decoded, the |*fin| is
* set to nonzero. * set to nonzero.
* *
* This function stores the decoded integer in |*res| if it succeed, * This function stores the decoded integer in |*res| if it succeed,
@ -836,7 +836,7 @@ static size_t encode_length(uint8_t *buf, size_t n, size_t prefix) {
* in the next call will be stored in |*shift_ptr|) and returns number * in the next call will be stored in |*shift_ptr|) and returns number
* of bytes processed, or returns -1, indicating decoding error. * of bytes processed, or returns -1, indicating decoding error.
*/ */
static ssize_t decode_length(uint32_t *res, size_t *shift_ptr, int *final, static ssize_t decode_length(uint32_t *res, size_t *shift_ptr, int *fin,
uint32_t initial, size_t shift, const uint8_t *in, uint32_t initial, size_t shift, const uint8_t *in,
const uint8_t *last, size_t prefix) { const uint8_t *last, size_t prefix) {
uint32_t k = (uint8_t)((1 << prefix) - 1); uint32_t k = (uint8_t)((1 << prefix) - 1);
@ -844,12 +844,12 @@ static ssize_t decode_length(uint32_t *res, size_t *shift_ptr, int *final,
const uint8_t *start = in; const uint8_t *start = in;
*shift_ptr = 0; *shift_ptr = 0;
*final = 0; *fin = 0;
if (n == 0) { if (n == 0) {
if ((*in & k) != k) { if ((*in & k) != k) {
*res = (*in) & k; *res = (*in) & k;
*final = 1; *fin = 1;
return 1; return 1;
} }
@ -891,7 +891,7 @@ static ssize_t decode_length(uint32_t *res, size_t *shift_ptr, int *final,
} }
*res = n; *res = n;
*final = 1; *fin = 1;
return (ssize_t)(in + 1 - start); return (ssize_t)(in + 1 - start);
} }
@ -1296,7 +1296,8 @@ static const nghttp2_nv *nghttp2_hd_table_get2(nghttp2_hd_context *context,
assert(INDEX_RANGE_VALID(context, idx)); assert(INDEX_RANGE_VALID(context, idx));
if (idx >= NGHTTP2_STATIC_TABLE_LENGTH) { if (idx >= NGHTTP2_STATIC_TABLE_LENGTH) {
return &hd_ringbuf_get(&context->hd_table, return &hd_ringbuf_get(&context->hd_table,
idx - NGHTTP2_STATIC_TABLE_LENGTH)->cnv; idx - NGHTTP2_STATIC_TABLE_LENGTH)
->cnv;
} }
return &static_table[idx].cnv; return &static_table[idx].cnv;
@ -1665,13 +1666,13 @@ static ssize_t hd_inflate_read_huff(nghttp2_hd_inflater *inflater,
nghttp2_buf *buf, const uint8_t *in, nghttp2_buf *buf, const uint8_t *in,
const uint8_t *last) { const uint8_t *last) {
ssize_t readlen; ssize_t readlen;
int final = 0; int fin = 0;
if ((size_t)(last - in) >= inflater->left) { if ((size_t)(last - in) >= inflater->left) {
last = in + inflater->left; last = in + inflater->left;
final = 1; fin = 1;
} }
readlen = nghttp2_hd_huff_decode(&inflater->huff_decode_ctx, buf, in, readlen = nghttp2_hd_huff_decode(&inflater->huff_decode_ctx, buf, in,
(size_t)(last - in), final); (size_t)(last - in), fin);
if (readlen < 0) { if (readlen < 0) {
DEBUGF("inflatehd: huffman decoding failed\n"); DEBUGF("inflatehd: huffman decoding failed\n");
@ -2269,10 +2270,10 @@ int nghttp2_hd_emit_table_size(nghttp2_bufs *bufs, size_t table_size) {
return emit_table_size(bufs, table_size); return emit_table_size(bufs, table_size);
} }
ssize_t nghttp2_hd_decode_length(uint32_t *res, size_t *shift_ptr, int *final, ssize_t nghttp2_hd_decode_length(uint32_t *res, size_t *shift_ptr, int *fin,
uint32_t initial, size_t shift, uint8_t *in, uint32_t initial, size_t shift, uint8_t *in,
uint8_t *last, size_t prefix) { uint8_t *last, size_t prefix) {
return decode_length(res, shift_ptr, final, initial, shift, in, last, prefix); return decode_length(res, shift_ptr, fin, initial, shift, in, last, prefix);
} }
static size_t hd_get_num_table_entries(nghttp2_hd_context *context) { static size_t hd_get_num_table_entries(nghttp2_hd_context *context) {

View File

@ -372,7 +372,7 @@ int nghttp2_hd_emit_table_size(nghttp2_bufs *bufs, size_t table_size);
nghttp2_hd_nv nghttp2_hd_table_get(nghttp2_hd_context *context, size_t index); nghttp2_hd_nv nghttp2_hd_table_get(nghttp2_hd_context *context, size_t index);
/* For unittesting purpose */ /* For unittesting purpose */
ssize_t nghttp2_hd_decode_length(uint32_t *res, size_t *shift_ptr, int *final, ssize_t nghttp2_hd_decode_length(uint32_t *res, size_t *shift_ptr, int *fin,
uint32_t initial, size_t shift, uint8_t *in, uint32_t initial, size_t shift, uint8_t *in,
uint8_t *last, size_t prefix); uint8_t *last, size_t prefix);
@ -410,8 +410,8 @@ void nghttp2_hd_huff_decode_context_init(nghttp2_hd_huff_decode_context *ctx);
* will be written to |buf|. This function assumes that |buf| has the * will be written to |buf|. This function assumes that |buf| has the
* enough room to store the decoded byte string. * enough room to store the decoded byte string.
* *
* The caller must set the |final| to nonzero if the given input is * The caller must set the |fin| to nonzero if the given input is the
* the final block. * final block.
* *
* This function returns the number of read bytes from the |in|. * This function returns the number of read bytes from the |in|.
* *
@ -425,6 +425,6 @@ void nghttp2_hd_huff_decode_context_init(nghttp2_hd_huff_decode_context *ctx);
*/ */
ssize_t nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx, ssize_t nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx,
nghttp2_buf *buf, const uint8_t *src, nghttp2_buf *buf, const uint8_t *src,
size_t srclen, int final); size_t srclen, int fin);
#endif /* NGHTTP2_HD_H */ #endif /* NGHTTP2_HD_H */

File diff suppressed because it is too large Load Diff

View File

@ -338,58 +338,70 @@ const char *nghttp2_strerror(int error_code) {
/* Generated by gennmchartbl.py */ /* Generated by gennmchartbl.py */
static int VALID_HD_NAME_CHARS[] = { static int VALID_HD_NAME_CHARS[] = {
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, 0 /* EOT */, 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, 0 /* BS */, 0 /* HT */, 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* LF */, 0 /* VT */, 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* SI */, 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, 0 /* CAN */, 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* EM */, 0 /* SUB */, 0 /* ESC */, 0 /* FS */, 0 /* GS */, 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* RS */, 0 /* US */, 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
1 /* # */, 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, 0 /* , */, 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */,
1 /* - */, 1 /* . */, 0 /* / */, 1 /* 0 */, 1 /* 1 */, 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
1 /* 2 */, 1 /* 3 */, 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */,
1 /* 7 */, 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, 0 /* @ */, 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
0 /* A */, 0 /* B */, 0 /* C */, 0 /* D */, 0 /* E */, 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
0 /* F */, 0 /* G */, 0 /* H */, 0 /* I */, 0 /* J */, 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */,
0 /* K */, 0 /* L */, 0 /* M */, 0 /* N */, 0 /* O */, 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */,
0 /* P */, 0 /* Q */, 0 /* R */, 0 /* S */, 0 /* T */, 0 /* @ */, 0 /* A */, 0 /* B */, 0 /* C */,
0 /* U */, 0 /* V */, 0 /* W */, 0 /* X */, 0 /* Y */, 0 /* D */, 0 /* E */, 0 /* F */, 0 /* G */,
0 /* Z */, 0 /* [ */, 0 /* \ */, 0 /* ] */, 1 /* ^ */, 0 /* H */, 0 /* I */, 0 /* J */, 0 /* K */,
1 /* _ */, 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, 0 /* L */, 0 /* M */, 0 /* N */, 0 /* O */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, 1 /* h */, 0 /* P */, 0 /* Q */, 0 /* R */, 0 /* S */,
1 /* i */, 1 /* j */, 1 /* k */, 1 /* l */, 1 /* m */, 0 /* T */, 0 /* U */, 0 /* V */, 0 /* W */,
1 /* n */, 1 /* o */, 1 /* p */, 1 /* q */, 1 /* r */, 0 /* X */, 0 /* Y */, 0 /* Z */, 0 /* [ */,
1 /* s */, 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */,
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, 1 /* | */, 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
0 /* } */, 1 /* ~ */, 0 /* DEL */, 0 /* 0x80 */, 0 /* 0x81 */, 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
0 /* 0x82 */, 0 /* 0x83 */, 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
0 /* 0x87 */, 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, 0 /* 0x90 */, 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, 0 /* 0x94 */, 0 /* 0x95 */, 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
0 /* 0x96 */, 0 /* 0x97 */, 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
0 /* 0x9b */, 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, 0 /* 0xa4 */, 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
0 /* 0xaa */, 0 /* 0xab */, 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
0 /* 0xaf */, 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, 0 /* 0xb8 */, 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
0 /* 0xbe */, 0 /* 0xbf */, 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
0 /* 0xc3 */, 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, 0 /* 0xcc */, 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
0 /* 0xd2 */, 0 /* 0xd3 */, 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
0 /* 0xd7 */, 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, 0 /* 0xe0 */, 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
0 /* 0xe6 */, 0 /* 0xe7 */, 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
0 /* 0xeb */, 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, 0 /* 0xf4 */, 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
0 /* 0xfa */, 0 /* 0xfb */, 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
0 /* 0xff */ 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
}; };
int nghttp2_check_header_name(const uint8_t *name, size_t len) { int nghttp2_check_header_name(const uint8_t *name, size_t len) {
@ -414,58 +426,70 @@ int nghttp2_check_header_name(const uint8_t *name, size_t len) {
/* Generated by genvchartbl.py */ /* Generated by genvchartbl.py */
static int VALID_HD_VALUE_CHARS[] = { static int VALID_HD_VALUE_CHARS[] = {
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, 0 /* EOT */, 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, 0 /* BS */, 1 /* HT */, 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* LF */, 0 /* VT */, 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* SI */, 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, 0 /* CAN */, 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* EM */, 0 /* SUB */, 0 /* ESC */, 0 /* FS */, 0 /* GS */, 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* RS */, 0 /* US */, 1 /* SPC */, 1 /* ! */, 1 /* " */, 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
1 /* # */, 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, 1 /* , */, 1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */,
1 /* - */, 1 /* . */, 1 /* / */, 1 /* 0 */, 1 /* 1 */, 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
1 /* 2 */, 1 /* 3 */, 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
1 /* 7 */, 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */,
1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, 1 /* @ */, 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* A */, 1 /* B */, 1 /* C */, 1 /* D */, 1 /* E */, 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* F */, 1 /* G */, 1 /* H */, 1 /* I */, 1 /* J */, 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
1 /* K */, 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, 1 /* T */, 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* U */, 1 /* V */, 1 /* W */, 1 /* X */, 1 /* Y */, 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* Z */, 1 /* [ */, 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* _ */, 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, 1 /* h */, 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* i */, 1 /* j */, 1 /* k */, 1 /* l */, 1 /* m */, 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* n */, 1 /* o */, 1 /* p */, 1 /* q */, 1 /* r */, 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
1 /* s */, 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */,
1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, 1 /* | */, 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* } */, 1 /* ~ */, 0 /* DEL */, 1 /* 0x80 */, 1 /* 0x81 */, 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* 0x82 */, 1 /* 0x83 */, 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* 0x87 */, 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, 1 /* 0x90 */, 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, 1 /* 0x94 */, 1 /* 0x95 */, 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* 0x96 */, 1 /* 0x97 */, 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */,
1 /* 0x9b */, 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */,
1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, 1 /* 0xa4 */, 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */,
1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */,
1 /* 0xaa */, 1 /* 0xab */, 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */,
1 /* 0xaf */, 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */,
1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, 1 /* 0xb8 */, 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */,
1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */,
1 /* 0xbe */, 1 /* 0xbf */, 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */,
1 /* 0xc3 */, 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */,
1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, 1 /* 0xcc */, 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */,
1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */,
1 /* 0xd2 */, 1 /* 0xd3 */, 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */,
1 /* 0xd7 */, 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */,
1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, 1 /* 0xe0 */, 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */,
1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */,
1 /* 0xe6 */, 1 /* 0xe7 */, 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */,
1 /* 0xeb */, 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */,
1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, 1 /* 0xf4 */, 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */,
1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */,
1 /* 0xfa */, 1 /* 0xfb */, 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */,
1 /* 0xff */ 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */,
1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */,
1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */,
1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */,
1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */,
1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */,
1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */,
1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */,
1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */,
1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */,
1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */,
1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */,
1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */
}; };
int nghttp2_check_header_value(const uint8_t *value, size_t len) { int nghttp2_check_header_value(const uint8_t *value, size_t len) {

View File

@ -286,58 +286,70 @@ static int http_response_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv,
/* Generated by genauthroitychartbl.py */ /* Generated by genauthroitychartbl.py */
static char VALID_AUTHORITY_CHARS[] = { static char VALID_AUTHORITY_CHARS[] = {
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, 0 /* EOT */, 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, 0 /* BS */, 0 /* HT */, 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* LF */, 0 /* VT */, 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* SI */, 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, 0 /* CAN */, 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* EM */, 0 /* SUB */, 0 /* ESC */, 0 /* FS */, 0 /* GS */, 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* RS */, 0 /* US */, 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* # */, 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, 1 /* , */, 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */,
1 /* - */, 1 /* . */, 0 /* / */, 1 /* 0 */, 1 /* 1 */, 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
1 /* 2 */, 1 /* 3 */, 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
1 /* 7 */, 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, 1 /* @ */, 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* A */, 1 /* B */, 1 /* C */, 1 /* D */, 1 /* E */, 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* F */, 1 /* G */, 1 /* H */, 1 /* I */, 1 /* J */, 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
1 /* K */, 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, 1 /* T */, 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* U */, 1 /* V */, 1 /* W */, 1 /* X */, 1 /* Y */, 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* Z */, 1 /* [ */, 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* _ */, 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, 1 /* h */, 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* i */, 1 /* j */, 1 /* k */, 1 /* l */, 1 /* m */, 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* n */, 1 /* o */, 1 /* p */, 1 /* q */, 1 /* r */, 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
1 /* s */, 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */,
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, 0 /* | */, 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
0 /* } */, 1 /* ~ */, 0 /* DEL */, 0 /* 0x80 */, 0 /* 0x81 */, 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
0 /* 0x82 */, 0 /* 0x83 */, 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
0 /* 0x87 */, 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, 0 /* 0x90 */, 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, 0 /* 0x94 */, 0 /* 0x95 */, 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
0 /* 0x96 */, 0 /* 0x97 */, 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
0 /* 0x9b */, 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, 0 /* 0xa4 */, 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
0 /* 0xaa */, 0 /* 0xab */, 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
0 /* 0xaf */, 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, 0 /* 0xb8 */, 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
0 /* 0xbe */, 0 /* 0xbf */, 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
0 /* 0xc3 */, 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, 0 /* 0xcc */, 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
0 /* 0xd2 */, 0 /* 0xd3 */, 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
0 /* 0xd7 */, 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, 0 /* 0xe0 */, 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
0 /* 0xe6 */, 0 /* 0xe7 */, 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
0 /* 0xeb */, 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, 0 /* 0xf4 */, 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
0 /* 0xfa */, 0 /* 0xfb */, 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
0 /* 0xff */ 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
}; };
static int check_authority(const uint8_t *value, size_t len) { static int check_authority(const uint8_t *value, size_t len) {

View File

@ -30,7 +30,7 @@ static int select_next_protocol(unsigned char **out, unsigned char *outlen,
const unsigned char *in, unsigned int inlen, const unsigned char *in, unsigned int inlen,
const char *key, unsigned int keylen) { const char *key, unsigned int keylen) {
unsigned int i; unsigned int i;
for (i = 0; i + keylen <= inlen; i += (unsigned int)(in [i] + 1)) { for (i = 0; i + keylen <= inlen; i += (unsigned int)(in[i] + 1)) {
if (memcmp(&in[i], key, keylen) == 0) { if (memcmp(&in[i], key, keylen) == 0) {
*out = (unsigned char *)&in[i + 1]; *out = (unsigned char *)&in[i + 1];
*outlen = in[i]; *outlen = in[i];

View File

@ -2082,7 +2082,7 @@ int alpn_select_proto_cb(SSL *ssl, const unsigned char **out,
std::cout << "[ALPN] client offers:" << std::endl; std::cout << "[ALPN] client offers:" << std::endl;
} }
if (config->verbose) { if (config->verbose) {
for (unsigned int i = 0; i < inlen; i += in [i] + 1) { for (unsigned int i = 0; i < inlen; i += in[i] + 1) {
std::cout << " * "; std::cout << " * ";
std::cout.write(reinterpret_cast<const char *>(&in[i + 1]), in[i]); std::cout.write(reinterpret_cast<const char *>(&in[i + 1]), in[i]);
std::cout << std::endl; std::cout << std::endl;

View File

@ -334,7 +334,8 @@ void print_frame(print_type ptype, const nghttp2_frame *frame) {
frame->goaway.error_code, frame->goaway.error_code,
static_cast<unsigned int>(frame->goaway.opaque_data_len), static_cast<unsigned int>(frame->goaway.opaque_data_len),
util::ascii_dump(frame->goaway.opaque_data, util::ascii_dump(frame->goaway.opaque_data,
frame->goaway.opaque_data_len).c_str()); frame->goaway.opaque_data_len)
.c_str());
break; break;
case NGHTTP2_WINDOW_UPDATE: case NGHTTP2_WINDOW_UPDATE:
print_frame_attr_indent(); print_frame_attr_indent();

View File

@ -521,13 +521,13 @@ const request *session_impl::submit(boost::system::error_code &ec,
if (cb) { if (cb) {
strm->request().impl().on_read(std::move(cb)); strm->request().impl().on_read(std::move(cb));
prd.source.ptr = strm.get(); prd.source.ptr = strm.get();
prd.read_callback = prd.read_callback = [](nghttp2_session *session, int32_t stream_id,
[](nghttp2_session *session, int32_t stream_id, uint8_t *buf, uint8_t *buf, size_t length, uint32_t *data_flags,
size_t length, uint32_t *data_flags, nghttp2_data_source *source, nghttp2_data_source *source,
void *user_data) -> ssize_t { void *user_data) -> ssize_t {
auto strm = static_cast<stream *>(source->ptr); auto strm = static_cast<stream *>(source->ptr);
return strm->request().impl().call_on_read(buf, length, data_flags); return strm->request().impl().call_on_read(buf, length, data_flags);
}; };
prdptr = &prd; prdptr = &prd;
} }

View File

@ -74,10 +74,12 @@ public:
virtual void start_connect(tcp::resolver::iterator endpoint_it) = 0; virtual void start_connect(tcp::resolver::iterator endpoint_it) = 0;
virtual tcp::socket &socket() = 0; virtual tcp::socket &socket() = 0;
virtual void read_socket(std::function< virtual void read_socket(
void(const boost::system::error_code &ec, std::size_t n)> h) = 0; std::function<void(const boost::system::error_code &ec, std::size_t n)>
virtual void write_socket(std::function< h) = 0;
void(const boost::system::error_code &ec, std::size_t n)> h) = 0; virtual void write_socket(
std::function<void(const boost::system::error_code &ec, std::size_t n)>
h) = 0;
virtual void shutdown_socket() = 0; virtual void shutdown_socket() = 0;
void shutdown(); void shutdown();

View File

@ -44,10 +44,12 @@ public:
virtual void start_connect(tcp::resolver::iterator endpoint_it); virtual void start_connect(tcp::resolver::iterator endpoint_it);
virtual tcp::socket &socket(); virtual tcp::socket &socket();
virtual void read_socket(std::function< virtual void read_socket(
void(const boost::system::error_code &ec, std::size_t n)> h); std::function<void(const boost::system::error_code &ec, std::size_t n)>
virtual void write_socket(std::function< h);
void(const boost::system::error_code &ec, std::size_t n)> h); virtual void write_socket(
std::function<void(const boost::system::error_code &ec, std::size_t n)>
h);
virtual void shutdown_socket(); virtual void shutdown_socket();
private: private:

View File

@ -47,10 +47,12 @@ public:
virtual void start_connect(tcp::resolver::iterator endpoint_it); virtual void start_connect(tcp::resolver::iterator endpoint_it);
virtual tcp::socket &socket(); virtual tcp::socket &socket();
virtual void read_socket(std::function< virtual void read_socket(
void(const boost::system::error_code &ec, std::size_t n)> h); std::function<void(const boost::system::error_code &ec, std::size_t n)>
virtual void write_socket(std::function< h);
void(const boost::system::error_code &ec, std::size_t n)> h); virtual void write_socket(
std::function<void(const boost::system::error_code &ec, std::size_t n)>
h);
virtual void shutdown_socket(); virtual void shutdown_socket();
private: private:

View File

@ -113,22 +113,22 @@ generator_cb file_generator(const std::string &path) {
generator_cb file_generator_from_fd(int fd) { generator_cb file_generator_from_fd(int fd) {
auto d = defer_shared(close, fd); auto d = defer_shared(close, fd);
return [fd, d](uint8_t *buf, size_t len, uint32_t *data_flags) return [fd, d](uint8_t *buf, size_t len,
-> generator_cb::result_type { uint32_t *data_flags) -> generator_cb::result_type {
ssize_t n; ssize_t n;
while ((n = read(fd, buf, len)) == -1 && errno == EINTR) while ((n = read(fd, buf, len)) == -1 && errno == EINTR)
; ;
if (n == -1) { if (n == -1) {
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE; return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
} }
if (n == 0) { if (n == 0) {
*data_flags |= NGHTTP2_DATA_FLAG_EOF; *data_flags |= NGHTTP2_DATA_FLAG_EOF;
} }
return n; return n;
}; };
} }
bool check_path(const std::string &path) { return util::check_path(path); } bool check_path(const std::string &path) { return util::check_path(path); }

View File

@ -58,7 +58,7 @@ void io_service_pool::run(bool asynchronous) {
// Create a pool of threads to run all of the io_services. // Create a pool of threads to run all of the io_services.
for (std::size_t i = 0; i < io_services_.size(); ++i) { for (std::size_t i = 0; i < io_services_.size(); ++i) {
futures_.push_back(std::async(std::launch::async, futures_.push_back(std::async(std::launch::async,
(size_t (boost::asio::io_service::*)(void)) & (size_t(boost::asio::io_service::*)(void)) &
boost::asio::io_service::run, boost::asio::io_service::run,
io_services_[i])); io_services_[i]));
} }

View File

@ -130,8 +130,8 @@ void server::start_accept(boost::asio::ssl::context &tls_context,
acceptor.async_accept( acceptor.async_accept(
new_connection->socket().lowest_layer(), new_connection->socket().lowest_layer(),
[this, &tls_context, &acceptor, &mux, new_connection]( [this, &tls_context, &acceptor, &mux,
const boost::system::error_code &e) { new_connection](const boost::system::error_code &e) {
if (!e) { if (!e) {
new_connection->socket().lowest_layer().set_option( new_connection->socket().lowest_layer().set_option(
tcp::no_delay(true)); tcp::no_delay(true));

View File

@ -345,13 +345,13 @@ int http2_handler::start_response(stream &strm) {
auto &req = strm.request().impl(); auto &req = strm.request().impl();
if (::nghttp2::http2::expect_response_body(req.method(), res.status_code())) { if (::nghttp2::http2::expect_response_body(req.method(), res.status_code())) {
prd.source.ptr = &strm; prd.source.ptr = &strm;
prd.read_callback = prd.read_callback = [](nghttp2_session *session, int32_t stream_id,
[](nghttp2_session *session, int32_t stream_id, uint8_t *buf, uint8_t *buf, size_t length, uint32_t *data_flags,
size_t length, uint32_t *data_flags, nghttp2_data_source *source, nghttp2_data_source *source,
void *user_data) -> ssize_t { void *user_data) -> ssize_t {
auto &strm = *static_cast<stream *>(source->ptr); auto &strm = *static_cast<stream *>(source->ptr);
return strm.response().impl().call_read(buf, length, data_flags); return strm.response().impl().call_read(buf, length, data_flags);
}; };
prd_ptr = &prd; prd_ptr = &prd;
} }
rv = nghttp2_submit_response(session_, strm.get_stream_id(), nva.data(), rv = nghttp2_submit_response(session_, strm.get_stream_id(), nva.data(),

View File

@ -369,7 +369,8 @@ OPTIONS:
buffer. buffer.
Default: 4096 Default: 4096
-d, --dump-header-table -d, --dump-header-table
Output dynamic header table.)" << std::endl; Output dynamic header table.)"
<< std::endl;
} }
static struct option long_options[] = { static struct option long_options[] = {

View File

@ -1339,7 +1339,8 @@ process_time_stats(const std::vector<std::unique_ptr<Worker>> &workers) {
} }
request_times.push_back( request_times.push_back(
std::chrono::duration_cast<std::chrono::duration<double>>( std::chrono::duration_cast<std::chrono::duration<double>>(
req_stat.stream_close_time - req_stat.request_time).count()); req_stat.stream_close_time - req_stat.request_time)
.count());
} }
const auto &stat = w->stats; const auto &stat = w->stats;
@ -1348,7 +1349,8 @@ process_time_stats(const std::vector<std::unique_ptr<Worker>> &workers) {
if (recorded(cstat.client_start_time) && if (recorded(cstat.client_start_time) &&
recorded(cstat.client_end_time)) { recorded(cstat.client_end_time)) {
auto t = std::chrono::duration_cast<std::chrono::duration<double>>( auto t = std::chrono::duration_cast<std::chrono::duration<double>>(
cstat.client_end_time - cstat.client_start_time).count(); cstat.client_end_time - cstat.client_start_time)
.count();
if (t > 1e-9) { if (t > 1e-9) {
rps_values.push_back(cstat.req_success / t); rps_values.push_back(cstat.req_success / t);
} }
@ -1362,7 +1364,8 @@ process_time_stats(const std::vector<std::unique_ptr<Worker>> &workers) {
connect_times.push_back( connect_times.push_back(
std::chrono::duration_cast<std::chrono::duration<double>>( std::chrono::duration_cast<std::chrono::duration<double>>(
cstat.connect_time - cstat.connect_start_time).count()); cstat.connect_time - cstat.connect_start_time)
.count());
if (!recorded(cstat.ttfb)) { if (!recorded(cstat.ttfb)) {
continue; continue;
@ -1370,7 +1373,8 @@ process_time_stats(const std::vector<std::unique_ptr<Worker>> &workers) {
ttfb_times.push_back( ttfb_times.push_back(
std::chrono::duration_cast<std::chrono::duration<double>>( std::chrono::duration_cast<std::chrono::duration<double>>(
cstat.ttfb - cstat.connect_start_time).count()); cstat.ttfb - cstat.connect_start_time)
.count());
} }
} }
@ -1617,7 +1621,8 @@ void print_version(std::ostream &out) {
namespace { namespace {
void print_usage(std::ostream &out) { void print_usage(std::ostream &out) {
out << R"(Usage: h2load [OPTIONS]... [URI]... out << R"(Usage: h2load [OPTIONS]... [URI]...
benchmarking tool for HTTP/2 and SPDY server)" << std::endl; benchmarking tool for HTTP/2 and SPDY server)"
<< std::endl;
} }
} // namespace } // namespace
@ -1649,14 +1654,17 @@ Options:
with --timing-script-file option, this option specifies with --timing-script-file option, this option specifies
the number of requests each client performs rather than the number of requests each client performs rather than
the number of requests across all clients. the number of requests across all clients.
Default: )" << config.nreqs << R"( Default: )"
<< config.nreqs << R"(
-c, --clients=<N> -c, --clients=<N>
Number of concurrent clients. With -r option, this Number of concurrent clients. With -r option, this
specifies the maximum number of connections to be made. specifies the maximum number of connections to be made.
Default: )" << config.nclients << R"( Default: )"
<< config.nclients << R"(
-t, --threads=<N> -t, --threads=<N>
Number of native threads. Number of native threads.
Default: )" << config.nthreads << R"( Default: )"
<< config.nthreads << R"(
-i, --input-file=<PATH> -i, --input-file=<PATH>
Path of a file with multiple URIs are separated by EOLs. Path of a file with multiple URIs are separated by EOLs.
This option will disable URIs getting from command-line. This option will disable URIs getting from command-line.
@ -1675,13 +1683,15 @@ Options:
-w, --window-bits=<N> -w, --window-bits=<N>
Sets the stream level initial window size to (2**<N>)-1. Sets the stream level initial window size to (2**<N>)-1.
For SPDY, 2**<N> is used instead. For SPDY, 2**<N> is used instead.
Default: )" << config.window_bits << R"( Default: )"
<< config.window_bits << R"(
-W, --connection-window-bits=<N> -W, --connection-window-bits=<N>
Sets the connection level initial window size to Sets the connection level initial window size to
(2**<N>)-1. For SPDY, if <N> is strictly less than 16, (2**<N>)-1. For SPDY, if <N> is strictly less than 16,
this option is ignored. Otherwise 2**<N> is used for this option is ignored. Otherwise 2**<N> is used for
SPDY. SPDY.
Default: )" << config.connection_window_bits << R"( Default: )"
<< config.connection_window_bits << R"(
-H, --header=<HEADER> -H, --header=<HEADER>
Add/Override a header to the requests. Add/Override a header to the requests.
--ciphers=<SUITE> --ciphers=<SUITE>
@ -1699,8 +1709,10 @@ Options:
Available protocols: )"; Available protocols: )";
#endif // !HAVE_SPDYLAY #endif // !HAVE_SPDYLAY
out << NGHTTP2_CLEARTEXT_PROTO_VERSION_ID << R"( and out << NGHTTP2_CLEARTEXT_PROTO_VERSION_ID << R"( and
)" << NGHTTP2_H1_1 << R"( )"
Default: )" << NGHTTP2_CLEARTEXT_PROTO_VERSION_ID << R"( << NGHTTP2_H1_1 << R"(
Default: )"
<< NGHTTP2_CLEARTEXT_PROTO_VERSION_ID << R"(
-d, --data=<PATH> -d, --data=<PATH>
Post FILE to server. The request method is changed to Post FILE to server. The request method is changed to
POST. For http/1.1 connection, if -d is used, the POST. For http/1.1 connection, if -d is used, the
@ -1774,20 +1786,22 @@ Options:
NPN. The parameter must be delimited by a single comma NPN. The parameter must be delimited by a single comma
only and any white spaces are treated as a part of only and any white spaces are treated as a part of
protocol string. protocol string.
Default: )" << DEFAULT_NPN_LIST << R"( Default: )"
<< DEFAULT_NPN_LIST << R"(
--h1 Short hand for --npn-list=http/1.1 --h1 Short hand for --npn-list=http/1.1
--no-tls-proto=http/1.1, which effectively force --no-tls-proto=http/1.1, which effectively force
http/1.1 for both http and https URI. http/1.1 for both http and https URI.
--header-table-size=<SIZE> --header-table-size=<SIZE>
Specify decoder header table size. Specify decoder header table size.
Default: )" << util::utos_unit(config.header_table_size) << R"( Default: )"
<< util::utos_unit(config.header_table_size) << R"(
--encoder-header-table-size=<SIZE> --encoder-header-table-size=<SIZE>
Specify encoder header table size. The decoder (server) Specify encoder header table size. The decoder (server)
specifies the maximum dynamic table size it accepts. specifies the maximum dynamic table size it accepts.
Then the negotiated dynamic table size is the minimum of Then the negotiated dynamic table size is the minimum of
this option value and the value which server specified. this option value and the value which server specified.
Default: )" << util::utos_unit(config.encoder_header_table_size) Default: )"
<< R"( << util::utos_unit(config.encoder_header_table_size) << R"(
-v, --verbose -v, --verbose
Output debug information. Output debug information.
--version Display version information and exit. --version Display version information and exit.
@ -1801,7 +1815,8 @@ Options:
The <DURATION> argument is an integer and an optional unit (e.g., 1s The <DURATION> argument is an integer and an optional unit (e.g., 1s
is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
(hours, minutes, seconds and milliseconds, respectively). If a unit (hours, minutes, seconds and milliseconds, respectively). If a unit
is omitted, a second is used as unit.)" << std::endl; is omitted, a second is used as unit.)"
<< std::endl;
} }
} // namespace } // namespace
@ -2122,7 +2137,8 @@ int main(int argc, char **argv) {
if (config.nreqs > uris.size()) { if (config.nreqs > uris.size()) {
std::cerr << "-n: the number of requests must be less than or equal " std::cerr << "-n: the number of requests must be less than or equal "
"to the number of timing script entries. Setting number " "to the number of timing script entries. Setting number "
"of requests to " << uris.size() << std::endl; "of requests to "
<< uris.size() << std::endl;
config.nreqs = uris.size(); config.nreqs = uris.size();
} }
@ -2172,7 +2188,8 @@ int main(int argc, char **argv) {
if (config.nclients < config.nthreads) { if (config.nclients < config.nthreads) {
std::cerr << "-c, -t: the number of clients must be greater than or equal " std::cerr << "-c, -t: the number of clients must be greater than or equal "
"to the number of threads." << std::endl; "to the number of threads."
<< std::endl;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -2185,7 +2202,8 @@ int main(int argc, char **argv) {
if (config.rate > config.nclients) { if (config.rate > config.nclients) {
std::cerr << "-r, -c: the connection rate must be smaller than or equal " std::cerr << "-r, -c: the connection rate must be smaller than or equal "
"to the number of clients." << std::endl; "to the number of clients."
<< std::endl;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
@ -2532,26 +2550,29 @@ int main(int argc, char **argv) {
} }
std::cout << std::fixed << std::setprecision(2) << R"( std::cout << std::fixed << std::setprecision(2) << R"(
finished in )" << util::format_duration(duration) << ", " << rps << " req/s, " finished in )"
<< util::format_duration(duration) << ", " << rps << " req/s, "
<< util::utos_funit(bps) << R"(B/s << util::utos_funit(bps) << R"(B/s
requests: )" << stats.req_todo << " total, " << stats.req_started requests: )" << stats.req_todo
<< " started, " << stats.req_done << " done, " << " total, " << stats.req_started << " started, " << stats.req_done
<< stats.req_status_success << " succeeded, " << stats.req_failed << " done, " << stats.req_status_success << " succeeded, "
<< " failed, " << stats.req_error << " errored, " << stats.req_failed << " failed, " << stats.req_error
<< stats.req_timedout << R"( timeout << " errored, " << stats.req_timedout << R"( timeout
status codes: )" << stats.status[2] << " 2xx, " << stats.status[3] << " 3xx, " status codes: )"
<< stats.status[2] << " 2xx, " << stats.status[3] << " 3xx, "
<< stats.status[4] << " 4xx, " << stats.status[5] << R"( 5xx << stats.status[4] << " 4xx, " << stats.status[5] << R"( 5xx
traffic: )" << util::utos_funit(stats.bytes_total) << "B (" << stats.bytes_total traffic: )" << util::utos_funit(stats.bytes_total)
<< ") total, " << util::utos_funit(stats.bytes_head) << "B (" << "B (" << stats.bytes_total << ") total, "
<< stats.bytes_head << ") headers (space savings " << util::utos_funit(stats.bytes_head) << "B (" << stats.bytes_head
<< header_space_savings * 100 << "%), " << ") headers (space savings " << header_space_savings * 100
<< util::utos_funit(stats.bytes_body) << "B (" << stats.bytes_body << "%), " << util::utos_funit(stats.bytes_body) << "B ("
<< R"() data << stats.bytes_body << R"() data
min max mean sd +/- sd min max mean sd +/- sd
time for request: )" << std::setw(10) << util::format_duration(ts.request.min) time for request: )"
<< " " << std::setw(10) << util::format_duration(ts.request.max) << std::setw(10) << util::format_duration(ts.request.min) << " "
<< " " << std::setw(10) << util::format_duration(ts.request.mean) << std::setw(10) << util::format_duration(ts.request.max) << " "
<< " " << std::setw(10) << util::format_duration(ts.request.sd) << std::setw(10) << util::format_duration(ts.request.mean) << " "
<< std::setw(10) << util::format_duration(ts.request.sd)
<< std::setw(9) << util::dtos(ts.request.within_sd) << "%" << std::setw(9) << util::dtos(ts.request.within_sd) << "%"
<< "\ntime for connect: " << std::setw(10) << "\ntime for connect: " << std::setw(10)
<< util::format_duration(ts.connect.min) << " " << std::setw(10) << util::format_duration(ts.connect.min) << " " << std::setw(10)

View File

@ -149,20 +149,20 @@ nghttp2_nv make_nv_nocopy(const StringRef &name, const StringRef &value,
// Create nghttp2_nv from string literal |name| and |value|. // Create nghttp2_nv from string literal |name| and |value|.
template <size_t N, size_t M> template <size_t N, size_t M>
constexpr nghttp2_nv make_nv_ll(const char(&name)[N], const char(&value)[M]) { constexpr nghttp2_nv make_nv_ll(const char (&name)[N], const char (&value)[M]) {
return {(uint8_t *)name, (uint8_t *)value, N - 1, M - 1, return {(uint8_t *)name, (uint8_t *)value, N - 1, M - 1,
NGHTTP2_NV_FLAG_NO_COPY_NAME | NGHTTP2_NV_FLAG_NO_COPY_VALUE}; NGHTTP2_NV_FLAG_NO_COPY_NAME | NGHTTP2_NV_FLAG_NO_COPY_VALUE};
} }
// Create nghttp2_nv from string literal |name| and c-string |value|. // Create nghttp2_nv from string literal |name| and c-string |value|.
template <size_t N> template <size_t N>
nghttp2_nv make_nv_lc(const char(&name)[N], const char *value) { nghttp2_nv make_nv_lc(const char (&name)[N], const char *value) {
return {(uint8_t *)name, (uint8_t *)value, N - 1, strlen(value), return {(uint8_t *)name, (uint8_t *)value, N - 1, strlen(value),
NGHTTP2_NV_FLAG_NO_COPY_NAME}; NGHTTP2_NV_FLAG_NO_COPY_NAME};
} }
template <size_t N> template <size_t N>
nghttp2_nv make_nv_lc_nocopy(const char(&name)[N], const char *value) { nghttp2_nv make_nv_lc_nocopy(const char (&name)[N], const char *value) {
return {(uint8_t *)name, (uint8_t *)value, N - 1, strlen(value), return {(uint8_t *)name, (uint8_t *)value, N - 1, strlen(value),
NGHTTP2_NV_FLAG_NO_COPY_NAME | NGHTTP2_NV_FLAG_NO_COPY_VALUE}; NGHTTP2_NV_FLAG_NO_COPY_NAME | NGHTTP2_NV_FLAG_NO_COPY_VALUE};
} }
@ -170,19 +170,19 @@ nghttp2_nv make_nv_lc_nocopy(const char(&name)[N], const char *value) {
// Create nghttp2_nv from string literal |name| and std::string // Create nghttp2_nv from string literal |name| and std::string
// |value|. // |value|.
template <size_t N> template <size_t N>
nghttp2_nv make_nv_ls(const char(&name)[N], const std::string &value) { nghttp2_nv make_nv_ls(const char (&name)[N], const std::string &value) {
return {(uint8_t *)name, (uint8_t *)value.c_str(), N - 1, value.size(), return {(uint8_t *)name, (uint8_t *)value.c_str(), N - 1, value.size(),
NGHTTP2_NV_FLAG_NO_COPY_NAME}; NGHTTP2_NV_FLAG_NO_COPY_NAME};
} }
template <size_t N> template <size_t N>
nghttp2_nv make_nv_ls_nocopy(const char(&name)[N], const std::string &value) { nghttp2_nv make_nv_ls_nocopy(const char (&name)[N], const std::string &value) {
return {(uint8_t *)name, (uint8_t *)value.c_str(), N - 1, value.size(), return {(uint8_t *)name, (uint8_t *)value.c_str(), N - 1, value.size(),
NGHTTP2_NV_FLAG_NO_COPY_NAME | NGHTTP2_NV_FLAG_NO_COPY_VALUE}; NGHTTP2_NV_FLAG_NO_COPY_NAME | NGHTTP2_NV_FLAG_NO_COPY_VALUE};
} }
template <size_t N> template <size_t N>
nghttp2_nv make_nv_ls_nocopy(const char(&name)[N], const StringRef &value) { nghttp2_nv make_nv_ls_nocopy(const char (&name)[N], const StringRef &value) {
return {(uint8_t *)name, (uint8_t *)value.c_str(), N - 1, value.size(), return {(uint8_t *)name, (uint8_t *)value.c_str(), N - 1, value.size(),
NGHTTP2_NV_FLAG_NO_COPY_NAME | NGHTTP2_NV_FLAG_NO_COPY_VALUE}; NGHTTP2_NV_FLAG_NO_COPY_NAME | NGHTTP2_NV_FLAG_NO_COPY_VALUE};
} }

View File

@ -39,7 +39,7 @@ using namespace nghttp2;
#define MAKE_NV(K, V) \ #define MAKE_NV(K, V) \
{ \ { \
(uint8_t *) K, (uint8_t *)V, sizeof(K) - 1, sizeof(V) - 1, \ (uint8_t *)K, (uint8_t *)V, sizeof(K) - 1, sizeof(V) - 1, \
NGHTTP2_NV_FLAG_NONE \ NGHTTP2_NV_FLAG_NONE \
} }
@ -107,12 +107,8 @@ void test_http2_add_header(void) {
} }
void test_http2_get_header(void) { void test_http2_get_header(void) {
auto nva = Headers{{"alpha", "1"}, auto nva = Headers{{"alpha", "1"}, {"bravo", "2"}, {"bravo", "3"},
{"bravo", "2"}, {"charlie", "4"}, {"delta", "5"}, {"echo", "6"},
{"bravo", "3"},
{"charlie", "4"},
{"delta", "5"},
{"echo", "6"},
{"content-length", "7"}}; {"content-length", "7"}};
const Headers::value_type *rv; const Headers::value_type *rv;
rv = http2::get_header(nva, "delta"); rv = http2::get_header(nva, "delta");

View File

@ -90,7 +90,8 @@ typedef std::function<void(uint32_t)> close_cb;
// of the error and request/response must be closed, return // of the error and request/response must be closed, return
// NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE. // NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE.
typedef std::function<ssize_t(uint8_t *buf, std::size_t len, typedef std::function<ssize_t(uint8_t *buf, std::size_t len,
uint32_t *data_flags)> generator_cb; uint32_t *data_flags)>
generator_cb;
// Convenient function to create function to read file denoted by // Convenient function to create function to read file denoted by
// |path|. This can be passed to response::end(). // |path|. This can be passed to response::end().

View File

@ -246,7 +246,8 @@ The output of this program can be used as input for deflatehd.
OPTIONS: OPTIONS:
-d, --dump-header-table -d, --dump-header-table
Output dynamic header table.)" << std::endl; Output dynamic header table.)"
<< std::endl;
; ;
} }

View File

@ -99,10 +99,8 @@ template <typename Memchunk> struct Memchunks {
Memchunks(Pool<Memchunk> *pool) Memchunks(Pool<Memchunk> *pool)
: pool(pool), head(nullptr), tail(nullptr), len(0) {} : pool(pool), head(nullptr), tail(nullptr), len(0) {}
Memchunks(const Memchunks &) = delete; Memchunks(const Memchunks &) = delete;
Memchunks(Memchunks &&other) noexcept : pool(other.pool), Memchunks(Memchunks &&other) noexcept
head(other.head), : pool(other.pool), head(other.head), tail(other.tail), len(other.len) {
tail(other.tail),
len(other.len) {
// keep other.pool // keep other.pool
other.head = other.tail = nullptr; other.head = other.tail = nullptr;
other.len = 0; other.len = 0;
@ -173,7 +171,7 @@ template <typename Memchunk> struct Memchunks {
return count; return count;
} }
template <size_t N> size_t append(const char(&s)[N]) { template <size_t N> size_t append(const char (&s)[N]) {
return append(s, N - 1); return append(s, N - 1);
} }
size_t append(const std::string &s) { return append(s.c_str(), s.size()); } size_t append(const std::string &s) { return append(s.c_str(), s.size()); }

View File

@ -225,8 +225,9 @@ void test_peek_memchunks_append(void) {
PeekMemchunks16 pchunks(&pool); PeekMemchunks16 pchunks(&pool);
std::array<uint8_t, 32> b{{ std::array<uint8_t, 32> b{{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'5', '6', '7', '8', '9', '0', '1', }}, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1',
}},
d; d;
pchunks.append(b.data(), b.size()); pchunks.append(b.data(), b.size());
@ -259,8 +260,9 @@ void test_peek_memchunks_disable_peek_drain(void) {
PeekMemchunks16 pchunks(&pool); PeekMemchunks16 pchunks(&pool);
std::array<uint8_t, 32> b{{ std::array<uint8_t, 32> b{{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'5', '6', '7', '8', '9', '0', '1', }}, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1',
}},
d; d;
pchunks.append(b.data(), b.size()); pchunks.append(b.data(), b.size());
@ -286,8 +288,9 @@ void test_peek_memchunks_disable_peek_no_drain(void) {
PeekMemchunks16 pchunks(&pool); PeekMemchunks16 pchunks(&pool);
std::array<uint8_t, 32> b{{ std::array<uint8_t, 32> b{{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'5', '6', '7', '8', '9', '0', '1', }}, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1',
}},
d; d;
pchunks.append(b.data(), b.size()); pchunks.append(b.data(), b.size());
@ -313,8 +316,9 @@ void test_peek_memchunks_reset(void) {
PeekMemchunks16 pchunks(&pool); PeekMemchunks16 pchunks(&pool);
std::array<uint8_t, 32> b{{ std::array<uint8_t, 32> b{{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'5', '6', '7', '8', '9', '0', '1', }}, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1',
}},
d; d;
pchunks.append(b.data(), b.size()); pchunks.append(b.data(), b.size());

View File

@ -89,7 +89,8 @@ enum {
namespace { namespace {
constexpr auto anchors = std::array<Anchor, 5>{{ constexpr auto anchors = std::array<Anchor, 5>{{
{3, 0, 201}, {5, 0, 101}, {7, 0, 1}, {9, 7, 1}, {11, 3, 1}, }}; {3, 0, 201}, {5, 0, 101}, {7, 0, 1}, {9, 7, 1}, {11, 3, 1},
}};
} // namespace } // namespace
Config::Config() Config::Config()
@ -1441,13 +1442,14 @@ void HttpClient::output_har(FILE *outfile) {
auto entries = json_array(); auto entries = json_array();
json_object_set_new(log, "entries", entries); json_object_set_new(log, "entries", entries);
auto dns_delta = auto dns_delta = std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::duration_cast<std::chrono::microseconds>( timing.domain_lookup_end_time - timing.start_time)
timing.domain_lookup_end_time - timing.start_time).count() / .count() /
1000.0; 1000.0;
auto connect_delta = auto connect_delta =
std::chrono::duration_cast<std::chrono::microseconds>( std::chrono::duration_cast<std::chrono::microseconds>(
timing.connect_end_time - timing.domain_lookup_end_time).count() / timing.connect_end_time - timing.domain_lookup_end_time)
.count() /
1000.0; 1000.0;
for (size_t i = 0; i < reqvec.size(); ++i) { for (size_t i = 0; i < reqvec.size(); ++i) {
@ -1468,20 +1470,23 @@ void HttpClient::output_har(FILE *outfile) {
std::chrono::system_clock::duration>( std::chrono::system_clock::duration>(
req_timing.request_start_time - timing.start_time); req_timing.request_start_time - timing.start_time);
auto wait_delta = std::chrono::duration_cast<std::chrono::microseconds>( auto wait_delta =
req_timing.response_start_time - std::chrono::duration_cast<std::chrono::microseconds>(
req_timing.request_start_time).count() / req_timing.response_start_time - req_timing.request_start_time)
1000.0; .count() /
auto receive_delta = std::chrono::duration_cast<std::chrono::microseconds>( 1000.0;
req_timing.response_end_time - auto receive_delta =
req_timing.response_start_time).count() / std::chrono::duration_cast<std::chrono::microseconds>(
1000.0; req_timing.response_end_time - req_timing.response_start_time)
.count() /
1000.0;
auto time_sum = auto time_sum =
std::chrono::duration_cast<std::chrono::microseconds>( std::chrono::duration_cast<std::chrono::microseconds>(
(i == 0) ? (req_timing.response_end_time - timing.start_time) (i == 0) ? (req_timing.response_end_time - timing.start_time)
: (req_timing.response_end_time - : (req_timing.response_end_time -
req_timing.request_start_time)).count() / req_timing.request_start_time))
.count() /
1000.0; 1000.0;
json_object_set_new( json_object_set_new(
@ -2114,7 +2119,8 @@ see http://www.w3.org/TR/resource-timing/#processing-model
sorted by 'complete' sorted by 'complete'
id responseEnd requestStart process code size request path)" << std::endl; id responseEnd requestStart process code size request path)"
<< std::endl;
const auto &base = client.timing.connect_end_time; const auto &base = client.timing.connect_end_time;
for (const auto &req : reqs) { for (const auto &req : reqs) {
@ -2146,7 +2152,7 @@ int client_select_next_proto_cb(SSL *ssl, unsigned char **out,
print_timer(); print_timer();
std::cout << "[NPN] server offers:" << std::endl; std::cout << "[NPN] server offers:" << std::endl;
} }
for (unsigned int i = 0; i < inlen; i += in [i] + 1) { for (unsigned int i = 0; i < inlen; i += in[i] + 1) {
if (config.verbose) { if (config.verbose) {
std::cout << " * "; std::cout << " * ";
std::cout.write(reinterpret_cast<const char *>(&in[i + 1]), in[i]); std::cout.write(reinterpret_cast<const char *>(&in[i + 1]), in[i]);
@ -2181,11 +2187,12 @@ const char *const CIPHER_LIST =
} // namespace } // namespace
namespace { namespace {
int communicate(const std::string &scheme, const std::string &host, int communicate(
uint16_t port, const std::string &scheme, const std::string &host, uint16_t port,
std::vector<std::tuple<std::string, nghttp2_data_provider *, std::vector<
int64_t, int32_t>> requests, std::tuple<std::string, nghttp2_data_provider *, int64_t, int32_t>>
const nghttp2_session_callbacks *callbacks) { requests,
const nghttp2_session_callbacks *callbacks) {
int result = 0; int result = 0;
auto loop = EV_DEFAULT; auto loop = EV_DEFAULT;
SSL_CTX *ssl_ctx = nullptr; SSL_CTX *ssl_ctx = nullptr;
@ -2482,8 +2489,9 @@ int run(char **uris, int n) {
data_prd.source.fd = data_fd; data_prd.source.fd = data_fd;
data_prd.read_callback = file_read_callback; data_prd.read_callback = file_read_callback;
} }
std::vector<std::tuple<std::string, nghttp2_data_provider *, int64_t, std::vector<
int32_t>> requests; std::tuple<std::string, nghttp2_data_provider *, int64_t, int32_t>>
requests;
size_t next_weight_idx = 0; size_t next_weight_idx = 0;
@ -2540,7 +2548,8 @@ void print_version(std::ostream &out) {
namespace { namespace {
void print_usage(std::ostream &out) { void print_usage(std::ostream &out) {
out << R"(Usage: nghttp [OPTIONS]... <URI>... out << R"(Usage: nghttp [OPTIONS]... <URI>...
HTTP/2 client)" << std::endl; HTTP/2 client)"
<< std::endl;
} }
} // namespace } // namespace
@ -2607,8 +2616,8 @@ Options:
less than the number of URI, the last -p option value is less than the number of URI, the last -p option value is
repeated. If there is no -p option, default weight, 16, repeated. If there is no -p option, default weight, 16,
is assumed. The valid value range is is assumed. The valid value range is
[)" << NGHTTP2_MIN_WEIGHT << ", " << NGHTTP2_MAX_WEIGHT [)"
<< R"(], inclusive. << NGHTTP2_MIN_WEIGHT << ", " << NGHTTP2_MAX_WEIGHT << R"(], inclusive.
-M, --peer-max-concurrent-streams=<N> -M, --peer-max-concurrent-streams=<N>
Use <N> as SETTINGS_MAX_CONCURRENT_STREAMS value of Use <N> as SETTINGS_MAX_CONCURRENT_STREAMS value of
remote endpoint as if it is received in SETTINGS frame. remote endpoint as if it is received in SETTINGS frame.
@ -2660,7 +2669,8 @@ Options:
The <DURATION> argument is an integer and an optional unit (e.g., 1s The <DURATION> argument is an integer and an optional unit (e.g., 1s
is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
(hours, minutes, seconds and milliseconds, respectively). If a unit (hours, minutes, seconds and milliseconds, respectively). If a unit
is omitted, a second is used as unit.)" << std::endl; is omitted, a second is used as unit.)"
<< std::endl;
} }
} // namespace } // namespace

View File

@ -142,7 +142,8 @@ Options:
-m, --max-concurrent-streams=<N> -m, --max-concurrent-streams=<N>
Set the maximum number of the concurrent streams in one Set the maximum number of the concurrent streams in one
HTTP/2 session. HTTP/2 session.
Default: )" << config.max_concurrent_streams << R"( Default: )"
<< config.max_concurrent_streams << R"(
-n, --workers=<N> -n, --workers=<N>
Set the number of worker threads. Set the number of worker threads.
Default: 1 Default: 1
@ -173,7 +174,8 @@ Options:
--mime-types-file=<PATH> --mime-types-file=<PATH>
Path to file that contains MIME media types and the Path to file that contains MIME media types and the
extensions that represent them. extensions that represent them.
Default: )" << config.mime_types_file << R"( Default: )"
<< config.mime_types_file << R"(
--no-content-length --no-content-length
Don't send content-length header field. Don't send content-length header field.
--version Display version information and exit. --version Display version information and exit.
@ -182,7 +184,8 @@ Options:
-- --
The <SIZE> argument is an integer and an optional unit (e.g., 10K is The <SIZE> argument is an integer and an optional unit (e.g., 10K is
10 * 1024). Units are K, M and G (powers of 1024).)" << std::endl; 10 * 1024). Units are K, M and G (powers of 1024).)"
<< std::endl;
} }
} // namespace } // namespace

View File

@ -1467,7 +1467,8 @@ void print_version(std::ostream &out) {
namespace { namespace {
void print_usage(std::ostream &out) { void print_usage(std::ostream &out) {
out << R"(Usage: nghttpx [OPTIONS]... [<PRIVATE_KEY> <CERT>] out << R"(Usage: nghttpx [OPTIONS]... [<PRIVATE_KEY> <CERT>]
A reverse proxy for HTTP/2, HTTP/1 and SPDY.)" << std::endl; A reverse proxy for HTTP/2, HTTP/1 and SPDY.)"
<< std::endl;
} }
} // namespace } // namespace
@ -1613,8 +1614,8 @@ Connections:
not contain these characters. Since ";" has special not contain these characters. Since ";" has special
meaning in shell, the option value must be quoted. meaning in shell, the option value must be quoted.
Default: )" << DEFAULT_DOWNSTREAM_HOST << "," Default: )"
<< DEFAULT_DOWNSTREAM_PORT << R"( << DEFAULT_DOWNSTREAM_HOST << "," << DEFAULT_DOWNSTREAM_PORT << R"(
-f, --frontend=(<HOST>,<PORT>|unix:<PATH>)[[;<PARAM>]...] -f, --frontend=(<HOST>,<PORT>|unix:<PATH>)[[;<PARAM>]...]
Set frontend host and port. If <HOST> is '*', it Set frontend host and port. If <HOST> is '*', it
assumes all addresses including both IPv4 and IPv6. assumes all addresses including both IPv4 and IPv6.
@ -1645,7 +1646,8 @@ Connections:
Default: *,3000 Default: *,3000
--backlog=<N> --backlog=<N>
Set listen backlog size. Set listen backlog size.
Default: )" << config->conn.listener.backlog << R"( Default: )"
<< config->conn.listener.backlog << R"(
--backend-address-family=(auto|IPv4|IPv6) --backend-address-family=(auto|IPv4|IPv6)
Specify address family of backend connections. If Specify address family of backend connections. If
"auto" is given, both IPv4 and IPv6 are considered. If "auto" is given, both IPv4 and IPv6 are considered. If
@ -1671,25 +1673,30 @@ Connections:
Performance: Performance:
-n, --workers=<N> -n, --workers=<N>
Set the number of worker threads. Set the number of worker threads.
Default: )" << config->num_worker << R"( Default: )"
<< config->num_worker << R"(
--read-rate=<SIZE> --read-rate=<SIZE>
Set maximum average read rate on frontend connection. Set maximum average read rate on frontend connection.
Setting 0 to this option means read rate is unlimited. Setting 0 to this option means read rate is unlimited.
Default: )" << config->conn.upstream.ratelimit.read.rate << R"( Default: )"
<< config->conn.upstream.ratelimit.read.rate << R"(
--read-burst=<SIZE> --read-burst=<SIZE>
Set maximum read burst size on frontend connection. Set maximum read burst size on frontend connection.
Setting 0 to this option means read burst size is Setting 0 to this option means read burst size is
unlimited. unlimited.
Default: )" << config->conn.upstream.ratelimit.read.burst << R"( Default: )"
<< config->conn.upstream.ratelimit.read.burst << R"(
--write-rate=<SIZE> --write-rate=<SIZE>
Set maximum average write rate on frontend connection. Set maximum average write rate on frontend connection.
Setting 0 to this option means write rate is unlimited. Setting 0 to this option means write rate is unlimited.
Default: )" << config->conn.upstream.ratelimit.write.rate << R"( Default: )"
<< config->conn.upstream.ratelimit.write.rate << R"(
--write-burst=<SIZE> --write-burst=<SIZE>
Set maximum write burst size on frontend connection. Set maximum write burst size on frontend connection.
Setting 0 to this option means write burst size is Setting 0 to this option means write burst size is
unlimited. unlimited.
Default: )" << config->conn.upstream.ratelimit.write.burst << R"( Default: )"
<< config->conn.upstream.ratelimit.write.burst << R"(
--worker-read-rate=<SIZE> --worker-read-rate=<SIZE>
Set maximum average read rate on frontend connection per Set maximum average read rate on frontend connection per
worker. Setting 0 to this option means read rate is worker. Setting 0 to this option means read rate is
@ -1713,7 +1720,8 @@ Performance:
--worker-frontend-connections=<N> --worker-frontend-connections=<N>
Set maximum number of simultaneous connections frontend Set maximum number of simultaneous connections frontend
accepts. Setting 0 means unlimited. accepts. Setting 0 means unlimited.
Default: )" << config->conn.upstream.worker_connections << R"( Default: )"
<< config->conn.upstream.worker_connections << R"(
--backend-connections-per-host=<N> --backend-connections-per-host=<N>
Set maximum number of backend concurrent connections Set maximum number of backend concurrent connections
(and/or streams in case of HTTP/2) per origin host. (and/or streams in case of HTTP/2) per origin host.
@ -1723,8 +1731,8 @@ Performance:
HTTP/2). To limit the number of connections per HTTP/2). To limit the number of connections per
frontend for default mode, use frontend for default mode, use
--backend-connections-per-frontend. --backend-connections-per-frontend.
Default: )" << config->conn.downstream->connections_per_host Default: )"
<< R"( << config->conn.downstream->connections_per_host << R"(
--backend-connections-per-frontend=<N> --backend-connections-per-frontend=<N>
Set maximum number of backend concurrent connections Set maximum number of backend concurrent connections
(and/or streams in case of HTTP/2) per frontend. This (and/or streams in case of HTTP/2) per frontend. This
@ -1732,12 +1740,13 @@ Performance:
unlimited. To limit the number of connections per host unlimited. To limit the number of connections per host
with --http2-proxy option, use with --http2-proxy option, use
--backend-connections-per-host. --backend-connections-per-host.
Default: )" << config->conn.downstream->connections_per_frontend Default: )"
<< R"( << config->conn.downstream->connections_per_frontend << R"(
--rlimit-nofile=<N> --rlimit-nofile=<N>
Set maximum number of open files (RLIMIT_NOFILE) to <N>. Set maximum number of open files (RLIMIT_NOFILE) to <N>.
If 0 is given, nghttpx does not set the limit. If 0 is given, nghttpx does not set the limit.
Default: )" << config->rlimit_nofile << R"( Default: )"
<< config->rlimit_nofile << R"(
--backend-request-buffer=<SIZE> --backend-request-buffer=<SIZE>
Set buffer size used to store backend request. Set buffer size used to store backend request.
Default: )" Default: )"
@ -1751,7 +1760,8 @@ Performance:
limits the maximum length for the queue of connections limits the maximum length for the queue of connections
that have not yet completed the three-way handshake. If that have not yet completed the three-way handshake. If
value is 0 then fast open is disabled. value is 0 then fast open is disabled.
Default: )" << config->conn.listener.fastopen << R"( Default: )"
<< config->conn.listener.fastopen << R"(
--no-kqueue Don't use kqueue. This option is only applicable for --no-kqueue Don't use kqueue. This option is only applicable for
the platforms which have kqueue. For other platforms, the platforms which have kqueue. For other platforms,
this option will be simply ignored. this option will be simply ignored.
@ -1835,7 +1845,8 @@ SSL/TLS:
in the preference order. The supported curves depend on in the preference order. The supported curves depend on
the linked OpenSSL library. This function requires the linked OpenSSL library. This function requires
OpenSSL >= 1.0.2. OpenSSL >= 1.0.2.
Default: )" << config->tls.ecdh_curves << R"( Default: )"
<< config->tls.ecdh_curves << R"(
-k, --insecure -k, --insecure
Don't verify backend server's certificate if TLS is Don't verify backend server's certificate if TLS is
enabled for backend connections. enabled for backend connections.
@ -1875,7 +1886,8 @@ SSL/TLS:
NPN. The parameter must be delimited by a single comma NPN. The parameter must be delimited by a single comma
only and any white spaces are treated as a part of only and any white spaces are treated as a part of
protocol string. protocol string.
Default: )" << DEFAULT_NPN_LIST << R"( Default: )"
<< DEFAULT_NPN_LIST << R"(
--verify-client --verify-client
Require and verify client certificate. Require and verify client certificate.
--verify-client-cacert=<PATH> --verify-client-cacert=<PATH>
@ -1898,7 +1910,8 @@ SSL/TLS:
protocol list advertised by client does not overlap this protocol list advertised by client does not overlap this
list, you will receive the error message "unknown list, you will receive the error message "unknown
protocol". protocol".
Default: )" << DEFAULT_TLS_PROTO_LIST << R"( Default: )"
<< DEFAULT_TLS_PROTO_LIST << R"(
--tls-ticket-key-file=<PATH> --tls-ticket-key-file=<PATH>
Path to file that contains random data to construct TLS Path to file that contains random data to construct TLS
session ticket parameters. If aes-128-cbc is given in session ticket parameters. If aes-128-cbc is given in
@ -1952,11 +1965,13 @@ SSL/TLS:
"failure" count is incremented by 1, which contributed "failure" count is incremented by 1, which contributed
to the value controlled to the value controlled
--tls-ticket-key-memcached-max-fail option. --tls-ticket-key-memcached-max-fail option.
Default: )" << config->tls.ticket.memcached.max_retry << R"( Default: )"
<< config->tls.ticket.memcached.max_retry << R"(
--tls-ticket-key-memcached-max-fail=<N> --tls-ticket-key-memcached-max-fail=<N>
Set maximum number of consecutive failure before Set maximum number of consecutive failure before
disabling TLS ticket until next scheduled key retrieval. disabling TLS ticket until next scheduled key retrieval.
Default: )" << config->tls.ticket.memcached.max_fail << R"( Default: )"
<< config->tls.ticket.memcached.max_fail << R"(
--tls-ticket-key-cipher=<CIPHER> --tls-ticket-key-cipher=<CIPHER>
Specify cipher to encrypt TLS session ticket. Specify Specify cipher to encrypt TLS session ticket. Specify
either aes-128-cbc or aes-256-cbc. By default, either aes-128-cbc or aes-256-cbc. By default,
@ -1970,7 +1985,8 @@ SSL/TLS:
--fetch-ocsp-response-file=<PATH> --fetch-ocsp-response-file=<PATH>
Path to fetch-ocsp-response script file. It should be Path to fetch-ocsp-response script file. It should be
absolute path. absolute path.
Default: )" << config->tls.ocsp.fetch_ocsp_response_file << R"( Default: )"
<< config->tls.ocsp.fetch_ocsp_response_file << R"(
--ocsp-update-interval=<DURATION> --ocsp-update-interval=<DURATION>
Set interval to update OCSP response cache. Set interval to update OCSP response cache.
Default: )" Default: )"
@ -2033,34 +2049,36 @@ HTTP/2 and SPDY:
-c, --frontend-http2-max-concurrent-streams=<N> -c, --frontend-http2-max-concurrent-streams=<N>
Set the maximum number of the concurrent streams in one Set the maximum number of the concurrent streams in one
frontend HTTP/2 and SPDY session. frontend HTTP/2 and SPDY session.
Default: )" << config->http2.upstream.max_concurrent_streams Default: )"
<< R"( << config->http2.upstream.max_concurrent_streams << R"(
--backend-http2-max-concurrent-streams=<N> --backend-http2-max-concurrent-streams=<N>
Set the maximum number of the concurrent streams in one Set the maximum number of the concurrent streams in one
backend HTTP/2 session. This sets maximum number of backend HTTP/2 session. This sets maximum number of
concurrent opened pushed streams. The maximum number of concurrent opened pushed streams. The maximum number of
concurrent requests are set by a remote server. concurrent requests are set by a remote server.
Default: )" << config->http2.downstream.max_concurrent_streams Default: )"
<< R"( << config->http2.downstream.max_concurrent_streams << R"(
--frontend-http2-window-size=<SIZE> --frontend-http2-window-size=<SIZE>
Sets the per-stream initial window size of HTTP/2 and Sets the per-stream initial window size of HTTP/2 and
SPDY frontend connection. SPDY frontend connection.
Default: )" << config->http2.upstream.window_size << R"( Default: )"
<< config->http2.upstream.window_size << R"(
--frontend-http2-connection-window-size=<SIZE> --frontend-http2-connection-window-size=<SIZE>
Sets the per-connection window size of HTTP/2 and SPDY Sets the per-connection window size of HTTP/2 and SPDY
frontend connection. For SPDY connection, the value frontend connection. For SPDY connection, the value
less than 64KiB is rounded up to 64KiB. less than 64KiB is rounded up to 64KiB.
Default: )" << config->http2.upstream.connection_window_size Default: )"
<< R"( << config->http2.upstream.connection_window_size << R"(
--backend-http2-window-size=<SIZE> --backend-http2-window-size=<SIZE>
Sets the initial window size of HTTP/2 backend Sets the initial window size of HTTP/2 backend
connection. connection.
Default: )" << config->http2.downstream.window_size << R"( Default: )"
<< config->http2.downstream.window_size << R"(
--backend-http2-connection-window-size=<SIZE> --backend-http2-connection-window-size=<SIZE>
Sets the per-connection window size of HTTP/2 backend Sets the per-connection window size of HTTP/2 backend
connection. connection.
Default: )" << config->http2.downstream.connection_window_size Default: )"
<< R"( << config->http2.downstream.connection_window_size << R"(
--http2-no-cookie-crumbling --http2-no-cookie-crumbling
Don't crumble cookie header field. Don't crumble cookie header field.
--padding=<N> --padding=<N>
@ -2185,12 +2203,14 @@ Logging:
The variable can be enclosed by "{" and "}" for The variable can be enclosed by "{" and "}" for
disambiguation (e.g., ${remote_addr}). disambiguation (e.g., ${remote_addr}).
Default: )" << DEFAULT_ACCESSLOG_FORMAT << R"( Default: )"
<< DEFAULT_ACCESSLOG_FORMAT << R"(
--errorlog-file=<PATH> --errorlog-file=<PATH>
Set path to write error log. To reopen file, send USR1 Set path to write error log. To reopen file, send USR1
signal to nghttpx. stderr will be redirected to the signal to nghttpx. stderr will be redirected to the
error log file unless --errorlog-syslog is used. error log file unless --errorlog-syslog is used.
Default: )" << config->logging.error.file << R"( Default: )"
<< config->logging.error.file << R"(
--errorlog-syslog --errorlog-syslog
Send error log to syslog. If this option is used, Send error log to syslog. If this option is used,
--errorlog-file option is ignored. --errorlog-file option is ignored.
@ -2279,7 +2299,8 @@ HTTP:
Set maximum number of incoming HTTP request header Set maximum number of incoming HTTP request header
fields. If trailer fields exist, they are counted fields. If trailer fields exist, they are counted
towards this number. towards this number.
Default: )" << config->http.max_request_header_fields << R"( Default: )"
<< config->http.max_request_header_fields << R"(
--response-header-field-buffer=<SIZE> --response-header-field-buffer=<SIZE>
Set maximum buffer size for incoming HTTP response Set maximum buffer size for incoming HTTP response
header field list. This is the sum of header name and header field list. This is the sum of header name and
@ -2291,7 +2312,8 @@ HTTP:
Set maximum number of incoming HTTP response header Set maximum number of incoming HTTP response header
fields. If trailer fields exist, they are counted fields. If trailer fields exist, they are counted
towards this number. towards this number.
Default: )" << config->http.max_response_header_fields << R"( Default: )"
<< config->http.max_response_header_fields << R"(
--error-page=(<CODE>|*)=<PATH> --error-page=(<CODE>|*)=<PATH>
Set file path to custom error page served when nghttpx Set file path to custom error page served when nghttpx
originally generates HTTP error status code <CODE>. originally generates HTTP error status code <CODE>.
@ -2301,7 +2323,8 @@ HTTP:
backend server, the custom error pages are not used. backend server, the custom error pages are not used.
--server-name=<NAME> --server-name=<NAME>
Change server response header field value to <NAME>. Change server response header field value to <NAME>.
Default: )" << config->http.server_name << R"( Default: )"
<< config->http.server_name << R"(
--no-server-rewrite --no-server-rewrite
Don't rewrite server header field in default mode. When Don't rewrite server header field in default mode. When
--http2-proxy is used, these headers will not be altered --http2-proxy is used, these headers will not be altered
@ -2310,8 +2333,8 @@ HTTP:
API: API:
--api-max-request-body=<SIZE> --api-max-request-body=<SIZE>
Set the maximum size of request body for API request. Set the maximum size of request body for API request.
Default: )" << util::utos_unit(config->api.max_request_body) Default: )"
<< R"( << util::utos_unit(config->api.max_request_body) << R"(
Debug: Debug:
--frontend-http2-dump-request-header=<PATH> --frontend-http2-dump-request-header=<PATH>
@ -2348,7 +2371,8 @@ Scripting:
Misc: Misc:
--conf=<PATH> --conf=<PATH>
Load configuration from <PATH>. Load configuration from <PATH>.
Default: )" << config->conf_path << R"( Default: )"
<< config->conf_path << R"(
--include=<PATH> --include=<PATH>
Load additional configurations from <PATH>. File <PATH> Load additional configurations from <PATH>. File <PATH>
is read when configuration parser encountered this is read when configuration parser encountered this
@ -2366,7 +2390,8 @@ Misc:
The <DURATION> argument is an integer and an optional unit (e.g., 1s The <DURATION> argument is an integer and an optional unit (e.g., 1s
is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
(hours, minutes, seconds and milliseconds, respectively). If a unit (hours, minutes, seconds and milliseconds, respectively). If a unit
is omitted, a second is used as unit.)" << std::endl; is omitted, a second is used as unit.)"
<< std::endl;
} }
} // namespace } // namespace

View File

@ -2285,12 +2285,14 @@ int parse_config(Config *config, int optid, const StringRef &opt,
return 0; return 0;
case SHRPX_OPTID_BACKEND_NO_TLS: case SHRPX_OPTID_BACKEND_NO_TLS:
LOG(WARN) << opt << ": deprecated. backend connection is not encrypted by " LOG(WARN) << opt << ": deprecated. backend connection is not encrypted by "
"default. See also " << SHRPX_OPT_BACKEND_TLS; "default. See also "
<< SHRPX_OPT_BACKEND_TLS;
return 0; return 0;
case SHRPX_OPTID_BACKEND_TLS_SNI_FIELD: case SHRPX_OPTID_BACKEND_TLS_SNI_FIELD:
LOG(WARN) << opt << ": deprecated. Use sni keyword in --backend option. " LOG(WARN) << opt << ": deprecated. Use sni keyword in --backend option. "
"For now, all sni values of all backends are " "For now, all sni values of all backends are "
"overridden by the given value " << optarg; "overridden by the given value "
<< optarg;
config->tls.backend_sni_name = make_string_ref(config->balloc, optarg); config->tls.backend_sni_name = make_string_ref(config->balloc, optarg);
return 0; return 0;

View File

@ -614,8 +614,8 @@ ssize_t Connection::write_tls(const void *data, size_t len) {
return 0; return 0;
case SSL_ERROR_SSL: case SSL_ERROR_SSL:
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
LOG(INFO) << "SSL_write: " << ERR_error_string(ERR_get_error(), LOG(INFO) << "SSL_write: "
nullptr); << ERR_error_string(ERR_get_error(), nullptr);
} }
return SHRPX_ERR_NETWORK; return SHRPX_ERR_NETWORK;
default: default:

View File

@ -1058,8 +1058,8 @@ int on_response_headers(Http2Session *http2session, Downstream *downstream,
} }
downstream->set_request_state(Downstream::HEADER_COMPLETE); downstream->set_request_state(Downstream::HEADER_COMPLETE);
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
SSLOG(INFO, http2session) SSLOG(INFO, http2session) << "HTTP upgrade success. stream_id="
<< "HTTP upgrade success. stream_id=" << frame->hd.stream_id; << frame->hd.stream_id;
} }
} else { } else {
auto content_length = resp.fs.header(http2::HD_CONTENT_LENGTH); auto content_length = resp.fs.header(http2::HD_CONTENT_LENGTH);

View File

@ -309,7 +309,8 @@ int Http2Upstream::on_request_headers(Downstream *downstream,
ss << TTY_HTTP_HD << nv.name << TTY_RST << ": " << nv.value << "\n"; ss << TTY_HTTP_HD << nv.name << TTY_RST << ": " << nv.value << "\n";
} }
ULOG(INFO, this) << "HTTP request headers. stream_id=" ULOG(INFO, this) << "HTTP request headers. stream_id="
<< downstream->get_stream_id() << "\n" << ss.str(); << downstream->get_stream_id() << "\n"
<< ss.str();
} }
auto config = get_config(); auto config = get_config();
@ -1814,7 +1815,8 @@ void Http2Upstream::log_response_headers(
<< StringRef{nv.value, nv.valuelen} << "\n"; << StringRef{nv.value, nv.valuelen} << "\n";
} }
ULOG(INFO, this) << "HTTP response headers. stream_id=" ULOG(INFO, this) << "HTTP response headers. stream_id="
<< downstream->get_stream_id() << "\n" << ss.str(); << downstream->get_stream_id() << "\n"
<< ss.str();
} }
int Http2Upstream::on_timeout(Downstream *downstream) { int Http2Upstream::on_timeout(Downstream *downstream) {
@ -2001,7 +2003,8 @@ int Http2Upstream::submit_push_promise(const StringRef &scheme,
<< StringRef{nv.value, nv.valuelen} << "\n"; << StringRef{nv.value, nv.valuelen} << "\n";
} }
ULOG(INFO, this) << "HTTP push request headers. promised_stream_id=" ULOG(INFO, this) << "HTTP push request headers. promised_stream_id="
<< promised_stream_id << "\n" << ss.str(); << promised_stream_id << "\n"
<< ss.str();
} }
return 0; return 0;

View File

@ -523,7 +523,8 @@ int HttpDownstreamConnection::push_request_headers() {
nhdrs = http::colorizeHeaders(nhdrs.c_str()); nhdrs = http::colorizeHeaders(nhdrs.c_str());
} }
DCLOG(INFO, this) << "HTTP request headers. stream_id=" DCLOG(INFO, this) << "HTTP request headers. stream_id="
<< downstream_->get_stream_id() << "\n" << nhdrs; << downstream_->get_stream_id() << "\n"
<< nhdrs;
} }
// Don't call signal_write() if we anticipate request body. We call // Don't call signal_write() if we anticipate request body. We call
@ -791,8 +792,8 @@ int ensure_max_header_fields(const Downstream *downstream,
if (resp.fs.num_fields() >= httpconf.max_response_header_fields) { if (resp.fs.num_fields() >= httpconf.max_response_header_fields) {
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
DLOG(INFO, downstream) DLOG(INFO, downstream) << "Too many header field num="
<< "Too many header field num=" << resp.fs.num_fields() + 1; << resp.fs.num_fields() + 1;
} }
return -1; return -1;
} }

View File

@ -140,8 +140,8 @@ int htp_hdr_keycb(http_parser *htp, const char *data, size_t len) {
} else { } else {
if (req.fs.num_fields() >= httpconf.max_request_header_fields) { if (req.fs.num_fields() >= httpconf.max_request_header_fields) {
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
ULOG(INFO, upstream) ULOG(INFO, upstream) << "Too many header field num="
<< "Too many header field num=" << req.fs.num_fields() + 1; << req.fs.num_fields() + 1;
} }
downstream->set_request_state( downstream->set_request_state(
Downstream::HTTP1_REQUEST_HEADER_TOO_LARGE); Downstream::HTTP1_REQUEST_HEADER_TOO_LARGE);
@ -156,8 +156,8 @@ int htp_hdr_keycb(http_parser *htp, const char *data, size_t len) {
} else { } else {
if (req.fs.num_fields() >= httpconf.max_request_header_fields) { if (req.fs.num_fields() >= httpconf.max_request_header_fields) {
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
ULOG(INFO, upstream) ULOG(INFO, upstream) << "Too many header field num="
<< "Too many header field num=" << req.fs.num_fields() + 1; << req.fs.num_fields() + 1;
} }
return -1; return -1;
} }

View File

@ -209,7 +209,7 @@ std::pair<OutputIterator, size_t> copy(const ImmutableString &src, size_t avail,
namespace { namespace {
template <size_t N, typename OutputIterator> template <size_t N, typename OutputIterator>
std::pair<OutputIterator, size_t> copy_l(const char(&src)[N], size_t avail, std::pair<OutputIterator, size_t> copy_l(const char (&src)[N], size_t avail,
OutputIterator oitr) { OutputIterator oitr) {
return copy(src, N - 1, avail, oitr); return copy(src, N - 1, avail, oitr);
} }
@ -320,7 +320,8 @@ void upstream_accesslog(const std::vector<LogFragment> &lfv,
break; break;
case SHRPX_LOGF_REQUEST_TIME: { case SHRPX_LOGF_REQUEST_TIME: {
auto t = std::chrono::duration_cast<std::chrono::milliseconds>( auto t = std::chrono::duration_cast<std::chrono::milliseconds>(
lgsp.request_end_time - lgsp.request_start_time).count(); lgsp.request_end_time - lgsp.request_start_time)
.count();
auto frac = util::utos(t % 1000); auto frac = util::utos(t % 1000);
auto sec = util::utos(t / 1000); auto sec = util::utos(t / 1000);

View File

@ -552,8 +552,8 @@ int MemcachedConnection::parse_packet() {
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
if (parse_state_.status_code) { if (parse_state_.status_code) {
MCLOG(INFO, this) MCLOG(INFO, this) << "response returned error status: "
<< "response returned error status: " << parse_state_.status_code; << parse_state_.status_code;
} }
} }

View File

@ -191,7 +191,8 @@ void on_ctrl_recv_callback(spdylay_session *session, spdylay_frame_type type,
ss << TTY_HTTP_HD << nv[i] << TTY_RST << ": " << nv[i + 1] << "\n"; ss << TTY_HTTP_HD << nv[i] << TTY_RST << ": " << nv[i + 1] << "\n";
} }
ULOG(INFO, upstream) << "HTTP request headers. stream_id=" ULOG(INFO, upstream) << "HTTP request headers. stream_id="
<< downstream->get_stream_id() << "\n" << ss.str(); << downstream->get_stream_id() << "\n"
<< ss.str();
} }
size_t num_headers = 0; size_t num_headers = 0;
@ -872,8 +873,8 @@ ssize_t spdy_data_read_callback(spdylay_session *session, int32_t stream_id,
} else { } else {
// For tunneling, issue RST_STREAM to finish the stream. // For tunneling, issue RST_STREAM to finish the stream.
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
ULOG(INFO, upstream) ULOG(INFO, upstream) << "RST_STREAM to tunneled stream stream_id="
<< "RST_STREAM to tunneled stream stream_id=" << stream_id; << stream_id;
} }
upstream->rst_stream( upstream->rst_stream(
downstream, infer_upstream_rst_stream_status_code( downstream, infer_upstream_rst_stream_status_code(
@ -1000,10 +1001,12 @@ int SpdyUpstream::error_reply(Downstream *downstream,
auto content_length = util::make_string_ref_uint(balloc, html.size()); auto content_length = util::make_string_ref_uint(balloc, html.size());
auto status_string = http2::get_status_string(balloc, status_code); auto status_string = http2::get_status_string(balloc, status_code);
const char *nv[] = {":status", status_string.c_str(), ":version", "http/1.1", const char *nv[] = {":status", status_string.c_str(),
"content-type", "text/html; charset=UTF-8", "server", ":version", "http/1.1",
get_config()->http.server_name.c_str(), "content-length", "content-type", "text/html; charset=UTF-8",
content_length.c_str(), "date", lgconf->time_http.c_str(), "server", get_config()->http.server_name.c_str(),
"content-length", content_length.c_str(),
"date", lgconf->time_http.c_str(),
nullptr}; nullptr};
rv = spdylay_submit_response(session_, downstream->get_stream_id(), nv, rv = spdylay_submit_response(session_, downstream->get_stream_id(), nv,
@ -1166,7 +1169,8 @@ int SpdyUpstream::on_downstream_header_complete(Downstream *downstream) {
ss << TTY_HTTP_HD << nv[i] << TTY_RST << ": " << nv[i + 1] << "\n"; ss << TTY_HTTP_HD << nv[i] << TTY_RST << ": " << nv[i + 1] << "\n";
} }
ULOG(INFO, this) << "HTTP response headers. stream_id=" ULOG(INFO, this) << "HTTP response headers. stream_id="
<< downstream->get_stream_id() << "\n" << ss.str(); << downstream->get_stream_id() << "\n"
<< ss.str();
} }
spdylay_data_provider data_prd; spdylay_data_provider data_prd;
data_prd.source.ptr = downstream; data_prd.source.ptr = downstream;

View File

@ -864,8 +864,8 @@ SSL_CTX *create_ssl_client_context(
if (neverbleed_load_private_key_file(nb, ssl_ctx, private_key_file.c_str(), if (neverbleed_load_private_key_file(nb, ssl_ctx, private_key_file.c_str(),
errbuf.data()) != 1) { errbuf.data()) != 1) {
LOG(FATAL) << "neverbleed_load_private_key_file: could not load client " LOG(FATAL) << "neverbleed_load_private_key_file: could not load client "
"private key from " << private_key_file << ": " "private key from "
<< errbuf.data(); << private_key_file << ": " << errbuf.data();
DIE(); DIE();
} }
#endif // HAVE_NEVERBLEED #endif // HAVE_NEVERBLEED
@ -881,8 +881,8 @@ SSL_CTX *create_ssl_client_context(
SSL *create_ssl(SSL_CTX *ssl_ctx) { SSL *create_ssl(SSL_CTX *ssl_ctx) {
auto ssl = SSL_new(ssl_ctx); auto ssl = SSL_new(ssl_ctx);
if (!ssl) { if (!ssl) {
LOG(ERROR) << "SSL_new() failed: " << ERR_error_string(ERR_get_error(), LOG(ERROR) << "SSL_new() failed: "
nullptr); << ERR_error_string(ERR_get_error(), nullptr);
return nullptr; return nullptr;
} }

View File

@ -144,8 +144,8 @@ void test_shrpx_ssl_cert_lookup_tree_add_cert_from_x509(void) {
} }
template <size_t N, size_t M> template <size_t N, size_t M>
bool tls_hostname_match_wrapper(const char(&pattern)[N], bool tls_hostname_match_wrapper(const char (&pattern)[N],
const char(&hostname)[M]) { const char (&hostname)[M]) {
return ssl::tls_hostname_match(StringRef{pattern, N}, StringRef{hostname, M}); return ssl::tls_hostname_match(StringRef{pattern, N}, StringRef{hostname, M});
} }

View File

@ -219,7 +219,8 @@ void renew_ticket_key_cb(struct ev_loop *loop, ev_timer *w, int revents) {
auto max_tickets = auto max_tickets =
static_cast<size_t>(std::chrono::duration_cast<std::chrono::hours>( static_cast<size_t>(std::chrono::duration_cast<std::chrono::hours>(
get_config()->tls.session_timeout).count()); get_config()->tls.session_timeout)
.count());
new_keys.resize(std::min(max_tickets, old_keys.size() + 1)); new_keys.resize(std::min(max_tickets, old_keys.size() + 1));
std::copy_n(std::begin(old_keys), new_keys.size() - 1, std::copy_n(std::begin(old_keys), new_keys.size() - 1,

View File

@ -66,11 +66,11 @@ make_array(T &&... t) {
sizeof...(T)>{{std::forward<T>(t)...}}; sizeof...(T)>{{std::forward<T>(t)...}};
} }
template <typename T, size_t N> constexpr size_t array_size(T(&)[N]) { template <typename T, size_t N> constexpr size_t array_size(T (&)[N]) {
return N; return N;
} }
template <typename T, size_t N> constexpr size_t str_size(T(&)[N]) { template <typename T, size_t N> constexpr size_t str_size(T (&)[N]) {
return N - 1; return N - 1;
} }
@ -264,8 +264,8 @@ public:
: len(std::distance(first, last)), base(copystr(first, last)) {} : len(std::distance(first, last)), base(copystr(first, last)) {}
ImmutableString(const ImmutableString &other) ImmutableString(const ImmutableString &other)
: len(other.len), base(copystr(std::begin(other), std::end(other))) {} : len(other.len), base(copystr(std::begin(other), std::end(other))) {}
ImmutableString(ImmutableString &&other) noexcept : len(other.len), ImmutableString(ImmutableString &&other) noexcept
base(other.base) { : len(other.len), base(other.base) {
other.len = 0; other.len = 0;
other.base = ""; other.base = "";
} }
@ -300,7 +300,7 @@ public:
return *this; return *this;
} }
template <size_t N> static ImmutableString from_lit(const char(&s)[N]) { template <size_t N> static ImmutableString from_lit(const char (&s)[N]) {
return ImmutableString(s, N - 1); return ImmutableString(s, N - 1);
} }
@ -427,7 +427,7 @@ public:
: base(reinterpret_cast<const char *>(first)), : base(reinterpret_cast<const char *>(first)),
len(std::distance(first, last)) {} len(std::distance(first, last)) {}
template <typename CharT, size_t N> template <typename CharT, size_t N>
constexpr static StringRef from_lit(const CharT(&s)[N]) { constexpr static StringRef from_lit(const CharT (&s)[N]) {
return StringRef{s, N - 1}; return StringRef{s, N - 1};
} }
static StringRef from_maybe_nullptr(const char *s) { static StringRef from_maybe_nullptr(const char *s) {

View File

@ -137,7 +137,7 @@ StringRef quote_string(BlockAllocator &balloc, const StringRef &target);
std::string format_hex(const unsigned char *s, size_t len); std::string format_hex(const unsigned char *s, size_t len);
template <size_t N> std::string format_hex(const unsigned char(&s)[N]) { template <size_t N> std::string format_hex(const unsigned char (&s)[N]) {
return format_hex(s, N); return format_hex(s, N);
} }
@ -232,7 +232,7 @@ template <typename S, typename T> bool istarts_with(const S &a, const T &b) {
} }
template <typename T, typename CharT, size_t N> template <typename T, typename CharT, size_t N>
bool istarts_with_l(const T &a, const CharT(&b)[N]) { bool istarts_with_l(const T &a, const CharT (&b)[N]) {
return istarts_with(a.begin(), a.end(), b, b + N - 1); return istarts_with(a.begin(), a.end(), b, b + N - 1);
} }
@ -250,7 +250,7 @@ template <typename T, typename S> bool ends_with(const T &a, const S &b) {
} }
template <typename T, typename CharT, size_t N> template <typename T, typename CharT, size_t N>
bool ends_with_l(const T &a, const CharT(&b)[N]) { bool ends_with_l(const T &a, const CharT (&b)[N]) {
return ends_with(a.begin(), a.end(), b, b + N - 1); return ends_with(a.begin(), a.end(), b, b + N - 1);
} }
@ -268,7 +268,7 @@ template <typename T, typename S> bool iends_with(const T &a, const S &b) {
} }
template <typename T, typename CharT, size_t N> template <typename T, typename CharT, size_t N>
bool iends_with_l(const T &a, const CharT(&b)[N]) { bool iends_with_l(const T &a, const CharT (&b)[N]) {
return iends_with(a.begin(), a.end(), b, b + N - 1); return iends_with(a.begin(), a.end(), b, b + N - 1);
} }
@ -286,12 +286,12 @@ template <typename T, typename S> bool strieq(const T &a, const S &b) {
} }
template <typename CharT, typename InputIt, size_t N> template <typename CharT, typename InputIt, size_t N>
bool strieq_l(const CharT(&a)[N], InputIt b, size_t blen) { bool strieq_l(const CharT (&a)[N], InputIt b, size_t blen) {
return strieq(a, a + (N - 1), b, b + blen); return strieq(a, a + (N - 1), b, b + blen);
} }
template <typename CharT, size_t N, typename T> template <typename CharT, size_t N, typename T>
bool strieq_l(const CharT(&a)[N], const T &b) { bool strieq_l(const CharT (&a)[N], const T &b) {
return strieq(a, a + (N - 1), b.begin(), b.end()); return strieq(a, a + (N - 1), b.begin(), b.end());
} }
@ -308,12 +308,12 @@ template <typename T, typename S> bool streq(const T &a, const S &b) {
} }
template <typename CharT, typename InputIt, size_t N> template <typename CharT, typename InputIt, size_t N>
bool streq_l(const CharT(&a)[N], InputIt b, size_t blen) { bool streq_l(const CharT (&a)[N], InputIt b, size_t blen) {
return streq(a, a + (N - 1), b, b + blen); return streq(a, a + (N - 1), b, b + blen);
} }
template <typename CharT, size_t N, typename T> template <typename CharT, size_t N, typename T>
bool streq_l(const CharT(&a)[N], const T &b) { bool streq_l(const CharT (&a)[N], const T &b) {
return streq(a, a + (N - 1), b.begin(), b.end()); return streq(a, a + (N - 1), b.begin(), b.end());
} }
@ -728,7 +728,7 @@ OutputIt random_alpha_digit(OutputIt first, OutputIt last, Generator &gen) {
} }
template <typename OutputIterator, typename CharT, size_t N> template <typename OutputIterator, typename CharT, size_t N>
OutputIterator copy_lit(OutputIterator it, CharT(&s)[N]) { OutputIterator copy_lit(OutputIterator it, CharT (&s)[N]) {
return std::copy_n(s, N - 1, it); return std::copy_n(s, N - 1, it);
} }

View File

@ -209,8 +209,7 @@ static void run_nghttp2_session_send(void) {
fail: fail:
nghttp2_session_del(session); nghttp2_session_del(session);
client_new_fail: client_new_fail:;
;
} }
void test_nghttp2_session_send(void) { void test_nghttp2_session_send(void) {

View File

@ -1001,20 +1001,25 @@ void test_nghttp2_hd_deflate_inflate(void) {
nghttp2_hd_deflater deflater; nghttp2_hd_deflater deflater;
nghttp2_hd_inflater inflater; nghttp2_hd_inflater inflater;
nghttp2_nv nv1[] = { nghttp2_nv nv1[] = {
MAKE_NV(":status", "200 OK"), MAKE_NV("access-control-allow-origin", "*"), MAKE_NV(":status", "200 OK"),
MAKE_NV("access-control-allow-origin", "*"),
MAKE_NV("cache-control", "private, max-age=0, must-revalidate"), MAKE_NV("cache-control", "private, max-age=0, must-revalidate"),
MAKE_NV("content-length", "76073"), MAKE_NV("content-type", "text/html"), MAKE_NV("content-length", "76073"),
MAKE_NV("content-type", "text/html"),
MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"),
MAKE_NV("expires", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("expires", "Sat, 27 Jul 2013 06:22:12 GMT"),
MAKE_NV("server", "Apache"), MAKE_NV("vary", "foobar"), MAKE_NV("server", "Apache"),
MAKE_NV("vary", "foobar"),
MAKE_NV("via", "1.1 alphabravo (squid/3.x.x), 1.1 nghttpx"), MAKE_NV("via", "1.1 alphabravo (squid/3.x.x), 1.1 nghttpx"),
MAKE_NV("x-cache", "MISS from alphabravo"), MAKE_NV("x-cache", "MISS from alphabravo"),
MAKE_NV("x-cache-action", "MISS"), MAKE_NV("x-cache-age", "0"), MAKE_NV("x-cache-action", "MISS"),
MAKE_NV("x-cache-age", "0"),
MAKE_NV("x-cache-lookup", "MISS from alphabravo:3128"), MAKE_NV("x-cache-lookup", "MISS from alphabravo:3128"),
MAKE_NV("x-lb-nocache", "true"), MAKE_NV("x-lb-nocache", "true"),
}; };
nghttp2_nv nv2[] = { nghttp2_nv nv2[] = {
MAKE_NV(":status", "304 Not Modified"), MAKE_NV("age", "0"), MAKE_NV(":status", "304 Not Modified"),
MAKE_NV("age", "0"),
MAKE_NV("cache-control", "max-age=56682045"), MAKE_NV("cache-control", "max-age=56682045"),
MAKE_NV("content-type", "text/css"), MAKE_NV("content-type", "text/css"),
MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"),
@ -1025,7 +1030,8 @@ void test_nghttp2_hd_deflate_inflate(void) {
MAKE_NV("x-cache", "HIT from alphabravo"), MAKE_NV("x-cache", "HIT from alphabravo"),
MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128")}; MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128")};
nghttp2_nv nv3[] = { nghttp2_nv nv3[] = {
MAKE_NV(":status", "304 Not Modified"), MAKE_NV("age", "0"), MAKE_NV(":status", "304 Not Modified"),
MAKE_NV("age", "0"),
MAKE_NV("cache-control", "max-age=56682072"), MAKE_NV("cache-control", "max-age=56682072"),
MAKE_NV("content-type", "text/css"), MAKE_NV("content-type", "text/css"),
MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"),
@ -1037,7 +1043,8 @@ void test_nghttp2_hd_deflate_inflate(void) {
MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"), MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"),
}; };
nghttp2_nv nv4[] = { nghttp2_nv nv4[] = {
MAKE_NV(":status", "304 Not Modified"), MAKE_NV("age", "0"), MAKE_NV(":status", "304 Not Modified"),
MAKE_NV("age", "0"),
MAKE_NV("cache-control", "max-age=56682022"), MAKE_NV("cache-control", "max-age=56682022"),
MAKE_NV("content-type", "text/css"), MAKE_NV("content-type", "text/css"),
MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"),
@ -1049,7 +1056,8 @@ void test_nghttp2_hd_deflate_inflate(void) {
MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"), MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"),
}; };
nghttp2_nv nv5[] = { nghttp2_nv nv5[] = {
MAKE_NV(":status", "304 Not Modified"), MAKE_NV("age", "0"), MAKE_NV(":status", "304 Not Modified"),
MAKE_NV("age", "0"),
MAKE_NV("cache-control", "max-age=4461139"), MAKE_NV("cache-control", "max-age=4461139"),
MAKE_NV("content-type", "application/x-javascript"), MAKE_NV("content-type", "application/x-javascript"),
MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"),
@ -1061,7 +1069,8 @@ void test_nghttp2_hd_deflate_inflate(void) {
MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"), MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"),
}; };
nghttp2_nv nv6[] = { nghttp2_nv nv6[] = {
MAKE_NV(":status", "304 Not Modified"), MAKE_NV("age", "0"), MAKE_NV(":status", "304 Not Modified"),
MAKE_NV("age", "0"),
MAKE_NV("cache-control", "max-age=18645951"), MAKE_NV("cache-control", "max-age=18645951"),
MAKE_NV("content-type", "application/x-javascript"), MAKE_NV("content-type", "application/x-javascript"),
MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"),
@ -1073,7 +1082,8 @@ void test_nghttp2_hd_deflate_inflate(void) {
MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"), MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"),
}; };
nghttp2_nv nv7[] = { nghttp2_nv nv7[] = {
MAKE_NV(":status", "304 Not Modified"), MAKE_NV("age", "0"), MAKE_NV(":status", "304 Not Modified"),
MAKE_NV("age", "0"),
MAKE_NV("cache-control", "max-age=31536000"), MAKE_NV("cache-control", "max-age=31536000"),
MAKE_NV("content-type", "application/javascript"), MAKE_NV("content-type", "application/javascript"),
MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"),
@ -1085,7 +1095,8 @@ void test_nghttp2_hd_deflate_inflate(void) {
MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"), MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"),
}; };
nghttp2_nv nv8[] = { nghttp2_nv nv8[] = {
MAKE_NV(":status", "304 Not Modified"), MAKE_NV("age", "0"), MAKE_NV(":status", "304 Not Modified"),
MAKE_NV("age", "0"),
MAKE_NV("cache-control", "max-age=31536000"), MAKE_NV("cache-control", "max-age=31536000"),
MAKE_NV("content-type", "application/javascript"), MAKE_NV("content-type", "application/javascript"),
MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"),
@ -1097,7 +1108,8 @@ void test_nghttp2_hd_deflate_inflate(void) {
MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"), MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"),
}; };
nghttp2_nv nv9[] = { nghttp2_nv nv9[] = {
MAKE_NV(":status", "304 Not Modified"), MAKE_NV("age", "0"), MAKE_NV(":status", "304 Not Modified"),
MAKE_NV("age", "0"),
MAKE_NV("cache-control", "max-age=31536000"), MAKE_NV("cache-control", "max-age=31536000"),
MAKE_NV("content-type", "application/javascript"), MAKE_NV("content-type", "application/javascript"),
MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"),
@ -1109,7 +1121,8 @@ void test_nghttp2_hd_deflate_inflate(void) {
MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"), MAKE_NV("x-cache-lookup", "HIT from alphabravo:3128"),
}; };
nghttp2_nv nv10[] = { nghttp2_nv nv10[] = {
MAKE_NV(":status", "304 Not Modified"), MAKE_NV("age", "0"), MAKE_NV(":status", "304 Not Modified"),
MAKE_NV("age", "0"),
MAKE_NV("cache-control", "max-age=56682045"), MAKE_NV("cache-control", "max-age=56682045"),
MAKE_NV("content-type", "text/css"), MAKE_NV("content-type", "text/css"),
MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"), MAKE_NV("date", "Sat, 27 Jul 2013 06:22:12 GMT"),
@ -1269,7 +1282,8 @@ void test_nghttp2_hd_deflate_hd_vec(void) {
nghttp2_hd_deflater *deflater; nghttp2_hd_deflater *deflater;
nghttp2_hd_inflater *inflater; nghttp2_hd_inflater *inflater;
nghttp2_nv nva[] = { nghttp2_nv nva[] = {
MAKE_NV(":method", "PUT"), MAKE_NV(":scheme", "https"), MAKE_NV(":method", "PUT"),
MAKE_NV(":scheme", "https"),
MAKE_NV(":authority", "localhost:3000"), MAKE_NV(":authority", "localhost:3000"),
MAKE_NV(":path", "/usr/foo/alpha/bravo"), MAKE_NV(":path", "/usr/foo/alpha/bravo"),
MAKE_NV("content-type", "image/png"), MAKE_NV("content-type", "image/png"),
@ -1433,7 +1447,7 @@ static size_t encode_length(uint8_t *buf, uint64_t n, size_t prefix) {
void test_nghttp2_hd_decode_length(void) { void test_nghttp2_hd_decode_length(void) {
uint32_t out; uint32_t out;
size_t shift; size_t shift;
int final; int fin;
uint8_t buf[16]; uint8_t buf[16];
uint8_t *bufp; uint8_t *bufp;
size_t len; size_t len;
@ -1443,39 +1457,39 @@ void test_nghttp2_hd_decode_length(void) {
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
len = encode_length(buf, UINT32_MAX, 7); len = encode_length(buf, UINT32_MAX, 7);
rv = nghttp2_hd_decode_length(&out, &shift, &final, 0, 0, buf, buf + len, 7); rv = nghttp2_hd_decode_length(&out, &shift, &fin, 0, 0, buf, buf + len, 7);
CU_ASSERT((ssize_t)len == rv); CU_ASSERT((ssize_t)len == rv);
CU_ASSERT(0 != final); CU_ASSERT(0 != fin);
CU_ASSERT(UINT32_MAX == out); CU_ASSERT(UINT32_MAX == out);
/* Make sure that we can decode integer if we feed 1 byte at a /* Make sure that we can decode integer if we feed 1 byte at a
time */ time */
out = 0; out = 0;
shift = 0; shift = 0;
final = 0; fin = 0;
bufp = buf; bufp = buf;
for (i = 0; i < len; ++i, ++bufp) { for (i = 0; i < len; ++i, ++bufp) {
rv = nghttp2_hd_decode_length(&out, &shift, &final, out, shift, bufp, rv = nghttp2_hd_decode_length(&out, &shift, &fin, out, shift, bufp,
bufp + 1, 7); bufp + 1, 7);
CU_ASSERT(rv == 1); CU_ASSERT(rv == 1);
if (final) { if (fin) {
break; break;
} }
} }
CU_ASSERT(i == len - 1); CU_ASSERT(i == len - 1);
CU_ASSERT(0 != final); CU_ASSERT(0 != fin);
CU_ASSERT(UINT32_MAX == out); CU_ASSERT(UINT32_MAX == out);
/* Check overflow case */ /* Check overflow case */
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
len = encode_length(buf, 1ll << 32, 7); len = encode_length(buf, 1ll << 32, 7);
rv = nghttp2_hd_decode_length(&out, &shift, &final, 0, 0, buf, buf + len, 7); rv = nghttp2_hd_decode_length(&out, &shift, &fin, 0, 0, buf, buf + len, 7);
CU_ASSERT(-1 == rv); CU_ASSERT(-1 == rv);
} }

View File

@ -10220,9 +10220,9 @@ void test_nghttp2_http_mandatory_headers(void) {
MAKE_NV(":authority", "localhost"), MAKE_NV(":path", "/"), MAKE_NV(":authority", "localhost"), MAKE_NV(":path", "/"),
MAKE_NV("content-length", "-1")}; MAKE_NV("content-length", "-1")};
const nghttp2_nv dupcl_reqnv[] = { const nghttp2_nv dupcl_reqnv[] = {
MAKE_NV(":scheme", "https"), MAKE_NV(":method", "POST"), MAKE_NV(":scheme", "https"), MAKE_NV(":method", "POST"),
MAKE_NV(":authority", "localhost"), MAKE_NV(":path", "/"), MAKE_NV(":authority", "localhost"), MAKE_NV(":path", "/"),
MAKE_NV("content-length", "0"), MAKE_NV("content-length", "0")}; MAKE_NV("content-length", "0"), MAKE_NV("content-length", "0")};
const nghttp2_nv badhd_reqnv[] = { const nghttp2_nv badhd_reqnv[] = {
MAKE_NV(":scheme", "https"), MAKE_NV(":method", "GET"), MAKE_NV(":scheme", "https"), MAKE_NV(":method", "GET"),
MAKE_NV(":authority", "localhost"), MAKE_NV(":path", "/"), MAKE_NV(":authority", "localhost"), MAKE_NV(":path", "/"),
@ -10807,9 +10807,12 @@ void test_nghttp2_http_ignore_regular_header(void) {
ssize_t rv; ssize_t rv;
my_user_data ud; my_user_data ud;
const nghttp2_nv bad_reqnv[] = { const nghttp2_nv bad_reqnv[] = {
MAKE_NV(":authority", "localhost"), MAKE_NV(":scheme", "https"), MAKE_NV(":authority", "localhost"),
MAKE_NV(":path", "/"), MAKE_NV(":method", "GET"), MAKE_NV(":scheme", "https"),
MAKE_NV("foo", "\x0zzz"), MAKE_NV("bar", "buzz"), MAKE_NV(":path", "/"),
MAKE_NV(":method", "GET"),
MAKE_NV("foo", "\x0zzz"),
MAKE_NV("bar", "buzz"),
}; };
const nghttp2_nv bad_ansnv[] = { const nghttp2_nv bad_ansnv[] = {
MAKE_NV(":authority", "localhost"), MAKE_NV(":scheme", "https"), MAKE_NV(":authority", "localhost"), MAKE_NV(":scheme", "https"),

View File

@ -158,14 +158,14 @@ ssize_t inflate_hd(nghttp2_hd_inflater *inflater, nva_out *out,
nghttp2_buf_chain *ci; nghttp2_buf_chain *ci;
nghttp2_buf *buf; nghttp2_buf *buf;
nghttp2_buf bp; nghttp2_buf bp;
int final; int fin;
size_t processed; size_t processed;
processed = 0; processed = 0;
for (ci = bufs->head; ci; ci = ci->next) { for (ci = bufs->head; ci; ci = ci->next) {
buf = &ci->buf; buf = &ci->buf;
final = nghttp2_buf_len(buf) == 0 || ci->next == NULL; fin = nghttp2_buf_len(buf) == 0 || ci->next == NULL;
bp = *buf; bp = *buf;
if (offset) { if (offset) {
@ -179,7 +179,7 @@ ssize_t inflate_hd(nghttp2_hd_inflater *inflater, nva_out *out,
for (;;) { for (;;) {
inflate_flags = 0; inflate_flags = 0;
rv = nghttp2_hd_inflate_hd2(inflater, &nv, &inflate_flags, bp.pos, rv = nghttp2_hd_inflate_hd2(inflater, &nv, &inflate_flags, bp.pos,
nghttp2_buf_len(&bp), final); nghttp2_buf_len(&bp), fin);
if (rv < 0) { if (rv < 0) {
return rv; return rv;