summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2016-11-03 17:28:45 +0900
committerGitHub <noreply@github.com>2016-11-03 17:28:45 +0900
commitb4010a52c8249fe46771004013e3d6a700c0d4f0 (patch)
tree5903c95afc2485645388a9477cfa45cf0bbdac4e
parenta9a60cef1bac42512940d77fd031c3b301629498 (diff)
parent2df30b144748dda434aa0002d636220e1f3aa87b (diff)
Merge pull request #766 from aria2/support-1xx
Support 1xx non-final response
-rw-r--r--src/HttpConnection.cc14
-rw-r--r--src/HttpConnection.h4
2 files changed, 17 insertions, 1 deletions
diff --git a/src/HttpConnection.cc b/src/HttpConnection.cc
index d29f4a30..77cb9d27 100644
--- a/src/HttpConnection.cc
+++ b/src/HttpConnection.cc
@@ -68,6 +68,11 @@ HttpRequestEntry::HttpRequestEntry(std::unique_ptr<HttpRequest> httpRequest)
{
}
+void HttpRequestEntry::resetHttpHeaderProcessor()
+{
+ proc_ = make_unique<HttpHeaderProcessor>(HttpHeaderProcessor::CLIENT_PARSER);
+}
+
std::unique_ptr<HttpRequest> HttpRequestEntry::popHttpRequest()
{
return std::move(httpRequest_);
@@ -151,9 +156,16 @@ std::unique_ptr<HttpResponse> HttpConnection::receiveResponse()
socketRecvBuffer_->getBufferLength())) {
A2_LOG_INFO(
fmt(MSG_RECEIVE_RESPONSE, cuid_, proc->getHeaderString().c_str()));
+ auto result = proc->getResult();
+ if (result->getStatusCode() / 100 == 1) {
+ socketRecvBuffer_->drain(proc->getLastBytesProcessed());
+ outstandingHttpRequests_.front()->resetHttpHeaderProcessor();
+ return nullptr;
+ }
+
auto httpResponse = make_unique<HttpResponse>();
httpResponse->setCuid(cuid_);
- httpResponse->setHttpHeader(proc->getResult());
+ httpResponse->setHttpHeader(std::move(result));
httpResponse->setHttpRequest(
outstandingHttpRequests_.front()->popHttpRequest());
socketRecvBuffer_->drain(proc->getLastBytesProcessed());
diff --git a/src/HttpConnection.h b/src/HttpConnection.h
index 205dd9ba..54da32d1 100644
--- a/src/HttpConnection.h
+++ b/src/HttpConnection.h
@@ -62,6 +62,10 @@ private:
public:
HttpRequestEntry(std::unique_ptr<HttpRequest> httpRequest);
+ // Resets proc_ by recreating the object. Thus any object obtained
+ // by getHttpRequest() before this call is invalidated.
+ void resetHttpHeaderProcessor();
+
const std::unique_ptr<HttpRequest>& getHttpRequest() const
{
return httpRequest_;