From ce8c8cd899f57135cad74b8628f91a72105008b4 Mon Sep 17 00:00:00 2001 From: luqiuwen Date: Mon, 23 Sep 2019 19:07:32 +0800 Subject: [PATCH] =?UTF-8?q?#174=20=E4=BF=AE=E6=AD=A3HTTP1=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E5=B1=82=E5=9C=A8=E8=A7=A3=E6=9E=90HTTP=E5=A4=B4?= =?UTF-8?q?=E9=83=A8=E6=97=B6=EF=BC=8C=E8=AF=AF=E9=87=87=E7=94=A8=E5=89=8D?= =?UTF-8?q?=E7=BC=80=E5=8C=B9=E9=85=8D=E5=88=A4=E6=96=AD=E5=A4=B4=E9=83=A8?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E4=B8=BA=E6=A0=87=E5=87=86=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82=20*=20=E5=8E=9F=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E5=88=A4=E6=96=AD=E8=AF=B7=E6=B1=82/?= =?UTF-8?q?=E5=BA=94=E7=AD=94=E5=A4=B4=E9=83=A8=E5=AD=97=E6=AE=B5=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E4=B8=BA=E6=A0=87=E5=87=86=E5=A4=B4=E9=83=A8=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=B2=A1=E6=9C=89=E5=88=A4=E6=96=AD=E4=BC=A0=E5=85=A5?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=95=BF=E5=BA=A6=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E7=9B=B8=E7=AD=89=EF=BC=8C=E5=AF=BC=E8=87=B4=E5=BD=93=E4=BC=A0?= =?UTF-8?q?=E5=85=A5=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=BA=E6=A0=87=E5=87=86?= =?UTF-8?q?=E5=A4=B4=E9=83=A8=E7=9A=84=E5=89=8D=E7=BC=80=E6=97=B6=E8=AF=AF?= =?UTF-8?q?=E5=B0=86=E5=85=B6=E8=A7=A3=E6=9E=90=E4=B8=BA=E6=A0=87=E5=87=86?= =?UTF-8?q?=E5=A4=B4=E9=83=A8=EF=BC=9B=20*=20=E7=8E=B0=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=88=A4=E6=96=AD=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E9=95=BF=E5=BA=A6=E7=9A=84=E6=B5=81=E7=A8=8B=EF=BC=8C?= =?UTF-8?q?=E5=BD=93=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=95=BF=E5=BA=A6=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E7=9B=B8=E7=AD=89=E6=97=B6=E5=86=8D=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=8C=B9=E9=85=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin/protocol/http/src/http_half.cpp | 15 +++++++++++---- plugin/protocol/http/test/test_http_half.cpp | 7 +++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/plugin/protocol/http/src/http_half.cpp b/plugin/protocol/http/src/http_half.cpp index 87d78e7..48b4bfe 100644 --- a/plugin/protocol/http/src/http_half.cpp +++ b/plugin/protocol/http/src/http_half.cpp @@ -20,12 +20,19 @@ static enum tfe_http_std_field __str_header_field_to_std_field_id(const char * s /* TODO: store the header text in hash table or rbtree, or use AC multistring search algo. */ for (unsigned int i = 0; i < __str_std_header_field_map_size; i++) { - const char * __std_header_field = __str_std_header_field_map[i]; - if (__std_header_field == NULL) + const char * std_header_field_iter = __str_std_header_field_map[i]; + if (std_header_field_iter == NULL) continue; - size_t __compare_length = MIN(strlen(__std_header_field), len); - if (evutil_ascii_strncasecmp(__std_header_field, str_field, __compare_length) != 0) + /* std_header_field_iter must contains '\0' */ + size_t std_field_length = strlen(std_header_field_iter); + /* but the str_field may don't contains '\0', so must use strnlen */ + size_t field_length = strnlen(str_field, len); + + if (std_field_length != field_length) + continue; + + if (strncasecmp(std_header_field_iter, str_field, std_field_length) != 0) continue; return (enum tfe_http_std_field) i; diff --git a/plugin/protocol/http/test/test_http_half.cpp b/plugin/protocol/http/test/test_http_half.cpp index 6f14ebf..1626100 100644 --- a/plugin/protocol/http/test/test_http_half.cpp +++ b/plugin/protocol/http/test/test_http_half.cpp @@ -46,6 +46,7 @@ static const char * __get_http_request_no_body = "GET /gfwlist/gfwlist/master/gfwlist.txt HTTP/1.1\r\n" "Host: raw.githubusercontent.com\r\n" "Connection: close\r\n" + "User: User-Test\r\n" "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n" "Accept: */*\r\n" "Accept-Encoding: gzip, deflate\r\n" @@ -82,6 +83,12 @@ void __get_http_request_header_verify_helper(struct http_half_private * hf_priva EXPECT_EQ(field_name.field_id, TFE_HTTP_CONNECTION); EXPECT_STREQ(hdr_value, "close"); + /* User */ + hdr_value = tfe_http_field_iterate(hf_public, &__iterator, &field_name); + EXPECT_EQ(field_name.field_id, TFE_HTTP_UNKNOWN_FIELD); + EXPECT_STREQ(field_name.field_name, "User"); + EXPECT_STREQ(hdr_value, "User-Test"); + /* User-Agent */ hdr_value = tfe_http_field_iterate(hf_public, &__iterator, &field_name); EXPECT_EQ(field_name.field_id, TFE_HTTP_USER_AGENT);