| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/spdy/hpack_encoder.h" | 5 #include "net/spdy/hpack_encoder.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "net/spdy/hpack_header_table.h" | 10 #include "net/spdy/hpack_header_table.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 // header table). | 57 // header table). |
| 58 EmitIndexedLiteral(*it); | 58 EmitIndexedLiteral(*it); |
| 59 } else { | 59 } else { |
| 60 // Most common pseudo-header fields are represented in the static table, | 60 // Most common pseudo-header fields are represented in the static table, |
| 61 // while uncommon ones are small, so do not index them. | 61 // while uncommon ones are small, so do not index them. |
| 62 EmitNonIndexedLiteral(*it); | 62 EmitNonIndexedLiteral(*it); |
| 63 } | 63 } |
| 64 } | 64 } |
| 65 } | 65 } |
| 66 | 66 |
| 67 // Encode regular headers that are already in the header table first, | 67 // Encode regular headers. |
| 68 // save the rest into another vector. This way we avoid evicting an entry | |
| 69 // from the header table before it can be used. | |
| 70 Representations literal_headers; | |
| 71 for (Representations::const_iterator it = regular_headers.begin(); | 68 for (Representations::const_iterator it = regular_headers.begin(); |
| 72 it != regular_headers.end(); ++it) { | 69 it != regular_headers.end(); ++it) { |
| 73 const HpackEntry* entry = | 70 const HpackEntry* entry = |
| 74 header_table_.GetByNameAndValue(it->first, it->second); | 71 header_table_.GetByNameAndValue(it->first, it->second); |
| 75 if (entry != NULL) { | 72 if (entry != NULL) { |
| 76 EmitIndex(entry); | 73 EmitIndex(entry); |
| 77 } else { | 74 } else { |
| 78 literal_headers.push_back(*it); | 75 EmitIndexedLiteral(*it); |
| 79 } | 76 } |
| 80 } | 77 } |
| 81 | 78 |
| 82 // Encode the remaining header fields, while inserting them in the header | |
| 83 // table. | |
| 84 for (Representations::const_iterator it = literal_headers.begin(); | |
| 85 it != literal_headers.end(); ++it) { | |
| 86 EmitIndexedLiteral(*it); | |
| 87 } | |
| 88 | |
| 89 output_stream_.TakeString(output); | 79 output_stream_.TakeString(output); |
| 90 return true; | 80 return true; |
| 91 } | 81 } |
| 92 | 82 |
| 93 bool HpackEncoder::EncodeHeaderSetWithoutCompression( | 83 bool HpackEncoder::EncodeHeaderSetWithoutCompression( |
| 94 const std::map<string, string>& header_set, | 84 const std::map<string, string>& header_set, |
| 95 string* output) { | 85 string* output) { |
| 96 | 86 |
| 97 allow_huffman_compression_ = false; | 87 allow_huffman_compression_ = false; |
| 98 for (std::map<string, string>::const_iterator it = header_set.begin(); | 88 for (std::map<string, string>::const_iterator it = header_set.begin(); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 size_t end = 0; | 197 size_t end = 0; |
| 208 while (end != StringPiece::npos) { | 198 while (end != StringPiece::npos) { |
| 209 end = header_field.second.find('\0', pos); | 199 end = header_field.second.find('\0', pos); |
| 210 out->push_back(make_pair(header_field.first, | 200 out->push_back(make_pair(header_field.first, |
| 211 header_field.second.substr(pos, end - pos))); | 201 header_field.second.substr(pos, end - pos))); |
| 212 pos = end + 1; | 202 pos = end + 1; |
| 213 } | 203 } |
| 214 } | 204 } |
| 215 | 205 |
| 216 } // namespace net | 206 } // namespace net |
| OLD | NEW |