You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by ma...@apache.org on 2018/09/12 08:27:02 UTC
[trafficserver] 02/05: Convert heaeder names to lowercase befor
encoding and after decoding
This is an automated email from the ASF dual-hosted git repository.
maskit pushed a commit to branch quic-latest
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit da89f6932ec8ef2c49d67c3340685710737e73d9
Author: Masakazu Kitajo <ma...@apache.org>
AuthorDate: Wed Sep 12 17:16:10 2018 +0900
Convert heaeder names to lowercase befor encoding and after decoding
---
proxy/hq/QPACK.cc | 41 +++++++++++++++++++++++------------------
proxy/hq/test/test_QPACK.cc | 9 +++++++--
2 files changed, 30 insertions(+), 20 deletions(-)
diff --git a/proxy/hq/QPACK.cc b/proxy/hq/QPACK.cc
index 626d5ae..404d88a 100644
--- a/proxy/hq/QPACK.cc
+++ b/proxy/hq/QPACK.cc
@@ -237,8 +237,13 @@ QPACK::_encode_prefix(uint16_t largest_reference, uint16_t base_index, IOBufferB
int
QPACK::_encode_header(const MIMEField &field, uint16_t base_index, IOBufferBlock *compressed_header, uint16_t &referred_index)
{
+ Arena arena;
int name_len;
- const char *name = field.name_get(&name_len);
+ const char *name = field.name_get(&name_len);
+ char *lowered_name = arena.str_store(name, name_len);
+ for (int i = 0; i < name_len; i++) {
+ lowered_name[i] = ParseRules::ink_tolower(lowered_name[i]);
+ }
int value_len;
const char *value = field.value_get(&value_len);
@@ -248,9 +253,9 @@ QPACK::_encode_header(const MIMEField &field, uint16_t base_index, IOBufferBlock
// Find from tables, and insert / duplicate a entry prior to encode it
LookupResult lookup_result_static;
LookupResult lookup_result_dynamic;
- lookup_result_static = StaticTable::lookup(name, name_len, value, value_len);
+ lookup_result_static = StaticTable::lookup(lowered_name, name_len, value, value_len);
if (lookup_result_static.match_type != LookupResult::MatchType::EXACT) {
- lookup_result_dynamic = this->_dynamic_table.lookup(name, name_len, value, value_len);
+ lookup_result_dynamic = this->_dynamic_table.lookup(lowered_name, name_len, value, value_len);
if (lookup_result_dynamic.match_type == LookupResult::MatchType::EXACT) {
if (this->_dynamic_table.should_duplicate(lookup_result_dynamic.index)) {
// Duplicate an entry and use the new entry
@@ -266,10 +271,10 @@ QPACK::_encode_header(const MIMEField &field, uint16_t base_index, IOBufferBlock
// Name in static table is always available. Do nothing.
} else {
// Insert both the name and the value
- lookup_result_dynamic = this->_dynamic_table.insert_entry(name, name_len, value, value_len);
+ lookup_result_dynamic = this->_dynamic_table.insert_entry(lowered_name, name_len, value, value_len);
if (lookup_result_dynamic.match_type != LookupResult::MatchType::NONE) {
- this->_write_insert_without_name_ref(name, name_len, value, value_len);
- QPACKDebug("Wrote Insert Without Name Ref: name=%.*s value=%.*s", name_len, name, value_len, value);
+ this->_write_insert_without_name_ref(lowered_name, name_len, value, value_len);
+ QPACKDebug("Wrote Insert Without Name Ref: name=%.*s value=%.*s", name_len, lowered_name, value_len, value);
}
}
} else if (lookup_result_dynamic.match_type == LookupResult::MatchType::NAME) {
@@ -294,27 +299,27 @@ QPACK::_encode_header(const MIMEField &field, uint16_t base_index, IOBufferBlock
}
} else {
// Insert both the name and the value
- lookup_result_dynamic = this->_dynamic_table.insert_entry(name, name_len, value, value_len);
+ lookup_result_dynamic = this->_dynamic_table.insert_entry(lowered_name, name_len, value, value_len);
if (lookup_result_dynamic.match_type != LookupResult::MatchType::NONE) {
- this->_write_insert_without_name_ref(name, name_len, value, value_len);
- QPACKDebug("Wrote Insert Without Name Ref: name=%.*s value=%.*s", name_len, name, value_len, value);
+ this->_write_insert_without_name_ref(lowered_name, name_len, value, value_len);
+ QPACKDebug("Wrote Insert Without Name Ref: name=%.*s value=%.*s", name_len, lowered_name, value_len, value);
}
}
}
} else {
if (never_index) {
// Insert only the name
- lookup_result_dynamic = this->_dynamic_table.insert_entry(name, name_len, "", 0);
+ lookup_result_dynamic = this->_dynamic_table.insert_entry(lowered_name, name_len, "", 0);
if (lookup_result_dynamic.match_type != LookupResult::MatchType::NONE) {
- this->_write_insert_without_name_ref(name, name_len, "", 0);
- QPACKDebug("Wrote Insert Without Name Ref: name=%.*s value=%.*s", name_len, name, 0, "");
+ this->_write_insert_without_name_ref(lowered_name, name_len, "", 0);
+ QPACKDebug("Wrote Insert Without Name Ref: name=%.*s value=%.*s", name_len, lowered_name, 0, "");
}
} else {
// Insert both the name and the value
- lookup_result_dynamic = this->_dynamic_table.insert_entry(name, name_len, value, value_len);
+ lookup_result_dynamic = this->_dynamic_table.insert_entry(lowered_name, name_len, value, value_len);
if (lookup_result_dynamic.match_type != LookupResult::MatchType::NONE) {
- this->_write_insert_without_name_ref(name, name_len, value, value_len);
- QPACKDebug("Wrote Insert Without Name Ref: name=%.*s value=%.*s", name_len, name, value_len, value);
+ this->_write_insert_without_name_ref(lowered_name, name_len, value, value_len);
+ QPACKDebug("Wrote Insert Without Name Ref: name=%.*s value=%.*s", name_len, lowered_name, value_len, value);
}
}
}
@@ -362,9 +367,9 @@ QPACK::_encode_header(const MIMEField &field, uint16_t base_index, IOBufferBlock
this->_dynamic_table.ref_entry(lookup_result_dynamic.index);
referred_index = lookup_result_dynamic.index;
} else {
- this->_encode_literal_header_field_without_name_ref(name, name_len, value, value_len, never_index, compressed_header);
- QPACKDebug("Encoded Literal Header Field Without Name Ref: name=%.*s, value=%.*s, never_index=%d", name_len, name, value_len,
- value, never_index);
+ this->_encode_literal_header_field_without_name_ref(lowered_name, name_len, value, value_len, never_index, compressed_header);
+ QPACKDebug("Encoded Literal Header Field Without Name Ref: name=%.*s, value=%.*s, never_index=%d", name_len, lowered_name,
+ value_len, value, never_index);
}
return 0;
diff --git a/proxy/hq/test/test_QPACK.cc b/proxy/hq/test/test_QPACK.cc
index 3fe6bc0..b8f8c07 100644
--- a/proxy/hq/test/test_QPACK.cc
+++ b/proxy/hq/test/test_QPACK.cc
@@ -216,9 +216,14 @@ output_decoded_headers(FILE *fd, HTTPHdr **headers, uint64_t n)
field = header_set->iter_get_next(&field_iter)) {
int name_len;
int value_len;
- const char *name = field->name_get(&name_len);
+ Arena arena;
+ const char *name = field->name_get(&name_len);
+ char *lowered_name = arena.str_store(name, name_len);
+ for (int i = 0; i < name_len; i++) {
+ lowered_name[i] = ParseRules::ink_tolower(lowered_name[i]);
+ }
const char *value = field->value_get(&value_len);
- fprintf(fd, "%.*s\t%.*s\n", name_len, name, value_len, value);
+ fprintf(fd, "%.*s\t%.*s\n", name_len, lowered_name, value_len, value);
}
fprintf(fd, "\n");
}