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..931ebdcfb536cce5e854e7990c87a23b4c863185 100644 |
--- a/net/test/embedded_test_server/http_request.cc |
+++ b/net/test/embedded_test_server/http_request.cc |
@@ -134,7 +134,14 @@ HttpRequestParser::ParseResult HttpRequestParser::ParseHeaders() { |
// Headers done. Is any content data attached to the request? |
declared_content_length_ = 0; |
- if (http_request_->headers.count("Content-Length") > 0) { |
+ if (http_request_->headers.count("Transfer-Encoding") > 0) { |
mmenke
2015/02/12 15:34:30
Suggest flipping the order - ignoring a Content-Le
xunjieli
2015/02/12 15:58:40
Done.
|
+ if (http_request_->headers["Transfer-Encoding"] == "chunked") { |
+ http_request_->has_content = true; |
+ chunked_decoder_.reset(new HttpChunkedDecoder()); |
+ state_ = STATE_CONTENT; |
+ return WAITING; |
+ } |
+ } else if (http_request_->headers.count("Content-Length") > 0) { |
http_request_->has_content = true; |
const bool success = base::StringToSizeT( |
http_request_->headers["Content-Length"], |
@@ -155,6 +162,21 @@ HttpRequestParser::ParseResult HttpRequestParser::ParseHeaders() { |
HttpRequestParser::ParseResult HttpRequestParser::ParseContent() { |
const size_t available_bytes = buffer_.size() - buffer_position_; |
+ if (chunked_decoder_.get()) { |
mmenke
2015/02/12 15:34:30
nit: The ".get()" isn't needed
xunjieli
2015/02/12 15:58:40
Done.
|
+ std::string result; |
+ result.append(buffer_.data() + buffer_position_, available_bytes); |
+ int bytes_written = chunked_decoder_->FilterBuf( |
+ &result[0], static_cast<int>(result.size())); |
mmenke
2015/02/12 15:34:30
Why do we need result? Can't we just use:
bytes_
xunjieli
2015/02/12 15:58:40
When I tried "chunked_decoder_->FilterBuf(buffer_.
mmenke
2015/02/12 16:17:44
That's because buffer_ is a string (I had assumed
|
+ if (bytes_written > 0 && chunked_decoder_->reached_eof()) { |
+ buffer_position_ += bytes_written; |
mmenke
2015/02/12 15:34:30
This should be outside of the if block. The fact
xunjieli
2015/02/12 15:58:40
It looks like FilterBuf can only parse chunked dat
mmenke
2015/02/12 16:17:44
You're misreading the code. FilterBuf is a stream
|
+ http_request_->content.append(result.data(), bytes_written); |
+ state_ = STATE_ACCEPTED; |
+ return ACCEPTED; |
+ } |
+ state_ = STATE_CONTENT; |
+ return WAITING; |
+ } |
+ |
const size_t fetch_bytes = std::min( |
available_bytes, |
declared_content_length_ - http_request_->content.size()); |