Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
N
nghttp2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
nghttp2
Commits
8be17f07
Commit
8be17f07
authored
Feb 01, 2014
by
Tatsuhiro Tsujikawa
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add nghttp2_check_header_name and nghttp2_check_header_value APIs
These are promoted to public API from src/http2.h
parent
08ff95d4
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
231 additions
and
261 deletions
+231
-261
lib/includes/nghttp2/nghttp2.h
lib/includes/nghttp2/nghttp2.h
+24
-0
lib/nghttp2_helper.c
lib/nghttp2_helper.c
+166
-0
src/http2.cc
src/http2.cc
+2
-185
src/http2.h
src/http2.h
+3
-21
src/http2_test.cc
src/http2_test.cc
+0
-48
src/http2_test.h
src/http2_test.h
+0
-2
src/shrpx-unittest.cc
src/shrpx-unittest.cc
+0
-4
tests/main.c
tests/main.c
+5
-1
tests/nghttp2_helper_test.c
tests/nghttp2_helper_test.c
+29
-0
tests/nghttp2_helper_test.h
tests/nghttp2_helper_test.h
+2
-0
No files found.
lib/includes/nghttp2/nghttp2.h
View file @
8be17f07
...
...
@@ -2310,6 +2310,30 @@ nghttp2_info *nghttp2_version(int least_version);
*/
int
nghttp2_is_fatal
(
int
lib_error
);
/**
* @function
*
* Returns nonzero if HTTP header field name |name| of length |len| is
* valid according to
* http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-25#section-3.2
*
* Because this is a header field name in HTTP2, the upper cased alphabet
* is treated as error.
*/
int
nghttp2_check_header_name
(
const
uint8_t
*
name
,
size_t
len
);
/**
* @function
*
* Returns nonzero if HTTP header field value |value| of length |len|
* is valid according to
* http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-25#section-3.2
*
* Because this is HTTP2 header field value, it can contain NULL
* character (0x00).
*/
int
nghttp2_check_header_value
(
const
uint8_t
*
value
,
size_t
len
);
#ifdef __cplusplus
}
#endif
...
...
lib/nghttp2_helper.c
View file @
8be17f07
...
...
@@ -216,3 +216,169 @@ void nghttp2_free(void *ptr)
{
free
(
ptr
);
}
static
int
VALID_HD_NAME_CHARS
[]
=
{
0
/* NUL */
,
0
/* SOH */
,
0
/* STX */
,
0
/* ETX */
,
0
/* EOT */
,
0
/* ENQ */
,
0
/* ACK */
,
0
/* BEL */
,
0
/* BS */
,
0
/* HT */
,
0
/* LF */
,
0
/* VT */
,
0
/* FF */
,
0
/* CR */
,
0
/* SO */
,
0
/* SI */
,
0
/* DLE */
,
0
/* DC1 */
,
0
/* DC2 */
,
0
/* DC3 */
,
0
/* DC4 */
,
0
/* NAK */
,
0
/* SYN */
,
0
/* ETB */
,
0
/* CAN */
,
0
/* EM */
,
0
/* SUB */
,
0
/* ESC */
,
0
/* FS */
,
0
/* GS */
,
0
/* RS */
,
0
/* US */
,
0
/* SPC */
,
1
/* ! */
,
0
/* " */
,
1
/* # */
,
1
/* $ */
,
1
/* % */
,
1
/* & */
,
1
/* ' */
,
0
/* ( */
,
0
/* ) */
,
1
/* * */
,
1
/* + */
,
0
/* , */
,
1
/* - */
,
1
/* . */
,
0
/* / */
,
1
/* 0 */
,
1
/* 1 */
,
1
/* 2 */
,
1
/* 3 */
,
1
/* 4 */
,
1
/* 5 */
,
1
/* 6 */
,
1
/* 7 */
,
1
/* 8 */
,
1
/* 9 */
,
0
/* : */
,
0
/* ; */
,
0
/* < */
,
0
/* = */
,
0
/* > */
,
0
/* ? */
,
0
/* @ */
,
0
/* A */
,
0
/* B */
,
0
/* C */
,
0
/* D */
,
0
/* E */
,
0
/* F */
,
0
/* G */
,
0
/* H */
,
0
/* I */
,
0
/* J */
,
0
/* K */
,
0
/* L */
,
0
/* M */
,
0
/* N */
,
0
/* O */
,
0
/* P */
,
0
/* Q */
,
0
/* R */
,
0
/* S */
,
0
/* T */
,
0
/* U */
,
0
/* V */
,
0
/* W */
,
0
/* X */
,
0
/* Y */
,
0
/* Z */
,
0
/* [ */
,
0
/* \ */
,
0
/* ] */
,
1
/* ^ */
,
1
/* _ */
,
1
/* ` */
,
1
/* a */
,
1
/* b */
,
1
/* c */
,
1
/* d */
,
1
/* e */
,
1
/* f */
,
1
/* g */
,
1
/* h */
,
1
/* i */
,
1
/* j */
,
1
/* k */
,
1
/* l */
,
1
/* m */
,
1
/* n */
,
1
/* o */
,
1
/* p */
,
1
/* q */
,
1
/* r */
,
1
/* s */
,
1
/* t */
,
1
/* u */
,
1
/* v */
,
1
/* w */
,
1
/* x */
,
1
/* y */
,
1
/* z */
,
0
/* { */
,
1
/* | */
,
0
/* } */
,
1
/* ~ */
,
0
/* DEL */
,
0
/* 0x80 */
,
0
/* 0x81 */
,
0
/* 0x82 */
,
0
/* 0x83 */
,
0
/* 0x84 */
,
0
/* 0x85 */
,
0
/* 0x86 */
,
0
/* 0x87 */
,
0
/* 0x88 */
,
0
/* 0x89 */
,
0
/* 0x8a */
,
0
/* 0x8b */
,
0
/* 0x8c */
,
0
/* 0x8d */
,
0
/* 0x8e */
,
0
/* 0x8f */
,
0
/* 0x90 */
,
0
/* 0x91 */
,
0
/* 0x92 */
,
0
/* 0x93 */
,
0
/* 0x94 */
,
0
/* 0x95 */
,
0
/* 0x96 */
,
0
/* 0x97 */
,
0
/* 0x98 */
,
0
/* 0x99 */
,
0
/* 0x9a */
,
0
/* 0x9b */
,
0
/* 0x9c */
,
0
/* 0x9d */
,
0
/* 0x9e */
,
0
/* 0x9f */
,
0
/* 0xa0 */
,
0
/* 0xa1 */
,
0
/* 0xa2 */
,
0
/* 0xa3 */
,
0
/* 0xa4 */
,
0
/* 0xa5 */
,
0
/* 0xa6 */
,
0
/* 0xa7 */
,
0
/* 0xa8 */
,
0
/* 0xa9 */
,
0
/* 0xaa */
,
0
/* 0xab */
,
0
/* 0xac */
,
0
/* 0xad */
,
0
/* 0xae */
,
0
/* 0xaf */
,
0
/* 0xb0 */
,
0
/* 0xb1 */
,
0
/* 0xb2 */
,
0
/* 0xb3 */
,
0
/* 0xb4 */
,
0
/* 0xb5 */
,
0
/* 0xb6 */
,
0
/* 0xb7 */
,
0
/* 0xb8 */
,
0
/* 0xb9 */
,
0
/* 0xba */
,
0
/* 0xbb */
,
0
/* 0xbc */
,
0
/* 0xbd */
,
0
/* 0xbe */
,
0
/* 0xbf */
,
0
/* 0xc0 */
,
0
/* 0xc1 */
,
0
/* 0xc2 */
,
0
/* 0xc3 */
,
0
/* 0xc4 */
,
0
/* 0xc5 */
,
0
/* 0xc6 */
,
0
/* 0xc7 */
,
0
/* 0xc8 */
,
0
/* 0xc9 */
,
0
/* 0xca */
,
0
/* 0xcb */
,
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
)
{
const
uint8_t
*
last
;
if
(
len
==
0
)
{
return
0
;
}
if
(
*
name
==
':'
)
{
if
(
len
==
1
)
{
return
0
;
}
++
name
;
--
len
;
}
for
(
last
=
name
+
len
;
name
!=
last
;
++
name
)
{
if
(
!
VALID_HD_NAME_CHARS
[
*
name
])
{
return
0
;
}
}
return
1
;
}
static
int
VALID_HD_VALUE_CHARS
[]
=
{
1
/* NUL */
,
0
/* SOH */
,
0
/* STX */
,
0
/* ETX */
,
0
/* EOT */
,
0
/* ENQ */
,
0
/* ACK */
,
0
/* BEL */
,
0
/* BS */
,
1
/* HT */
,
0
/* LF */
,
0
/* VT */
,
0
/* FF */
,
0
/* CR */
,
0
/* SO */
,
0
/* SI */
,
0
/* DLE */
,
0
/* DC1 */
,
0
/* DC2 */
,
0
/* DC3 */
,
0
/* DC4 */
,
0
/* NAK */
,
0
/* SYN */
,
0
/* ETB */
,
0
/* CAN */
,
0
/* EM */
,
0
/* SUB */
,
0
/* ESC */
,
0
/* FS */
,
0
/* GS */
,
0
/* RS */
,
0
/* US */
,
1
/* SPC */
,
1
/* ! */
,
1
/* " */
,
1
/* # */
,
1
/* $ */
,
1
/* % */
,
1
/* & */
,
1
/* ' */
,
1
/* ( */
,
1
/* ) */
,
1
/* * */
,
1
/* + */
,
1
/* , */
,
1
/* - */
,
1
/* . */
,
1
/* / */
,
1
/* 0 */
,
1
/* 1 */
,
1
/* 2 */
,
1
/* 3 */
,
1
/* 4 */
,
1
/* 5 */
,
1
/* 6 */
,
1
/* 7 */
,
1
/* 8 */
,
1
/* 9 */
,
1
/* : */
,
1
/* ; */
,
1
/* < */
,
1
/* = */
,
1
/* > */
,
1
/* ? */
,
1
/* @ */
,
1
/* A */
,
1
/* B */
,
1
/* C */
,
1
/* D */
,
1
/* E */
,
1
/* F */
,
1
/* G */
,
1
/* H */
,
1
/* I */
,
1
/* J */
,
1
/* K */
,
1
/* L */
,
1
/* M */
,
1
/* N */
,
1
/* O */
,
1
/* P */
,
1
/* Q */
,
1
/* R */
,
1
/* S */
,
1
/* T */
,
1
/* U */
,
1
/* V */
,
1
/* W */
,
1
/* X */
,
1
/* Y */
,
1
/* Z */
,
1
/* [ */
,
1
/* \ */
,
1
/* ] */
,
1
/* ^ */
,
1
/* _ */
,
1
/* ` */
,
1
/* a */
,
1
/* b */
,
1
/* c */
,
1
/* d */
,
1
/* e */
,
1
/* f */
,
1
/* g */
,
1
/* h */
,
1
/* i */
,
1
/* j */
,
1
/* k */
,
1
/* l */
,
1
/* m */
,
1
/* n */
,
1
/* o */
,
1
/* p */
,
1
/* q */
,
1
/* r */
,
1
/* s */
,
1
/* t */
,
1
/* u */
,
1
/* v */
,
1
/* w */
,
1
/* x */
,
1
/* y */
,
1
/* z */
,
1
/* { */
,
1
/* | */
,
1
/* } */
,
1
/* ~ */
,
0
/* DEL */
,
1
/* 0x80 */
,
1
/* 0x81 */
,
1
/* 0x82 */
,
1
/* 0x83 */
,
1
/* 0x84 */
,
1
/* 0x85 */
,
1
/* 0x86 */
,
1
/* 0x87 */
,
1
/* 0x88 */
,
1
/* 0x89 */
,
1
/* 0x8a */
,
1
/* 0x8b */
,
1
/* 0x8c */
,
1
/* 0x8d */
,
1
/* 0x8e */
,
1
/* 0x8f */
,
1
/* 0x90 */
,
1
/* 0x91 */
,
1
/* 0x92 */
,
1
/* 0x93 */
,
1
/* 0x94 */
,
1
/* 0x95 */
,
1
/* 0x96 */
,
1
/* 0x97 */
,
1
/* 0x98 */
,
1
/* 0x99 */
,
1
/* 0x9a */
,
1
/* 0x9b */
,
1
/* 0x9c */
,
1
/* 0x9d */
,
1
/* 0x9e */
,
1
/* 0x9f */
,
1
/* 0xa0 */
,
1
/* 0xa1 */
,
1
/* 0xa2 */
,
1
/* 0xa3 */
,
1
/* 0xa4 */
,
1
/* 0xa5 */
,
1
/* 0xa6 */
,
1
/* 0xa7 */
,
1
/* 0xa8 */
,
1
/* 0xa9 */
,
1
/* 0xaa */
,
1
/* 0xab */
,
1
/* 0xac */
,
1
/* 0xad */
,
1
/* 0xae */
,
1
/* 0xaf */
,
1
/* 0xb0 */
,
1
/* 0xb1 */
,
1
/* 0xb2 */
,
1
/* 0xb3 */
,
1
/* 0xb4 */
,
1
/* 0xb5 */
,
1
/* 0xb6 */
,
1
/* 0xb7 */
,
1
/* 0xb8 */
,
1
/* 0xb9 */
,
1
/* 0xba */
,
1
/* 0xbb */
,
1
/* 0xbc */
,
1
/* 0xbd */
,
1
/* 0xbe */
,
1
/* 0xbf */
,
1
/* 0xc0 */
,
1
/* 0xc1 */
,
1
/* 0xc2 */
,
1
/* 0xc3 */
,
1
/* 0xc4 */
,
1
/* 0xc5 */
,
1
/* 0xc6 */
,
1
/* 0xc7 */
,
1
/* 0xc8 */
,
1
/* 0xc9 */
,
1
/* 0xca */
,
1
/* 0xcb */
,
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
)
{
const
uint8_t
*
last
;
for
(
last
=
value
+
len
;
value
!=
last
;
++
value
)
{
if
(
!
VALID_HD_VALUE_CHARS
[
*
value
])
{
return
0
;
}
}
return
1
;
}
src/http2.cc
View file @
8be17f07
...
...
@@ -535,196 +535,13 @@ std::string rewrite_location_uri(const std::string& uri,
return
res
;
}
namespace
{
int
VALID_HD_NAME_CHARS
[]
=
{
0
/* NUL */
,
0
/* SOH */
,
0
/* STX */
,
0
/* ETX */
,
0
/* EOT */
,
0
/* ENQ */
,
0
/* ACK */
,
0
/* BEL */
,
0
/* BS */
,
0
/* HT */
,
0
/* LF */
,
0
/* VT */
,
0
/* FF */
,
0
/* CR */
,
0
/* SO */
,
0
/* SI */
,
0
/* DLE */
,
0
/* DC1 */
,
0
/* DC2 */
,
0
/* DC3 */
,
0
/* DC4 */
,
0
/* NAK */
,
0
/* SYN */
,
0
/* ETB */
,
0
/* CAN */
,
0
/* EM */
,
0
/* SUB */
,
0
/* ESC */
,
0
/* FS */
,
0
/* GS */
,
0
/* RS */
,
0
/* US */
,
0
/* SPC */
,
1
/* ! */
,
0
/* " */
,
1
/* # */
,
1
/* $ */
,
1
/* % */
,
1
/* & */
,
1
/* ' */
,
0
/* ( */
,
0
/* ) */
,
1
/* * */
,
1
/* + */
,
0
/* , */
,
1
/* - */
,
1
/* . */
,
0
/* / */
,
1
/* 0 */
,
1
/* 1 */
,
1
/* 2 */
,
1
/* 3 */
,
1
/* 4 */
,
1
/* 5 */
,
1
/* 6 */
,
1
/* 7 */
,
1
/* 8 */
,
1
/* 9 */
,
0
/* : */
,
0
/* ; */
,
0
/* < */
,
0
/* = */
,
0
/* > */
,
0
/* ? */
,
0
/* @ */
,
0
/* A */
,
0
/* B */
,
0
/* C */
,
0
/* D */
,
0
/* E */
,
0
/* F */
,
0
/* G */
,
0
/* H */
,
0
/* I */
,
0
/* J */
,
0
/* K */
,
0
/* L */
,
0
/* M */
,
0
/* N */
,
0
/* O */
,
0
/* P */
,
0
/* Q */
,
0
/* R */
,
0
/* S */
,
0
/* T */
,
0
/* U */
,
0
/* V */
,
0
/* W */
,
0
/* X */
,
0
/* Y */
,
0
/* Z */
,
0
/* [ */
,
0
/* \ */
,
0
/* ] */
,
1
/* ^ */
,
1
/* _ */
,
1
/* ` */
,
1
/* a */
,
1
/* b */
,
1
/* c */
,
1
/* d */
,
1
/* e */
,
1
/* f */
,
1
/* g */
,
1
/* h */
,
1
/* i */
,
1
/* j */
,
1
/* k */
,
1
/* l */
,
1
/* m */
,
1
/* n */
,
1
/* o */
,
1
/* p */
,
1
/* q */
,
1
/* r */
,
1
/* s */
,
1
/* t */
,
1
/* u */
,
1
/* v */
,
1
/* w */
,
1
/* x */
,
1
/* y */
,
1
/* z */
,
0
/* { */
,
1
/* | */
,
0
/* } */
,
1
/* ~ */
,
0
/* DEL */
,
0
/* 0x80 */
,
0
/* 0x81 */
,
0
/* 0x82 */
,
0
/* 0x83 */
,
0
/* 0x84 */
,
0
/* 0x85 */
,
0
/* 0x86 */
,
0
/* 0x87 */
,
0
/* 0x88 */
,
0
/* 0x89 */
,
0
/* 0x8a */
,
0
/* 0x8b */
,
0
/* 0x8c */
,
0
/* 0x8d */
,
0
/* 0x8e */
,
0
/* 0x8f */
,
0
/* 0x90 */
,
0
/* 0x91 */
,
0
/* 0x92 */
,
0
/* 0x93 */
,
0
/* 0x94 */
,
0
/* 0x95 */
,
0
/* 0x96 */
,
0
/* 0x97 */
,
0
/* 0x98 */
,
0
/* 0x99 */
,
0
/* 0x9a */
,
0
/* 0x9b */
,
0
/* 0x9c */
,
0
/* 0x9d */
,
0
/* 0x9e */
,
0
/* 0x9f */
,
0
/* 0xa0 */
,
0
/* 0xa1 */
,
0
/* 0xa2 */
,
0
/* 0xa3 */
,
0
/* 0xa4 */
,
0
/* 0xa5 */
,
0
/* 0xa6 */
,
0
/* 0xa7 */
,
0
/* 0xa8 */
,
0
/* 0xa9 */
,
0
/* 0xaa */
,
0
/* 0xab */
,
0
/* 0xac */
,
0
/* 0xad */
,
0
/* 0xae */
,
0
/* 0xaf */
,
0
/* 0xb0 */
,
0
/* 0xb1 */
,
0
/* 0xb2 */
,
0
/* 0xb3 */
,
0
/* 0xb4 */
,
0
/* 0xb5 */
,
0
/* 0xb6 */
,
0
/* 0xb7 */
,
0
/* 0xb8 */
,
0
/* 0xb9 */
,
0
/* 0xba */
,
0
/* 0xbb */
,
0
/* 0xbc */
,
0
/* 0xbd */
,
0
/* 0xbe */
,
0
/* 0xbf */
,
0
/* 0xc0 */
,
0
/* 0xc1 */
,
0
/* 0xc2 */
,
0
/* 0xc3 */
,
0
/* 0xc4 */
,
0
/* 0xc5 */
,
0
/* 0xc6 */
,
0
/* 0xc7 */
,
0
/* 0xc8 */
,
0
/* 0xc9 */
,
0
/* 0xca */
,
0
/* 0xcb */
,
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 */
};
}
// namespace
namespace
{
int
check_header_name
(
const
uint8_t
*
name
,
size_t
len
,
int
nocase
)
{
const
uint8_t
*
last
;
if
(
len
==
0
)
{
return
0
;
}
if
(
*
name
==
':'
)
{
if
(
len
==
1
)
{
return
0
;
}
++
name
;
--
len
;
}
for
(
last
=
name
+
len
;
name
!=
last
;
++
name
)
{
if
(
nocase
&&
'A'
<=
*
name
&&
*
name
<=
'Z'
)
continue
;
if
(
!
VALID_HD_NAME_CHARS
[
*
name
])
{
return
0
;
}
}
return
1
;
}
}
// namespace
int
check_header_name
(
const
uint8_t
*
name
,
size_t
len
)
{
return
check_header_name
(
name
,
len
,
0
);
}
int
check_header_name_nocase
(
const
uint8_t
*
name
,
size_t
len
)
{
return
check_header_name
(
name
,
len
,
1
);
}
namespace
{
int
VALID_HD_VALUE_CHARS
[]
=
{
1
/* NUL */
,
0
/* SOH */
,
0
/* STX */
,
0
/* ETX */
,
0
/* EOT */
,
0
/* ENQ */
,
0
/* ACK */
,
0
/* BEL */
,
0
/* BS */
,
1
/* HT */
,
0
/* LF */
,
0
/* VT */
,
0
/* FF */
,
0
/* CR */
,
0
/* SO */
,
0
/* SI */
,
0
/* DLE */
,
0
/* DC1 */
,
0
/* DC2 */
,
0
/* DC3 */
,
0
/* DC4 */
,
0
/* NAK */
,
0
/* SYN */
,
0
/* ETB */
,
0
/* CAN */
,
0
/* EM */
,
0
/* SUB */
,
0
/* ESC */
,
0
/* FS */
,
0
/* GS */
,
0
/* RS */
,
0
/* US */
,
1
/* SPC */
,
1
/* ! */
,
1
/* " */
,
1
/* # */
,
1
/* $ */
,
1
/* % */
,
1
/* & */
,
1
/* ' */
,
1
/* ( */
,
1
/* ) */
,
1
/* * */
,
1
/* + */
,
1
/* , */
,
1
/* - */
,
1
/* . */
,
1
/* / */
,
1
/* 0 */
,
1
/* 1 */
,
1
/* 2 */
,
1
/* 3 */
,
1
/* 4 */
,
1
/* 5 */
,
1
/* 6 */
,
1
/* 7 */
,
1
/* 8 */
,
1
/* 9 */
,
1
/* : */
,
1
/* ; */
,
1
/* < */
,
1
/* = */
,
1
/* > */
,
1
/* ? */
,
1
/* @ */
,
1
/* A */
,
1
/* B */
,
1
/* C */
,
1
/* D */
,
1
/* E */
,
1
/* F */
,
1
/* G */
,
1
/* H */
,
1
/* I */
,
1
/* J */
,
1
/* K */
,
1
/* L */
,
1
/* M */
,
1
/* N */
,
1
/* O */
,
1
/* P */
,
1
/* Q */
,
1
/* R */
,
1
/* S */
,
1
/* T */
,
1
/* U */
,
1
/* V */
,
1
/* W */
,
1
/* X */
,
1
/* Y */
,
1
/* Z */
,
1
/* [ */
,
1
/* \ */
,
1
/* ] */
,
1
/* ^ */
,
1
/* _ */
,
1
/* ` */
,
1
/* a */
,
1
/* b */
,
1
/* c */
,
1
/* d */
,
1
/* e */
,
1
/* f */
,
1
/* g */
,
1
/* h */
,
1
/* i */
,
1
/* j */
,
1
/* k */
,
1
/* l */
,
1
/* m */
,
1
/* n */
,
1
/* o */
,
1
/* p */
,
1
/* q */
,
1
/* r */
,
1
/* s */
,
1
/* t */
,
1
/* u */
,
1
/* v */
,
1
/* w */
,
1
/* x */
,
1
/* y */
,
1
/* z */
,
1
/* { */
,
1
/* | */
,
1
/* } */
,
1
/* ~ */
,
0
/* DEL */
,
1
/* 0x80 */
,
1
/* 0x81 */
,
1
/* 0x82 */
,
1
/* 0x83 */
,
1
/* 0x84 */
,
1
/* 0x85 */
,
1
/* 0x86 */
,
1
/* 0x87 */
,
1
/* 0x88 */
,
1
/* 0x89 */
,
1
/* 0x8a */
,
1
/* 0x8b */
,
1
/* 0x8c */
,
1
/* 0x8d */
,
1
/* 0x8e */
,
1
/* 0x8f */
,
1
/* 0x90 */
,
1
/* 0x91 */
,
1
/* 0x92 */
,
1
/* 0x93 */
,
1
/* 0x94 */
,
1
/* 0x95 */
,
1
/* 0x96 */
,
1
/* 0x97 */
,
1
/* 0x98 */
,
1
/* 0x99 */
,
1
/* 0x9a */
,
1
/* 0x9b */
,
1
/* 0x9c */
,
1
/* 0x9d */
,
1
/* 0x9e */
,
1
/* 0x9f */
,
1
/* 0xa0 */
,
1
/* 0xa1 */
,
1
/* 0xa2 */
,
1
/* 0xa3 */
,
1
/* 0xa4 */
,
1
/* 0xa5 */
,
1
/* 0xa6 */
,
1
/* 0xa7 */
,
1
/* 0xa8 */
,
1
/* 0xa9 */
,
1
/* 0xaa */
,
1
/* 0xab */
,
1
/* 0xac */
,
1
/* 0xad */
,
1
/* 0xae */
,
1
/* 0xaf */
,
1
/* 0xb0 */
,
1
/* 0xb1 */
,
1
/* 0xb2 */
,
1
/* 0xb3 */
,
1
/* 0xb4 */
,
1
/* 0xb5 */
,
1
/* 0xb6 */
,
1
/* 0xb7 */
,
1
/* 0xb8 */
,
1
/* 0xb9 */
,
1
/* 0xba */
,
1
/* 0xbb */
,
1
/* 0xbc */
,
1
/* 0xbd */
,
1
/* 0xbe */
,
1
/* 0xbf */
,
1
/* 0xc0 */
,
1
/* 0xc1 */
,
1
/* 0xc2 */
,
1
/* 0xc3 */
,
1
/* 0xc4 */
,
1
/* 0xc5 */
,
1
/* 0xc6 */
,
1
/* 0xc7 */
,
1
/* 0xc8 */
,
1
/* 0xc9 */
,
1
/* 0xca */
,
1
/* 0xcb */
,
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 */
};
}
// namespace
int
check_header_value
(
const
uint8_t
*
value
,
size_t
len
)
{
const
uint8_t
*
last
;
for
(
last
=
value
+
len
;
value
!=
last
;
++
value
)
{
if
(
!
VALID_HD_VALUE_CHARS
[
*
value
])
{
return
0
;
}
}
return
1
;
}
int
check_nv
(
const
uint8_t
*
name
,
size_t
namelen
,
const
uint8_t
*
value
,
size_t
valuelen
)
{
if
(
!
check_header_name
(
name
,
namelen
))
{
if
(
!
nghttp2_
check_header_name
(
name
,
namelen
))
{
return
0
;
}
if
(
!
check_header_value
(
value
,
valuelen
))
{
if
(
!
nghttp2_
check_header_value
(
value
,
valuelen
))
{
return
0
;
}
return
1
;
...
...
src/http2.h
View file @
8be17f07
...
...
@@ -197,27 +197,9 @@ std::string rewrite_location_uri(const std::string& uri,
const
std
::
string
&
upstream_scheme
,
uint16_t
upstream_port
);
// Checks the header name in |name| with |len| bytes is well-formed.
//
// This function returns nonzero if it succeeds, or 0.
int
check_header_name
(
const
uint8_t
*
name
,
size_t
len
);
// Checks the header name in |name| with |len| bytes is
// well-formed. This function accepts also characters in [A-Z].
//
// This function returns nonzero if it succeeds, or 0.
int
check_header_name_nocase
(
const
uint8_t
*
name
,
size_t
len
);
// Checks the header value in |value| with |len| bytes is well-formed.
//
// This function returns nonzero if it succeeds, or 0.
int
check_header_value
(
const
uint8_t
*
value
,
size_t
len
);
// Checks the header name/value pair using check_header_name() and
// check_header_value(). If both function returns nonzero, this
// function returns nonzero.
// Checks the header name/value pair using nghttp2_check_header_name()
// and nghttp2_check_header_value(). If both function returns nonzero,
// this function returns nonzero.
int
check_nv
(
const
uint8_t
*
name
,
size_t
namelen
,
const
uint8_t
*
value
,
size_t
valuelen
);
...
...
src/http2_test.cc
View file @
8be17f07
...
...
@@ -297,52 +297,4 @@ void test_http2_rewrite_location_uri(void)
"localhost"
,
"https"
,
3000
);
}
namespace
{
int
check_header_name
(
const
char
*
s
)
{
return
http2
::
check_header_name
((
const
uint8_t
*
)
s
,
strlen
(
s
));
}
}
// namespace
namespace
{
int
check_header_name_nocase
(
const
char
*
s
)
{
return
http2
::
check_header_name_nocase
((
const
uint8_t
*
)
s
,
strlen
(
s
));
}
}
// namespace
void
test_http2_check_header_name
(
void
)
{
CU_ASSERT
(
check_header_name
(
":path"
));
CU_ASSERT
(
check_header_name
(
"path"
));
CU_ASSERT
(
check_header_name
(
"!#$%&'*+-.^_`|~"
));
CU_ASSERT
(
!
check_header_name
(
":PATH"
));
CU_ASSERT
(
!
check_header_name
(
"path:"
));
CU_ASSERT
(
!
check_header_name
(
""
));
CU_ASSERT
(
!
check_header_name
(
":"
));
CU_ASSERT
(
check_header_name_nocase
(
":path"
));
CU_ASSERT
(
check_header_name_nocase
(
"path"
));
CU_ASSERT
(
check_header_name_nocase
(
"!#$%&'*+-.^_`|~"
));
CU_ASSERT
(
check_header_name_nocase
(
":PATH"
));
CU_ASSERT
(
!
check_header_name_nocase
(
"path:"
));
CU_ASSERT
(
!
check_header_name_nocase
(
""
));
CU_ASSERT
(
!
check_header_name_nocase
(
":"
));
}
#define check_header_value(S) \
http2::check_header_value((const uint8_t*)S, sizeof(S) - 1)
void
test_http2_check_header_value
(
void
)
{
uint8_t
goodval
[]
=
{
'a'
,
'\0'
,
'b'
,
0x80u
,
'c'
,
0xffu
,
'd'
,
'\t'
,
' '
};
uint8_t
badval1
[]
=
{
'a'
,
0x1fu
,
'b'
};
uint8_t
badval2
[]
=
{
'a'
,
0x7fu
,
'b'
};
CU_ASSERT
(
check_header_value
(
" !|}~"
));
CU_ASSERT
(
check_header_value
(
goodval
));
CU_ASSERT
(
!
check_header_value
(
badval1
));
CU_ASSERT
(
!
check_header_value
(
badval2
));
}
}
// namespace shrpx
src/http2_test.h
View file @
8be17f07
...
...
@@ -38,8 +38,6 @@ void test_http2_copy_norm_headers_to_nva(void);
void
test_http2_build_http1_headers_from_norm_headers
(
void
);
void
test_http2_lws
(
void
);
void
test_http2_rewrite_location_uri
(
void
);
void
test_http2_check_header_name
(
void
);
void
test_http2_check_header_value
(
void
);
}
// namespace shrpx
...
...
src/shrpx-unittest.cc
View file @
8be17f07
...
...
@@ -91,10 +91,6 @@ int main(int argc, char* argv[])
shrpx
::
test_http2_lws
)
||
!
CU_add_test
(
pSuite
,
"http2_rewrite_location_uri"
,
shrpx
::
test_http2_rewrite_location_uri
)
||
!
CU_add_test
(
pSuite
,
"http2_check_header_name"
,
shrpx
::
test_http2_check_header_name
)
||
!
CU_add_test
(
pSuite
,
"http2_check_header_value"
,
shrpx
::
test_http2_check_header_value
)
||
!
CU_add_test
(
pSuite
,
"downstream_normalize_request_headers"
,
shrpx
::
test_downstream_normalize_request_headers
)
||
!
CU_add_test
(
pSuite
,
"downstream_normalize_response_headers"
,
...
...
tests/main.c
View file @
8be17f07
...
...
@@ -247,7 +247,11 @@ int main(int argc, char* argv[])
test_nghttp2_hd_deflate_inflate
)
||
!
CU_add_test
(
pSuite
,
"gzip_inflate"
,
test_nghttp2_gzip_inflate
)
||
!
CU_add_test
(
pSuite
,
"adjust_local_window_size"
,
test_nghttp2_adjust_local_window_size
)
test_nghttp2_adjust_local_window_size
)
||
!
CU_add_test
(
pSuite
,
"check_header_name"
,
test_nghttp2_check_header_name
)
||
!
CU_add_test
(
pSuite
,
"check_header_value"
,
test_nghttp2_check_header_value
)
)
{
CU_cleanup_registry
();
return
CU_get_error
();
...
...
tests/nghttp2_helper_test.c
View file @
8be17f07
...
...
@@ -152,3 +152,32 @@ void test_nghttp2_adjust_local_window_size(void)
CU_ASSERT
(
0
==
recv_reduction
);
CU_ASSERT
(
INT32_MIN
==
delta
);
}
#define check_header_name(S) \
nghttp2_check_header_name((const uint8_t*)S, sizeof(S) - 1)
void
test_nghttp2_check_header_name
(
void
)
{
CU_ASSERT
(
check_header_name
(
":path"
));
CU_ASSERT
(
check_header_name
(
"path"
));
CU_ASSERT
(
check_header_name
(
"!#$%&'*+-.^_`|~"
));
CU_ASSERT
(
!
check_header_name
(
":PATH"
));
CU_ASSERT
(
!
check_header_name
(
"path:"
));
CU_ASSERT
(
!
check_header_name
(
""
));
CU_ASSERT
(
!
check_header_name
(
":"
));
}
#define check_header_value(S) \
nghttp2_check_header_value((const uint8_t*)S, sizeof(S) - 1)
void
test_nghttp2_check_header_value
(
void
)
{
uint8_t
goodval
[]
=
{
'a'
,
'\0'
,
'b'
,
0x80u
,
'c'
,
0xffu
,
'd'
,
'\t'
,
' '
};
uint8_t
badval1
[]
=
{
'a'
,
0x1fu
,
'b'
};
uint8_t
badval2
[]
=
{
'a'
,
0x7fu
,
'b'
};
CU_ASSERT
(
check_header_value
(
" !|}~"
));
CU_ASSERT
(
check_header_value
(
goodval
));
CU_ASSERT
(
!
check_header_value
(
badval1
));
CU_ASSERT
(
!
check_header_value
(
badval2
));
}
tests/nghttp2_helper_test.h
View file @
8be17f07
...
...
@@ -26,5 +26,7 @@
#define NGHTTP2_HELPER_TEST_H
void
test_nghttp2_adjust_local_window_size
(
void
);
void
test_nghttp2_check_header_name
(
void
);
void
test_nghttp2_check_header_value
(
void
);
#endif
/* NGHTTP2_HELPER_TEST_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment