Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: net/http/http_response_headers.cc

Issue 10809011: Fix removal of headers (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698