Repository: trafficserver Updated Branches: refs/heads/master a94590e43 -> 413dd51d5
TS-4097: Encode empty string properly with HPACK This closes #395. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/413dd51d Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/413dd51d Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/413dd51d Branch: refs/heads/master Commit: 413dd51d5dc17bf388805071efdb8f882014b847 Parents: a94590e Author: Masakazu Kitajo <[email protected]> Authored: Tue Dec 22 11:01:33 2015 +0900 Committer: Masakazu Kitajo <[email protected]> Committed: Wed Dec 30 22:02:03 2015 +0900 ---------------------------------------------------------------------- proxy/http2/HPACK.cc | 8 +++++--- proxy/http2/RegressionHPACK.cc | 12 +++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/413dd51d/proxy/http2/HPACK.cc ---------------------------------------------------------------------- diff --git a/proxy/http2/HPACK.cc b/proxy/http2/HPACK.cc index 51b9a2f..b54d923 100644 --- a/proxy/http2/HPACK.cc +++ b/proxy/http2/HPACK.cc @@ -338,7 +338,7 @@ encode_string(uint8_t *buf_start, const uint8_t *buf_end, const char *value, siz // TODO Choose whether to use Huffman encoding wisely - if (use_huffman) { + if (use_huffman && value_len) { data = static_cast<char *>(ats_malloc(value_len * 4)); if (data == NULL) return -1; @@ -369,8 +369,10 @@ encode_string(uint8_t *buf_start, const uint8_t *buf_end, const char *value, siz } // Value - memcpy(p, data, data_len); - p += data_len; + if (data_len) { + memcpy(p, data, data_len); + p += data_len; + } if (use_huffman) { ats_free(data); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/413dd51d/proxy/http2/RegressionHPACK.cc ---------------------------------------------------------------------- diff --git a/proxy/http2/RegressionHPACK.cc b/proxy/http2/RegressionHPACK.cc index 5ceebc8..fe5ee71 100644 --- a/proxy/http2/RegressionHPACK.cc +++ b/proxy/http2/RegressionHPACK.cc @@ -53,9 +53,15 @@ const static struct { uint32_t raw_string_len; uint8_t *encoded_field; int encoded_field_len; -} string_test_case[] = {{(char *)"custom-key", 10, (uint8_t *) "\xA" +} string_test_case[] = {{(char *)"", 0, (uint8_t *) "\x0" + "", + 1}, + {(char *)"custom-key", 10, (uint8_t *) "\xA" "custom-key", 11}, + {(char *)"", 0, (uint8_t *) "\x80" + "", + 1}, {(char *)"custom-key", 10, (uint8_t *) "\x88" "\x25\xa8\x49\xe9\x5b\xa9\x7d\x7f", 9}}; @@ -232,13 +238,13 @@ REGRESSION_TEST(HPACK_EncodeString)(RegressionTest *t, int, int *pstatus) int len; // FIXME Current encoder support only huffman conding. - for (unsigned int i = 1; i < 2; i++) { + for (unsigned int i = 2; i < sizeof(string_test_case) / sizeof(string_test_case[0]); i++) { memset(buf, 0, BUFSIZE_FOR_REGRESSION_TEST); len = encode_string(buf, buf + BUFSIZE_FOR_REGRESSION_TEST, string_test_case[i].raw_string, string_test_case[i].raw_string_len); box.check(len == string_test_case[i].encoded_field_len, "encoded length was %d, expecting %d", len, - integer_test_case[i].encoded_field_len); + string_test_case[i].encoded_field_len); box.check(len > 0 && memcmp(buf, string_test_case[i].encoded_field, len) == 0, "encoded string was invalid"); } }
