diff --git a/uppsrc/Core/Http.cpp b/uppsrc/Core/Http.cpp index cd649e8ce..3219b63d9 100644 --- a/uppsrc/Core/Http.cpp +++ b/uppsrc/Core/Http.cpp @@ -383,7 +383,7 @@ bool HttpRequest::Do() StartPhase(CHUNK_HEADER); break; case TRAILER: - if(ReadingHeader()) + if(ReadingTrailer()) break; header.ParseAdd(data); Finish(); @@ -665,6 +665,23 @@ bool HttpRequest::ReadingHeader() } } +bool HttpRequest::ReadingTrailer() +{ + for(;;) { + int c = TcpSocket::Get(); + if(c < 0) + return !IsEof(); + else + data.Cat(c); + if(data.GetCount() == 2) { + if(data[0] == '\r' && data[1] == '\n') + return false; + HttpError("Invalid chunk trailer"); + return true; + } + } +} + void HttpRequest::ReadingChunkHeader() { for(;;) { diff --git a/uppsrc/Core/Inet.h b/uppsrc/Core/Inet.h index 4b5652d07..cb7566fe2 100644 --- a/uppsrc/Core/Inet.h +++ b/uppsrc/Core/Inet.h @@ -400,6 +400,7 @@ class HttpRequest : public TcpSocket { bool SendingData(bool request = false); bool ReadingHeader(); + bool ReadingTrailer(); void StartBody(); bool ReadingBody(); void ReadingChunkHeader();