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

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

Issue 9811006: Ignore Content-Length mismatches when Content-Length is too large. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Remove funny comment Created 8 years, 9 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
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 #include "net/http/http_stream_parser.h" 5 #include "net/http/http_stream_parser.h"
6 6
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "net/base/address_list.h" 10 #include "net/base/address_list.h"
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 // Check to see if we're done reading. 655 // Check to see if we're done reading.
656 if (IsResponseBodyComplete()) 656 if (IsResponseBodyComplete())
657 return 0; 657 return 0;
658 658
659 DCHECK_EQ(0, read_buf_->offset()); 659 DCHECK_EQ(0, read_buf_->offset());
660 return connection_->socket()->Read(user_read_buf_, user_read_buf_len_, 660 return connection_->socket()->Read(user_read_buf_, user_read_buf_len_,
661 io_callback_); 661 io_callback_);
662 } 662 }
663 663
664 int HttpStreamParser::DoReadBodyComplete(int result) { 664 int HttpStreamParser::DoReadBodyComplete(int result) {
665 // If we didn't get a Content-Length and aren't using a chunked encoding, 665 // When the connection is closed, there are numerous ways to interpret it.
666 // the only way to signal the end of a stream is to close the connection, 666 //
667 // so we don't treat that as an error, though in some cases we may not 667 // - If a Content-Length header is present and the body contains exactly that
668 // have completely received the resource. 668 // number of bytes at connection close, the response is successful.
669 if (result == 0 && !IsResponseBodyComplete() && CanFindEndOfResponse()) 669 //
670 result = ERR_CONNECTION_CLOSED; 670 // - If a Content-Length header is present and the body contains fewer bytes
671 // than promised by the header at connection close, it may indicate that
672 // the connection was closed prematurely, or it may indicate that the
673 // server sent an invalid Content-Length header. Unfortunately, the invalid
674 // Content-Length header case does occur in practice and other browsers are
675 // tolerant of it, so this is reported as OK.
676 //
677 // - If chunked encoding is used and the terminating chunk has been processed
678 // when the connection is closed, the response is successful.
679 //
680 // - If chunked encoding is used and the terminating chunk has not been
681 // processed when the connection is closed, it may indicate that the
682 // connection was closed prematurely or it may indicate that the server
683 // sent an invalid chunked encoding. We choose to treat it as
684 // an invalid chunked encoding.
685 //
686 // - If a Content-Length is not present and chunked encoding is not used,
687 // connection close is the only way to signal that the response is
688 // complete. Unfortunately, this also means that there is no way to detect
689 // early close of a connection. No error is returned.
690 if (result == 0 && !IsResponseBodyComplete() && CanFindEndOfResponse()) {
691 if (chunked_decoder_.get())
692 result = ERR_INVALID_CHUNKED_ENCODING;
693 else
694 result = ERR_CONNECTION_CLOSED;
rvargas (doing something else) 2012/03/23 20:50:29 So we still return an error code at this layer in
cbentzel 2012/03/23 21:19:20 Oops, this was a bad local patch that I did to mak
695 }
671 696
672 // Filter incoming data if appropriate. FilterBuf may return an error. 697 // Filter incoming data if appropriate. FilterBuf may return an error.
673 if (result > 0 && chunked_decoder_.get()) { 698 if (result > 0 && chunked_decoder_.get()) {
674 result = chunked_decoder_->FilterBuf(user_read_buf_->data(), result); 699 result = chunked_decoder_->FilterBuf(user_read_buf_->data(), result);
675 if (result == 0 && !chunked_decoder_->reached_eof()) { 700 if (result == 0 && !chunked_decoder_->reached_eof()) {
676 // Don't signal completion of the Read call yet or else it'll look like 701 // Don't signal completion of the Read call yet or else it'll look like
677 // we received end-of-file. Wait for more data. 702 // we received end-of-file. Wait for more data.
678 io_state_ = STATE_READ_BODY; 703 io_state_ = STATE_READ_BODY;
679 return OK; 704 return OK;
680 } 705 }
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
924 request_body->IsInMemory() && 949 request_body->IsInMemory() &&
925 request_body->size() > 0) { 950 request_body->size() > 0) {
926 size_t merged_size = request_headers.size() + request_body->size(); 951 size_t merged_size = request_headers.size() + request_body->size();
927 if (merged_size <= kMaxMergedHeaderAndBodySize) 952 if (merged_size <= kMaxMergedHeaderAndBodySize)
928 return true; 953 return true;
929 } 954 }
930 return false; 955 return false;
931 } 956 }
932 957
933 } // namespace net 958 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_network_transaction_spdy3_unittest.cc ('k') | net/url_request/url_request_http_job.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698