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 // The rules for header parsing were borrowed from Firefox: | 5 // The rules for header parsing were borrowed from Firefox: |
6 // http://lxr.mozilla.org/seamonkey/source/netwerk/protocol/http/src/nsHttpRespo nseHead.cpp | 6 // http://lxr.mozilla.org/seamonkey/source/netwerk/protocol/http/src/nsHttpRespo nseHead.cpp |
7 // The rules for parsing content-types were also borrowed from Firefox: | 7 // The rules for parsing content-types were also borrowed from Firefox: |
8 // http://lxr.mozilla.org/mozilla/source/netwerk/base/src/nsURLHelper.cpp#834 | 8 // http://lxr.mozilla.org/mozilla/source/netwerk/base/src/nsURLHelper.cpp#834 |
9 | 9 |
10 #include "net/http/http_response_headers.h" | 10 #include "net/http/http_response_headers.h" |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
304 i = k; | 304 i = k; |
305 } | 305 } |
306 new_raw_headers.push_back('\0'); | 306 new_raw_headers.push_back('\0'); |
307 | 307 |
308 // Make this object hold the new data. | 308 // Make this object hold the new data. |
309 raw_headers_.clear(); | 309 raw_headers_.clear(); |
310 parsed_.clear(); | 310 parsed_.clear(); |
311 Parse(new_raw_headers); | 311 Parse(new_raw_headers); |
312 } | 312 } |
313 | 313 |
314 void HttpResponseHeaders::MergeWithHeadersWithValue( | 314 void HttpResponseHeaders::MergeWithHeadersWithValue( |
rvargas (doing something else)
2012/07/19 19:11:02
Please remove this method.
battre
2012/07/23 13:31:11
Good catch. Thanks.
Done.
| |
315 const std::string& raw_headers, | 315 const std::string& raw_headers, |
316 const std::string& header_to_remove_name, | 316 const std::string& header_to_remove_name, |
317 const std::string& header_to_remove_value) { | 317 const std::string& header_to_remove_value) { |
318 std::string header_to_remove_name_lowercase(header_to_remove_name); | 318 std::string header_to_remove_name_lowercase(header_to_remove_name); |
319 StringToLowerASCII(&header_to_remove_name_lowercase); | 319 StringToLowerASCII(&header_to_remove_name_lowercase); |
320 | 320 |
321 std::string new_raw_headers(raw_headers); | 321 std::string new_raw_headers(raw_headers); |
322 for (size_t i = 0; i < parsed_.size(); ++i) { | 322 for (size_t i = 0; i < parsed_.size(); ++i) { |
323 DCHECK(!parsed_[i].is_continuation()); | 323 DCHECK(!parsed_[i].is_continuation()); |
324 | 324 |
(...skipping 27 matching lines...) Expand all Loading... | |
352 std::string new_raw_headers(raw_headers_.c_str()); | 352 std::string new_raw_headers(raw_headers_.c_str()); |
353 new_raw_headers.push_back('\0'); | 353 new_raw_headers.push_back('\0'); |
354 | 354 |
355 std::string lowercase_name(name); | 355 std::string lowercase_name(name); |
356 StringToLowerASCII(&lowercase_name); | 356 StringToLowerASCII(&lowercase_name); |
357 HeaderSet to_remove; | 357 HeaderSet to_remove; |
358 to_remove.insert(lowercase_name); | 358 to_remove.insert(lowercase_name); |
359 MergeWithHeaders(new_raw_headers, to_remove); | 359 MergeWithHeaders(new_raw_headers, to_remove); |
360 } | 360 } |
361 | 361 |
362 void HttpResponseHeaders::RemoveHeaderWithValue(const std::string& name, | 362 void HttpResponseHeaders::RemoveHeaderLine(const std::string& name, |
363 const std::string& value) { | 363 const std::string& values) { |
364 std::string name_lowercase(name); | |
365 StringToLowerASCII(&name_lowercase); | |
366 | |
364 // Copy up to the null byte. This just copies the status line. | 367 // Copy up to the null byte. This just copies the status line. |
365 std::string new_raw_headers(raw_headers_.c_str()); | 368 std::string new_raw_headers(raw_headers_.c_str()); |
366 new_raw_headers.push_back('\0'); | 369 new_raw_headers.push_back('\0'); |
367 | 370 |
368 MergeWithHeadersWithValue(new_raw_headers, name, value); | 371 new_raw_headers.reserve(raw_headers_.size()); |
372 | |
373 HttpUtil::HeadersIterator headers( | |
rvargas (doing something else)
2012/07/19 19:11:02
Shouldn't this code use EnumerateHeaderLines?
battre
2012/07/23 13:31:11
Done.
| |
374 raw_headers_.begin() + new_raw_headers.size(), | |
375 raw_headers_.end(), | |
376 std::string(1, '\0')); | |
377 while (headers.GetNext()) { | |
378 std::string old_header_name(headers.name()); | |
379 std::string old_header_values(headers.values()); | |
380 std::string old_header_name_lowercase(name); | |
381 StringToLowerASCII(&old_header_name_lowercase); | |
382 | |
383 if (name_lowercase == old_header_name_lowercase && | |
384 values == old_header_values) | |
385 continue; | |
386 | |
387 new_raw_headers.append(old_header_name); | |
388 new_raw_headers.push_back(':'); | |
389 new_raw_headers.push_back(' '); | |
390 new_raw_headers.append(old_header_values); | |
391 new_raw_headers.push_back('\0'); | |
392 } | |
393 new_raw_headers.push_back('\0'); | |
394 | |
395 // Make this object hold the new data. | |
396 raw_headers_.clear(); | |
397 parsed_.clear(); | |
398 Parse(new_raw_headers); | |
369 } | 399 } |
370 | 400 |
371 void HttpResponseHeaders::AddHeader(const std::string& header) { | 401 void HttpResponseHeaders::AddHeader(const std::string& header) { |
372 CheckDoesNotHaveEmbededNulls(header); | 402 CheckDoesNotHaveEmbededNulls(header); |
373 DCHECK_EQ('\0', raw_headers_[raw_headers_.size() - 2]); | 403 DCHECK_EQ('\0', raw_headers_[raw_headers_.size() - 2]); |
374 DCHECK_EQ('\0', raw_headers_[raw_headers_.size() - 1]); | 404 DCHECK_EQ('\0', raw_headers_[raw_headers_.size() - 1]); |
375 // Don't copy the last null. | 405 // Don't copy the last null. |
376 std::string new_raw_headers(raw_headers_, 0, raw_headers_.size() - 1); | 406 std::string new_raw_headers(raw_headers_, 0, raw_headers_.size() - 1); |
377 new_raw_headers.append(header); | 407 new_raw_headers.append(header); |
378 new_raw_headers.push_back('\0'); | 408 new_raw_headers.push_back('\0'); |
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1357 return true; | 1387 return true; |
1358 } | 1388 } |
1359 | 1389 |
1360 bool HttpResponseHeaders::IsChunkEncoded() const { | 1390 bool HttpResponseHeaders::IsChunkEncoded() const { |
1361 // Ignore spurious chunked responses from HTTP/1.0 servers and proxies. | 1391 // Ignore spurious chunked responses from HTTP/1.0 servers and proxies. |
1362 return GetHttpVersion() >= HttpVersion(1, 1) && | 1392 return GetHttpVersion() >= HttpVersion(1, 1) && |
1363 HasHeaderValue("Transfer-Encoding", "chunked"); | 1393 HasHeaderValue("Transfer-Encoding", "chunked"); |
1364 } | 1394 } |
1365 | 1395 |
1366 } // namespace net | 1396 } // namespace net |
OLD | NEW |