整理 http/http2 公共的 header 字段,存储到 tfe_http.cpp 文件中

This commit is contained in:
luwenpeng
2019-09-16 11:37:18 +08:00
parent 4b0235d199
commit de16d2da87
6 changed files with 65 additions and 84 deletions

View File

@@ -49,6 +49,11 @@ val_to_str(unsigned int val, const struct value_string *vs);
int
str_to_val(const char *val, const struct value_string *vs);
const char*
http2_header_val_to_str(unsigned int val, const char * map[], unsigned int map_size);
int
http2_header_str_to_val(const char *str, const char * map[], unsigned int map_size);
#define BV(x) (1 << x)
#define HTTP2_CONTENT_ENCODING_NONE 0
#define HTTP2_CONTENT_ENCODING_GZIP BV(1)

View File

@@ -35,6 +35,50 @@ Http2Plugin *http2_plugin()
return &g_http2_plugin;
}
int
http2_header_str_to_val(const char *str, const char * map[], unsigned int map_size)
{
for (unsigned int i = 0; i < map_size; i++)
{
if (!strncasecmp(str, map[i], strlen(map[i])))
{
return i;
}
}
// in http [TFE_HTTP_UNKNOWN_FIELD] = NULL; [TFE_HTTP_HOST] = "Host",
// in http2 [TFE_HTTP_UNKNOWN_FIELD] = "unknown"; [TFE_HTTP_HOST] = ":authority"
if (!strncasecmp(str, ":authority", strlen(":authority")))
{
return TFE_HTTP_HOST;
} else {
return TFE_HTTP_UNKNOWN_FIELD;
}
}
const char*
http2_header_val_to_str(unsigned int val, const char * map[], unsigned int map_size)
{
const static char * host = ":authority";
const static char * unknown = "unknown";
if (val < map_size && val != TFE_HTTP_HOST && val != TFE_HTTP_UNKNOWN_FIELD)
{
return map[val];
}
// in http [TFE_HTTP_UNKNOWN_FIELD] = NULL; [TFE_HTTP_HOST] = "Host",
// in http2 [TFE_HTTP_UNKNOWN_FIELD] = "unknown"; [TFE_HTTP_HOST] = ":authority"
if (val == TFE_HTTP_HOST)
{
return host;
}
else
{
return unknown;
}
}
const char *
try_val_to_str_idx(const unsigned int val, const struct value_string *vs, int *idx)
{

View File

@@ -51,42 +51,6 @@ static const struct value_string method_vals[] =
{NGHTTP2_METHOD_UNKNOWN, "unknown"},
};
static const struct value_string header_vals[] =
{
{TFE_HTTP_UNKNOWN_FIELD, "unkown"},
{TFE_HTTP_HOST, ":authority"},
{TFE_HTTP_REFERER, "referer"},
{TFE_HTTP_USER_AGENT, "user-agent"},
{TFE_HTTP_COOKIE, "cookie"},
{TFE_HTTP_SET_COOKIE, "set-cookie"},
{TFE_HTTP_PROXY_AUTHORIZATION, "proxy-authorization"},
{TFE_HTTP_AUTHORIZATION, "authorization"},
{TFE_HTTP_LOCATION, "location"},
{TFE_HTTP_SERVER, "server"},
{TFE_HTTP_ETAG, "etag"},
{TFE_HTTP_DATE, "date"},
{TFE_HTTP_TRAILER, "Trailer"},
{TFE_HTTP_TRANSFER_ENCODING, "transfer-encoding"},
{TFE_HTTP_VIA, "via"},
{TFE_HTTP_PRAGMA, "pragma"},
{TFE_HTTP_CONNECTION, "connection"},
{TFE_HTTP_CONT_ENCODING, "content-encoding"},
{TFE_HTTP_CONT_LANGUAGE, "content-language"},
{TFE_HTTP_CONT_LOCATION, "content-location"},
{TFE_HTTP_CONT_RANGE, "content-range"},
{TFE_HTTP_CONT_LENGTH, "content-length"},
{TFE_HTTP_CONT_TYPE, "content-type"},
{TFE_HTTP_CONT_DISPOSITION, "content-disposition"},
{TFE_HTTP_EXPIRES, "expires"},
{TFE_HTTP_ACCEPT_ENCODING, "accept-encoding"},
{TFE_HTTP_CACHE_CONTROL, "cache-control"},
{TFE_HTTP_IF_MATCH, "if-match"},
{TFE_HTTP_IF_NONE_MATCH, "if-none-match"},
{TFE_HTTP_IF_MODIFIED_SINCE, "if-modified-since"},
{TFE_HTTP_IF_UNMODIFIED_SINCE, "if-unmodified-since"},
{TFE_HTTP_LAST_MODIFIED, "last-modified"},
};
typedef enum {
NGHTTP2_USER_SEND = 0x0b,
NGHTTP2_USER_COLSE = 0x0c,
@@ -125,7 +89,7 @@ tfe_h2_header_add_field(struct tfe_h2_header *h2_header, const struct http_field
peer_h2_field->nv.namelen = strlen(peer_h2_field->field->field_name);
}else
{
const char *std_name = val_to_str(field->field_id, header_vals);
const char *std_name = http2_header_val_to_str(field->field_id, __str_std_header_field_map, __str_std_header_field_map_size);
peer_h2_field->nv.name = (uint8_t *)tfe_strdup((const char *)std_name);
peer_h2_field->nv.namelen = strlen(std_name);
}
@@ -1498,19 +1462,19 @@ fill_resp_spec_from_handle(struct tfe_h2_half_private *half_private)
struct tfe_http_resp_spec *resp_spec = &(half_private->half_public.resp_spec);
TAILQ_FOREACH_SAFE(h2_field, &header->h2_field_list, next, peer_h2_field){
if (!strncmp((char *)(h2_field->nv.name), ":status", strlen(":status"))){
if (!strncasecmp((char *)(h2_field->nv.name), ":status", strlen(":status"))){
resp_spec->resp_code = atoi((const char *)h2_field->nv.value);
continue;
}
if (!strncmp((char *)(h2_field->nv.name), "content-type", strlen("content-type"))){
if (!strncasecmp((char *)(h2_field->nv.name), "content-type", strlen("content-type"))){
resp_spec->content_type = tfe_strdup((const char *)(h2_field->nv.value));;
continue;
}
if (!strncmp((char *)(h2_field->nv.name), "content-encoding", strlen("content-encoding"))){
if (!strncasecmp((char *)(h2_field->nv.name), "content-encoding", strlen("content-encoding"))){
resp_spec->content_encoding = tfe_strdup((const char *)(h2_field->nv.value));;
continue;
}
if (!strncmp((char *)(h2_field->nv.name), "content-length", strlen("content-length"))){
if (!strncasecmp((char *)(h2_field->nv.name), "content-length", strlen("content-length"))){
resp_spec->content_length = tfe_strdup((const char *)(h2_field->nv.value));;
continue;
}
@@ -1697,16 +1661,16 @@ static void fill_req_spec_from_handle(struct tfe_h2_half_private *half_private)
struct tfe_http_req_spec *req_spec = &(half_private->half_public.req_spec);
TAILQ_FOREACH_SAFE(h2_field, &header->h2_field_list, next, peer_h2_field){
if (!strncmp((char *)(h2_field->nv.name), ":method", strlen(":method"))){
if (!strncasecmp((char *)(h2_field->nv.name), ":method", strlen(":method"))){
req_spec->method = (enum tfe_http_std_method)str_to_val((const char *)(h2_field->nv.value), method_vals);
continue;
}
if (!strncmp((char *)(h2_field->nv.name), ":authority", strlen(":authority"))){
if (!strncasecmp((char *)(h2_field->nv.name), ":authority", strlen(":authority"))){
req_spec->host = tfe_strdup((const char *)(h2_field->nv.value));
urllen += h2_field->nv.valuelen;
continue;
}
if (!strncmp((char *)(h2_field->nv.name), ":path", strlen(":path"))){
if (!strncasecmp((char *)(h2_field->nv.name), ":path", strlen(":path"))){
req_spec->uri = tfe_strdup((const char*)(h2_field->nv.value));
urllen += h2_field->nv.valuelen;
continue;
@@ -1916,7 +1880,7 @@ 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 http_field_name field;
field.field_id = (enum tfe_http_std_field)str_to_val((const char *)name, header_vals);
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);
if (field.field_id == TFE_HTTP_UNKNOWN_FIELD)
{
field.field_name = (const char *)name;
@@ -1950,7 +1914,7 @@ nghttp2_fill_up_promise(nghttp2_session *ngh2_session, const nghttp2_frame *fram
}
resp = h2_session->resp;
struct http_field_name field;
field.field_id = (enum tfe_http_std_field)str_to_val((const char *)name, header_vals);
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);
if (field.field_id == TFE_HTTP_UNKNOWN_FIELD)
{
field.field_name = (const char *)name;