diff --git a/uppsrc/Core/Http.cpp b/uppsrc/Core/Http.cpp index c537404c7..69fcff385 100644 --- a/uppsrc/Core/Http.cpp +++ b/uppsrc/Core/Http.cpp @@ -379,9 +379,14 @@ bool HttpRequest::Do() case CHUNK_BODY: if(ReadingBody()) break; - c1 = TcpSocket::Get(); - c2 = TcpSocket::Get(); - if(c1 != '\r' || c2 != '\n') + StartPhase(CHUNK_CRLF); + break; + case CHUNK_CRLF: + if(chunk_crlf.GetCount() < 2) + chunk_crlf.Cat(TcpSocket::Get(2 - chunk_crlf.GetCount())); + if(chunk_crlf.GetCount() < 2) + break; + if(chunk_crlf != "\r\n") HttpError("missing ending CRLF in chunked transfer"); StartPhase(CHUNK_HEADER); break; @@ -692,6 +697,7 @@ void HttpRequest::ReadingChunkHeader() } count += n; StartPhase(CHUNK_BODY); + chunk_crlf.Clear(); break; } if(c != '\r') @@ -894,6 +900,7 @@ String HttpRequest::GetPhaseName() const "Receiving content", "Receiving chunk header", "Receiving content chunk", + "Receiving content chunk ending", "Receiving trailer", "Request with continue", "Waiting for continue header", diff --git a/uppsrc/Core/Inet.h b/uppsrc/Core/Inet.h index d77b7c48a..a5f6c4b0a 100644 --- a/uppsrc/Core/Inet.h +++ b/uppsrc/Core/Inet.h @@ -414,7 +414,8 @@ class HttpRequest : public TcpSocket { Stream *poststream; int64 postlen; - + + String chunk_crlf; void Init(); @@ -557,7 +558,7 @@ public: BEGIN, START, DNS, SSLPROXYREQUEST, SSLPROXYRESPONSE, SSLHANDSHAKE, REQUEST, HEADER, BODY, - CHUNK_HEADER, CHUNK_BODY, TRAILER, + CHUNK_HEADER, CHUNK_BODY, CHUNK_CRLF, TRAILER, FINISHED, FAILED, };