commit 64cd92d041fd5f604ca26f26de9bd98f21be33df Author: Günther Brammer Date: Sat Oct 16 23:30:32 2010 +0200 Net: Do not require Content-Length in HTTP response diff --git a/src/network/C4NetIO.cpp b/src/network/C4NetIO.cpp index 61785d0..985f4bd 100644 --- a/src/network/C4NetIO.cpp +++ b/src/network/C4NetIO.cpp @@ -580,19 +580,24 @@ bool C4NetIOTCP::Execute(int iMaxTime, pollfd *fds) // (mt-safe) // Would block? Ok, let's try this again later if (HaveWouldBlockError()) { ResetSocketError(); break; } // So he's serious after all... - pPeer->Close (); + pPeer->Close(); if (pCB) pCB->OnDisconn(pPeer->GetAddr(), this, GetSocketErrorMsg()); break; } - // nothing? this means the conection was closed, if you trust in linux manpages. + // pass to Peer::OnRecv + pPeer->OnRecv(iBytesRead); + // nothing? this means the connection was closed without error if (!iBytesRead) { pPeer->Close(); if (pCB) pCB->OnDisconn(pPeer->GetAddr(), this, "connection closed"); break; } - // pass to Peer::OnRecv - pPeer->OnRecv(iBytesRead); + else if (iBytesRead == iBytesToRead) + { + // Could read everything, no need to loop around + break; + } } // socket has become writeable? @@ -609,6 +614,7 @@ bool C4NetIOTCP::Execute(int iMaxTime, pollfd *fds) // (mt-safe) if (wsaEvents.lNetworkEvents & FD_CLOSE) { const char *szReason = wsaEvents.iErrorCode[FD_CLOSE_BIT] ? GetSocketErrorMsg(wsaEvents.iErrorCode[FD_CLOSE_BIT]) : "closed by peer"; + pPeer->OnRecv(0); // close socket pPeer->Close(); // do callback @@ -1110,7 +1116,7 @@ void C4NetIOTCP::PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutBuf) rOutBuf.Write(rPacket, iPos); } -size_t C4NetIOTCP::UnpackPacket(const StdBuf &IBuf, const C4NetIO::addr_t &addr) +size_t C4NetIOTCP::UnpackPacket(const StdBuf &IBuf, const C4NetIO::addr_t &addr, bool) { size_t iPos = 0; // check first byte (should be 0xff) @@ -1237,7 +1243,7 @@ void C4NetIOTCP::Peer::OnRecv(int iSize) // (mt-safe) { // Try to unpack a packet StdBuf IBufPart = IBuf.getPart(iPos, iIBufUsage - iPos); - int32_t iBytes = pParent->UnpackPacket(IBufPart, addr); + int32_t iBytes = pParent->UnpackPacket(IBufPart, addr, iSize == 0); // Could not unpack? if (!iBytes) break; diff --git a/src/network/C4NetIO.h b/src/network/C4NetIO.h index 1f3639c..dcea24d 100644 --- a/src/network/C4NetIO.h +++ b/src/network/C4NetIO.h @@ -227,7 +227,7 @@ protected: // Extract a packet from the start of the input buffer (if possible) and call OnPacket. // Should return the numer of bytes used. - virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &Addr); + virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &Addr, bool last); // *** data diff --git a/src/network/C4Network2IRC.cpp b/src/network/C4Network2IRC.cpp index 8eee85b..fae2137 100644 --- a/src/network/C4Network2IRC.cpp +++ b/src/network/C4Network2IRC.cpp @@ -211,7 +211,7 @@ void C4Network2IRCClient::PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutB *pPos = '\r'; *(pPos + 1) = '\n'; } -size_t C4Network2IRCClient::UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr) +size_t C4Network2IRCClient::UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr, bool) { // Find line separation const char *pSep = reinterpret_cast(memchr(rInBuf.getData(), '\n', rInBuf.getSize())); diff --git a/src/network/C4Network2IRC.h b/src/network/C4Network2IRC.h index 31b35d6..a3cd73a 100644 --- a/src/network/C4Network2IRC.h +++ b/src/network/C4Network2IRC.h @@ -157,7 +157,7 @@ private: // Overridden virtual void PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutBuf); - virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr); + virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr, bool); // Callbacks bool OnConn(const C4NetIO::addr_t &AddrPeer, const C4NetIO::addr_t &AddrConnect, const addr_t *pOwnAddr, C4NetIO *pNetIO); diff --git a/src/network/C4Network2Reference.cpp b/src/network/C4Network2Reference.cpp index 763c7c4..4d13a2b 100644 --- a/src/network/C4Network2Reference.cpp +++ b/src/network/C4Network2Reference.cpp @@ -170,7 +170,7 @@ void C4Network2RefServer::PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutB rOutBuf.Append(rPacket); } -size_t C4Network2RefServer::UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr) +size_t C4Network2RefServer::UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr, bool) { const char *pData = getBufPtr(rInBuf); // Check for complete header @@ -237,7 +237,7 @@ void C4Network2HTTPClient::PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOut rOutBuf.Append(rPacket); } -size_t C4Network2HTTPClient::UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr) +size_t C4Network2HTTPClient::UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr, bool last) { // since new data arrived, increase timeout time ResetRequestTimeout(); @@ -261,12 +261,12 @@ size_t C4Network2HTTPClient::UnpackPacket(const StdBuf &rInBuf, const C4NetIO::a } iDownloadedSize = rInBuf.getSize() - iDataOffset; // Check if the packet is complete - if (iTotalSize > iDownloadedSize) + if ((iTotalSize == -1 && !last) || iTotalSize > iDownloadedSize) { return 0; } // Get data, uncompress it if needed - StdBuf Data = rInBuf.getPart(iDataOffset, iTotalSize); + StdBuf Data = rInBuf.getPart(iDataOffset, iTotalSize == -1 ? iDownloadedSize : iTotalSize); if (fCompressed) if (!Decompress(&Data)) { @@ -321,8 +321,7 @@ bool C4Network2HTTPClient::ReadHeader(StdStrBuf Data) if (!pContentLength || pContentLength > pContent || sscanf(pContentLength, "%d", &iContentLength) != 1) { - Error.Format("Invalid server response: Content-Length is missing!"); - return false; + iContentLength = -1; } iTotalSize = iContentLength; iDataOffset = (pContent - pData); diff --git a/src/network/C4Network2Reference.h b/src/network/C4Network2Reference.h index dfc0c6c..34f9f9b 100644 --- a/src/network/C4Network2Reference.h +++ b/src/network/C4Network2Reference.h @@ -102,7 +102,7 @@ public: protected: // Overridden virtual void PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutBuf); - virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr); + virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr, bool); private: // Responses @@ -145,7 +145,7 @@ protected: // Overridden virtual void PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutBuf); - virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr); + virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr, bool); // Callbacks bool OnConn(const C4NetIO::addr_t &AddrPeer, const C4NetIO::addr_t &AddrConnect, const addr_t *pOwnAddr, C4NetIO *pNetIO); diff --git a/src/script/C4AulDebug.cpp b/src/script/C4AulDebug.cpp index fe4e149..ce4c27d 100644 --- a/src/script/C4AulDebug.cpp +++ b/src/script/C4AulDebug.cpp @@ -38,7 +38,7 @@ void C4AulDebug::PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutBuf) *pPos = '\r'; *(pPos + 1) = '\n'; } -size_t C4AulDebug::UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr) +size_t C4AulDebug::UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr, bool) { // Find line separation const char *pSep = reinterpret_cast(memchr(rInBuf.getData(), '\n', rInBuf.getSize())); diff --git a/src/script/C4AulDebug.h b/src/script/C4AulDebug.h index 3c0c60d..ac16119 100644 --- a/src/script/C4AulDebug.h +++ b/src/script/C4AulDebug.h @@ -41,7 +41,7 @@ private: // Overridden virtual void PackPacket(const C4NetIOPacket &rPacket, StdBuf &rOutBuf); - virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr); + virtual size_t UnpackPacket(const StdBuf &rInBuf, const C4NetIO::addr_t &addr, bool); // Callbacks bool OnConn(const C4NetIO::addr_t &AddrPeer, const C4NetIO::addr_t &AddrConnect, const addr_t *pOwnAddr, C4NetIO *pNetIO);