Add nghttp2_check_header_name and nghttp2_check_header_value APIs
These are promoted to public API from src/http2.h
This commit is contained in:
parent
08ff95d402
commit
8be17f077a
|
@ -2310,6 +2310,30 @@ nghttp2_info *nghttp2_version(int least_version);
|
||||||
*/
|
*/
|
||||||
int nghttp2_is_fatal(int lib_error);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -216,3 +216,169 @@ void nghttp2_free(void *ptr)
|
||||||
{
|
{
|
||||||
free(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;
|
||||||
|
}
|
||||||
|
|
187
src/http2.cc
187
src/http2.cc
|
@ -535,196 +535,13 @@ std::string rewrite_location_uri(const std::string& uri,
|
||||||
return res;
|
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,
|
int check_nv(const uint8_t *name, size_t namelen,
|
||||||
const uint8_t *value, size_t valuelen)
|
const uint8_t *value, size_t valuelen)
|
||||||
{
|
{
|
||||||
if(!check_header_name(name, namelen)) {
|
if(!nghttp2_check_header_name(name, namelen)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(!check_header_value(value, valuelen)) {
|
if(!nghttp2_check_header_value(value, valuelen)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
24
src/http2.h
24
src/http2.h
|
@ -197,27 +197,9 @@ std::string rewrite_location_uri(const std::string& uri,
|
||||||
const std::string& upstream_scheme,
|
const std::string& upstream_scheme,
|
||||||
uint16_t upstream_port);
|
uint16_t upstream_port);
|
||||||
|
|
||||||
|
// Checks the header name/value pair using nghttp2_check_header_name()
|
||||||
// Checks the header name in |name| with |len| bytes is well-formed.
|
// and nghttp2_check_header_value(). If both function returns nonzero,
|
||||||
//
|
// this function returns nonzero.
|
||||||
// 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.
|
|
||||||
int check_nv(const uint8_t *name, size_t namelen,
|
int check_nv(const uint8_t *name, size_t namelen,
|
||||||
const uint8_t *value, size_t valuelen);
|
const uint8_t *value, size_t valuelen);
|
||||||
|
|
||||||
|
|
|
@ -297,52 +297,4 @@ void test_http2_rewrite_location_uri(void)
|
||||||
"localhost", "https", 3000);
|
"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
|
} // namespace shrpx
|
||||||
|
|
|
@ -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_build_http1_headers_from_norm_headers(void);
|
||||||
void test_http2_lws(void);
|
void test_http2_lws(void);
|
||||||
void test_http2_rewrite_location_uri(void);
|
void test_http2_rewrite_location_uri(void);
|
||||||
void test_http2_check_header_name(void);
|
|
||||||
void test_http2_check_header_value(void);
|
|
||||||
|
|
||||||
} // namespace shrpx
|
} // namespace shrpx
|
||||||
|
|
||||||
|
|
|
@ -91,10 +91,6 @@ int main(int argc, char* argv[])
|
||||||
shrpx::test_http2_lws) ||
|
shrpx::test_http2_lws) ||
|
||||||
!CU_add_test(pSuite, "http2_rewrite_location_uri",
|
!CU_add_test(pSuite, "http2_rewrite_location_uri",
|
||||||
shrpx::test_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",
|
!CU_add_test(pSuite, "downstream_normalize_request_headers",
|
||||||
shrpx::test_downstream_normalize_request_headers) ||
|
shrpx::test_downstream_normalize_request_headers) ||
|
||||||
!CU_add_test(pSuite, "downstream_normalize_response_headers",
|
!CU_add_test(pSuite, "downstream_normalize_response_headers",
|
||||||
|
|
|
@ -247,7 +247,11 @@ int main(int argc, char* argv[])
|
||||||
test_nghttp2_hd_deflate_inflate) ||
|
test_nghttp2_hd_deflate_inflate) ||
|
||||||
!CU_add_test(pSuite, "gzip_inflate", test_nghttp2_gzip_inflate) ||
|
!CU_add_test(pSuite, "gzip_inflate", test_nghttp2_gzip_inflate) ||
|
||||||
!CU_add_test(pSuite, "adjust_local_window_size",
|
!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();
|
CU_cleanup_registry();
|
||||||
return CU_get_error();
|
return CU_get_error();
|
||||||
|
|
|
@ -152,3 +152,32 @@ void test_nghttp2_adjust_local_window_size(void)
|
||||||
CU_ASSERT(0 == recv_reduction);
|
CU_ASSERT(0 == recv_reduction);
|
||||||
CU_ASSERT(INT32_MIN == delta);
|
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));
|
||||||
|
}
|
||||||
|
|
|
@ -26,5 +26,7 @@
|
||||||
#define NGHTTP2_HELPER_TEST_H
|
#define NGHTTP2_HELPER_TEST_H
|
||||||
|
|
||||||
void test_nghttp2_adjust_local_window_size(void);
|
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 */
|
#endif /* NGHTTP2_HELPER_TEST_H */
|
||||||
|
|
Loading…
Reference in New Issue