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

Unified Diff: net/test/embedded_test_server/http_request.cc

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: net/test/embedded_test_server/http_request.cc
diff --git a/net/test/embedded_test_server/http_request.cc b/net/test/embedded_test_server/http_request.cc
index 3156e5134faa29cfe86586bc03d8ecbcef7ea137..51d6f0646942205d2fbc9b290e61e35c20a993ff 100644
--- a/net/test/embedded_test_server/http_request.cc
+++ b/net/test/embedded_test_server/http_request.cc
@@ -10,6 +10,7 @@
#include "base/strings/string_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
+#include "net/http/http_chunked_decoder.h"
namespace net {
namespace test_server {
@@ -140,6 +141,13 @@ HttpRequestParser::ParseResult HttpRequestParser::ParseHeaders() {
http_request_->headers["Content-Length"],
&declared_content_length_);
DCHECK(success) << "Malformed Content-Length header's value.";
+ } else if (http_request_->headers.count("Transfer-Encoding") > 0) {
+ if (http_request_->headers["Transfer-Encoding"] == "chunked") {
+ http_request_->has_content = true;
+ chunked_decoder_.reset(new HttpChunkedDecoder());
+ state_ = STATE_CONTENT;
+ return WAITING;
+ }
}
if (declared_content_length_ == 0) {
// No content data, so parsing is finished.
@@ -155,6 +163,25 @@ HttpRequestParser::ParseResult HttpRequestParser::ParseHeaders() {
HttpRequestParser::ParseResult HttpRequestParser::ParseContent() {
const size_t available_bytes = buffer_.size() - buffer_position_;
+ if (chunked_decoder_.get()) {
+ int bytes_written = chunked_decoder_->FilterBuf(
+ const_cast<char*>(buffer_.data()) + buffer_position_, available_bytes);
+ http_request_->content.append(buffer_.data() + buffer_position_,
+ bytes_written);
+
+ if (chunked_decoder_->reached_eof()) {
+ buffer_ =
+ buffer_.substr(buffer_.size() - chunked_decoder_->bytes_after_eof());
+ buffer_position_ = 0;
+ state_ = STATE_ACCEPTED;
+ return ACCEPTED;
+ }
+ buffer_ = "";
+ buffer_position_ = 0;
+ state_ = STATE_CONTENT;
+ return WAITING;
+ }
+
const size_t fetch_bytes = std::min(
available_bytes,
declared_content_length_ - http_request_->content.size());
« no previous file with comments | « net/test/embedded_test_server/http_request.h ('k') | net/test/embedded_test_server/http_request_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698