OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/quic/core/spdy_utils.h" | 5 #include "net/quic/core/spdy_utils.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
| 10 #include "net/quic/platform/api/quic_flag_utils.h" |
| 11 #include "net/quic/platform/api/quic_flags.h" |
10 #include "net/quic/platform/api/quic_logging.h" | 12 #include "net/quic/platform/api/quic_logging.h" |
11 #include "net/quic/platform/api/quic_map_util.h" | 13 #include "net/quic/platform/api/quic_map_util.h" |
12 #include "net/quic/platform/api/quic_string_piece.h" | 14 #include "net/quic/platform/api/quic_string_piece.h" |
13 #include "net/quic/platform/api/quic_text_utils.h" | 15 #include "net/quic/platform/api/quic_text_utils.h" |
14 #include "net/quic/platform/api/quic_url_utils.h" | 16 #include "net/quic/platform/api/quic_url_utils.h" |
15 #include "net/spdy/chromium/spdy_flags.h" | 17 #include "net/spdy/chromium/spdy_flags.h" |
16 #include "net/spdy/core/spdy_frame_builder.h" | 18 #include "net/spdy/core/spdy_frame_builder.h" |
17 #include "net/spdy/core/spdy_framer.h" | 19 #include "net/spdy/core/spdy_framer.h" |
18 #include "net/spdy/core/spdy_protocol.h" | 20 #include "net/spdy/core/spdy_protocol.h" |
19 | 21 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 return false; | 91 return false; |
90 } | 92 } |
91 | 93 |
92 QUIC_DVLOG(1) << "Successfully parsed headers: " << headers->DebugString(); | 94 QUIC_DVLOG(1) << "Successfully parsed headers: " << headers->DebugString(); |
93 return true; | 95 return true; |
94 } | 96 } |
95 | 97 |
96 bool SpdyUtils::CopyAndValidateTrailers(const QuicHeaderList& header_list, | 98 bool SpdyUtils::CopyAndValidateTrailers(const QuicHeaderList& header_list, |
97 size_t* final_byte_offset, | 99 size_t* final_byte_offset, |
98 SpdyHeaderBlock* trailers) { | 100 SpdyHeaderBlock* trailers) { |
| 101 const bool handle_duplicate_trailers = |
| 102 FLAGS_quic_reloadable_flag_quic_handle_duplicate_trailers; |
99 bool found_final_byte_offset = false; | 103 bool found_final_byte_offset = false; |
100 for (const auto& p : header_list) { | 104 for (const auto& p : header_list) { |
101 const string& name = p.first; | 105 const string& name = p.first; |
102 | 106 |
103 // Pull out the final offset pseudo header which indicates the number of | 107 // Pull out the final offset pseudo header which indicates the number of |
104 // response body bytes expected. | 108 // response body bytes expected. |
105 if (!found_final_byte_offset && name == kFinalOffsetHeaderKey && | 109 if (!found_final_byte_offset && name == kFinalOffsetHeaderKey && |
106 QuicTextUtils::StringToSizeT(p.second, final_byte_offset)) { | 110 QuicTextUtils::StringToSizeT(p.second, final_byte_offset)) { |
107 found_final_byte_offset = true; | 111 found_final_byte_offset = true; |
108 continue; | 112 continue; |
109 } | 113 } |
110 | 114 |
111 if (name.empty() || name[0] == ':') { | 115 if (name.empty() || name[0] == ':') { |
112 QUIC_DLOG(ERROR) | 116 QUIC_DLOG(ERROR) |
113 << "Trailers must not be empty, and must not contain pseudo-" | 117 << "Trailers must not be empty, and must not contain pseudo-" |
114 << "headers. Found: '" << name << "'"; | 118 << "headers. Found: '" << name << "'"; |
115 return false; | 119 return false; |
116 } | 120 } |
117 | 121 |
118 if (QuicTextUtils::ContainsUpperCase(name)) { | 122 if (QuicTextUtils::ContainsUpperCase(name)) { |
119 QUIC_DLOG(ERROR) << "Malformed header: Header name " << name | 123 QUIC_DLOG(ERROR) << "Malformed header: Header name " << name |
120 << " contains upper-case characters."; | 124 << " contains upper-case characters."; |
121 return false; | 125 return false; |
122 } | 126 } |
123 | 127 |
124 if (trailers->find(name) != trailers->end()) { | 128 if (handle_duplicate_trailers) { |
125 QUIC_DLOG(ERROR) << "Duplicate header '" << name | 129 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_handle_duplicate_trailers, 1, |
126 << "' found in trailers."; | 130 3); |
127 return false; | 131 trailers->AppendValueOrAddHeader(name, p.second); |
| 132 } else { |
| 133 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_handle_duplicate_trailers, 2, |
| 134 3); |
| 135 if (trailers->find(name) != trailers->end()) { |
| 136 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_handle_duplicate_trailers, |
| 137 3, 3); |
| 138 QUIC_DLOG(ERROR) << "Duplicate header '" << name |
| 139 << "' found in trailers."; |
| 140 return false; |
| 141 } |
| 142 (*trailers)[name] = p.second; |
128 } | 143 } |
129 | |
130 (*trailers)[name] = p.second; | |
131 } | 144 } |
132 | 145 |
133 if (!found_final_byte_offset) { | 146 if (!found_final_byte_offset) { |
134 QUIC_DLOG(ERROR) << "Required key '" << kFinalOffsetHeaderKey | 147 QUIC_DLOG(ERROR) << "Required key '" << kFinalOffsetHeaderKey |
135 << "' not present"; | 148 << "' not present"; |
136 return false; | 149 return false; |
137 } | 150 } |
138 | 151 |
139 // TODO(rjshade): Check for other forbidden keys, following the HTTP/2 spec. | 152 // TODO(rjshade): Check for other forbidden keys, following the HTTP/2 spec. |
140 | 153 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 (*headers)[":authority"] = url.substr(start); | 207 (*headers)[":authority"] = url.substr(start); |
195 (*headers)[":path"] = "/"; | 208 (*headers)[":path"] = "/"; |
196 return true; | 209 return true; |
197 } | 210 } |
198 (*headers)[":authority"] = url.substr(start, pos - start); | 211 (*headers)[":authority"] = url.substr(start, pos - start); |
199 (*headers)[":path"] = url.substr(pos); | 212 (*headers)[":path"] = url.substr(pos); |
200 return true; | 213 return true; |
201 } | 214 } |
202 | 215 |
203 } // namespace net | 216 } // namespace net |
OLD | NEW |