Pārlūkot izejas kodu

Support 1xx non-final response

Tatsuhiro Tsujikawa 9 gadi atpakaļ
vecāks
revīzija
2df30b1447
2 mainītis faili ar 17 papildinājumiem un 1 dzēšanām
  1. 13 1
      src/HttpConnection.cc
  2. 4 0
      src/HttpConnection.h

+ 13 - 1
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());

+ 4 - 0
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_;