#174 在 http2 解析 header 时,修改 headerlength 的获取方式
* 原来是使用 strlen(header) 获取 headerlength * 现在改为使用 http2 callback 传入的 headerlength 暗示着 header 字段可能不以 '\0' 结尾
This commit is contained in:
@@ -52,7 +52,7 @@ str_to_val(const char *val, const struct value_string *vs);
|
|||||||
const char*
|
const char*
|
||||||
http2_header_val_to_str(unsigned int val, const char * map[], unsigned int map_size);
|
http2_header_val_to_str(unsigned int val, const char * map[], unsigned int map_size);
|
||||||
int
|
int
|
||||||
http2_header_str_to_val(const char *str, const char * map[], unsigned int map_size);
|
http2_header_str_to_val(const char *str, size_t slen, const char * map[], unsigned int map_size);
|
||||||
|
|
||||||
#define BV(x) (1 << x)
|
#define BV(x) (1 << x)
|
||||||
#define HTTP2_CONTENT_ENCODING_NONE 0
|
#define HTTP2_CONTENT_ENCODING_NONE 0
|
||||||
|
|||||||
@@ -36,11 +36,13 @@ Http2Plugin *http2_plugin()
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
http2_header_str_to_val(const char *str, const char * map[], unsigned int map_size)
|
http2_header_str_to_val(const char *str, size_t slen, const char * map[], unsigned int map_size)
|
||||||
{
|
{
|
||||||
|
size_t normlen = 0;
|
||||||
for (unsigned int i = 2; i < map_size; i++)
|
for (unsigned int i = 2; i < map_size; i++)
|
||||||
{
|
{
|
||||||
if ( (strlen(str) == strlen(map[i])) && !strncasecmp(str, map[i], strlen(map[i])))
|
normlen = strlen(map[i]);
|
||||||
|
if ( (slen == normlen) && !strncasecmp(str, map[i], normlen))
|
||||||
{
|
{
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@@ -48,7 +50,8 @@ http2_header_str_to_val(const char *str, const char * map[], unsigned int map_si
|
|||||||
|
|
||||||
// in http [TFE_HTTP_UNKNOWN_FIELD] = NULL; [TFE_HTTP_HOST] = "Host",
|
// in http [TFE_HTTP_UNKNOWN_FIELD] = NULL; [TFE_HTTP_HOST] = "Host",
|
||||||
// in http2 [TFE_HTTP_UNKNOWN_FIELD] = "unknown"; [TFE_HTTP_HOST] = ":authority"
|
// in http2 [TFE_HTTP_UNKNOWN_FIELD] = "unknown"; [TFE_HTTP_HOST] = ":authority"
|
||||||
if ( (strlen(str) == strlen(":authority")) && !strncasecmp(str, ":authority", strlen(":authority")))
|
normlen = strlen(":authority");
|
||||||
|
if ( (slen == normlen) && !strncasecmp(str, ":authority", normlen))
|
||||||
{
|
{
|
||||||
return TFE_HTTP_HOST;
|
return TFE_HTTP_HOST;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1872,7 +1872,8 @@ nghttp2_fill_up_header(nghttp2_session *ngh2_session, const nghttp2_frame *frame
|
|||||||
struct tfe_h2_half_private *half = (dir == CONN_DIR_UPSTREAM) ? h2_session->resp : h2_session->req;
|
struct tfe_h2_half_private *half = (dir == CONN_DIR_UPSTREAM) ? h2_session->resp : h2_session->req;
|
||||||
|
|
||||||
struct http_field_name field;
|
struct http_field_name field;
|
||||||
field.field_id = (enum tfe_http_std_field)http2_header_str_to_val((const char *)name, __str_std_header_field_map, __str_std_header_field_map_size);
|
// "name" may not terminated with '\0', so use "namelen"
|
||||||
|
field.field_id = (enum tfe_http_std_field)http2_header_str_to_val((const char *)name, namelen, __str_std_header_field_map, __str_std_header_field_map_size);
|
||||||
if (field.field_id == TFE_HTTP_UNKNOWN_FIELD)
|
if (field.field_id == TFE_HTTP_UNKNOWN_FIELD)
|
||||||
{
|
{
|
||||||
field.field_name = (const char *)name;
|
field.field_name = (const char *)name;
|
||||||
@@ -1906,7 +1907,8 @@ nghttp2_fill_up_promise(nghttp2_session *ngh2_session, const nghttp2_frame *fram
|
|||||||
}
|
}
|
||||||
resp = h2_session->resp;
|
resp = h2_session->resp;
|
||||||
struct http_field_name field;
|
struct http_field_name field;
|
||||||
field.field_id = (enum tfe_http_std_field)http2_header_str_to_val((const char *)name, __str_std_header_field_map, __str_std_header_field_map_size);
|
// "name" may not terminated with '\0', so use "namelen"
|
||||||
|
field.field_id = (enum tfe_http_std_field)http2_header_str_to_val((const char *)name, namelen, __str_std_header_field_map, __str_std_header_field_map_size);
|
||||||
if (field.field_id == TFE_HTTP_UNKNOWN_FIELD)
|
if (field.field_id == TFE_HTTP_UNKNOWN_FIELD)
|
||||||
{
|
{
|
||||||
field.field_name = (const char *)name;
|
field.field_name = (const char *)name;
|
||||||
|
|||||||
Reference in New Issue
Block a user