OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/spdy_http_utils.h" | 5 #include "net/spdy/spdy_http_utils.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 | 163 |
164 COMPILE_ASSERT(HIGHEST - LOWEST < 4 && | 164 COMPILE_ASSERT(HIGHEST - LOWEST < 4 && |
165 HIGHEST - MINIMUM_PRIORITY < 5, | 165 HIGHEST - MINIMUM_PRIORITY < 5, |
166 request_priority_incompatible_with_spdy); | 166 request_priority_incompatible_with_spdy); |
167 | 167 |
168 SpdyPriority ConvertRequestPriorityToSpdyPriority( | 168 SpdyPriority ConvertRequestPriorityToSpdyPriority( |
169 const RequestPriority priority, | 169 const RequestPriority priority, |
170 SpdyMajorVersion protocol_version) { | 170 SpdyMajorVersion protocol_version) { |
171 DCHECK_GE(priority, MINIMUM_PRIORITY); | 171 DCHECK_GE(priority, MINIMUM_PRIORITY); |
172 DCHECK_LE(priority, MAXIMUM_PRIORITY); | 172 DCHECK_LE(priority, MAXIMUM_PRIORITY); |
173 if (protocol_version == SPDY2) { | 173 return static_cast<SpdyPriority>(MAXIMUM_PRIORITY - priority); |
174 // SPDY 2 only has 2 bits of priority, but we have 5 RequestPriorities. | |
175 // Map IDLE => 3, LOWEST => 2, LOW => 2, MEDIUM => 1, HIGHEST => 0. | |
176 if (priority > LOWEST) { | |
177 return static_cast<SpdyPriority>(HIGHEST - priority); | |
178 } else { | |
179 return static_cast<SpdyPriority>(HIGHEST - priority - 1); | |
180 } | |
181 } else { | |
182 return static_cast<SpdyPriority>(HIGHEST - priority); | |
183 } | |
184 } | 174 } |
185 | 175 |
186 NET_EXPORT_PRIVATE RequestPriority ConvertSpdyPriorityToRequestPriority( | 176 NET_EXPORT_PRIVATE RequestPriority ConvertSpdyPriorityToRequestPriority( |
187 SpdyPriority priority, | 177 SpdyPriority priority, |
188 SpdyMajorVersion protocol_version) { | 178 SpdyMajorVersion protocol_version) { |
189 // Handle invalid values gracefully, and pick LOW to map 2 back | 179 // Handle invalid values gracefully. |
190 // to for SPDY/2. | 180 // Note that SpdyPriority is not an enum, hence the magic constants. |
191 SpdyPriority idle_cutoff = (protocol_version == SPDY2) ? 3 : 5; | 181 return (priority >= 5) ? |
192 return (priority >= idle_cutoff) ? | 182 IDLE : static_cast<RequestPriority>(4 - priority); |
193 IDLE : static_cast<RequestPriority>(HIGHEST - priority); | |
194 } | 183 } |
195 | 184 |
196 GURL GetUrlFromHeaderBlock(const SpdyHeaderBlock& headers, | 185 GURL GetUrlFromHeaderBlock(const SpdyHeaderBlock& headers, |
197 SpdyMajorVersion protocol_version, | 186 SpdyMajorVersion protocol_version, |
198 bool pushed) { | 187 bool pushed) { |
199 // SPDY 2 server push urls are specified in a single "url" header. | |
200 if (pushed && protocol_version == SPDY2) { | |
201 std::string url; | |
202 SpdyHeaderBlock::const_iterator it; | |
203 it = headers.find("url"); | |
204 if (it != headers.end()) | |
205 url = it->second; | |
206 return GURL(url); | |
207 } | |
208 | |
209 const char* scheme_header = protocol_version >= SPDY3 ? ":scheme" : "scheme"; | 188 const char* scheme_header = protocol_version >= SPDY3 ? ":scheme" : "scheme"; |
210 const char* host_header = protocol_version >= SPDY4 ? ":authority" : | 189 const char* host_header = protocol_version >= SPDY4 ? ":authority" : |
211 (protocol_version >= SPDY3 ? ":host" : "host"); | 190 (protocol_version >= SPDY3 ? ":host" : "host"); |
212 const char* path_header = protocol_version >= SPDY3 ? ":path" : "url"; | 191 const char* path_header = protocol_version >= SPDY3 ? ":path" : "url"; |
213 | 192 |
214 std::string scheme; | 193 std::string scheme; |
215 std::string host_port; | 194 std::string host_port; |
216 std::string path; | 195 std::string path; |
217 SpdyHeaderBlock::const_iterator it; | 196 SpdyHeaderBlock::const_iterator it; |
218 it = headers.find(scheme_header); | 197 it = headers.find(scheme_header); |
219 if (it != headers.end()) | 198 if (it != headers.end()) |
220 scheme = it->second; | 199 scheme = it->second; |
221 it = headers.find(host_header); | 200 it = headers.find(host_header); |
222 if (it != headers.end()) | 201 if (it != headers.end()) |
223 host_port = it->second; | 202 host_port = it->second; |
224 it = headers.find(path_header); | 203 it = headers.find(path_header); |
225 if (it != headers.end()) | 204 if (it != headers.end()) |
226 path = it->second; | 205 path = it->second; |
227 | 206 |
228 std::string url = (scheme.empty() || host_port.empty() || path.empty()) | 207 std::string url = (scheme.empty() || host_port.empty() || path.empty()) |
229 ? std::string() | 208 ? std::string() |
230 : scheme + "://" + host_port + path; | 209 : scheme + "://" + host_port + path; |
231 return GURL(url); | 210 return GURL(url); |
232 } | 211 } |
233 | 212 |
234 } // namespace net | 213 } // namespace net |
OLD | NEW |