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");
   }