diff --git a/includes/Socket.hpp b/includes/Socket.hpp index 380cb02..e208f71 100644 --- a/includes/Socket.hpp +++ b/includes/Socket.hpp @@ -32,7 +32,8 @@ class Socket { std::map sockIODataStore_; Logger const &logger_; - size_t bufferLengthAndSanityCheck_(SocketIOData &sIOD, bool &msgTooLong); + size_t bufferLengthAndSanityCheck_(SocketIOData &sIOD, bool &msgTooLong, + size_t &eolSize); bool checkSocket4Recv(struct pollfd &pfd, SocketIOData &sIOD); // NOLINT public: diff --git a/srcs/server/Socket.cpp b/srcs/server/Socket.cpp index a574bfa..d7dd603 100644 --- a/srcs/server/Socket.cpp +++ b/srcs/server/Socket.cpp @@ -72,46 +72,49 @@ std::string Socket::getCRLFLineFromBuffer(int const fd, bool &buffHasMoreCmds, return ""; SocketIOData &sIOD = *sIODptr; - size_t eol = bufferLengthAndSanityCheck_(sIOD, msgTooLong); + size_t eolSize = 0; + size_t eol = bufferLengthAndSanityCheck_(sIOD, msgTooLong, eolSize); std::string cmdLine; if (eol != std::string::npos) { cmdLine = sIOD.readBuffer.substr(0, eol); - if (!cmdLine.empty() && *cmdLine.rbegin() == '\r') - cmdLine.erase(cmdLine.size() - 1); sIOD.recvErrorCount = 0; - sIOD.readBuffer = sIOD.readBuffer.substr(eol + 1); + sIOD.readBuffer = sIOD.readBuffer.substr(eol + eolSize); } buffHasMoreCmds = ((sIOD.readBuffer.size() > MAXMSGLEN) || (sIOD.readBuffer.find('\n') != std::string::npos)); return cmdLine; } -size_t Socket::bufferLengthAndSanityCheck_(SocketIOData &sIOD, - bool &msgTooLong) { +size_t Socket::bufferLengthAndSanityCheck_(SocketIOData &sIOD, bool &msgTooLong, + size_t &eolSize) { std::string &rdBuffer = sIOD.readBuffer; - size_t eol = rdBuffer.find('\n'); + size_t const eolMaxPos = MAXMSGLEN - 2; + size_t eolPos = rdBuffer.find('\n'); + + eolSize = 1; + if ((eolPos > 0) && (eolPos != std::string::npos) && + (rdBuffer.at(eolPos - 1) == '\r')) { + eolPos -= 1; + eolSize += 1; + } msgTooLong = false; if (!sIOD.discardMode) { if ((rdBuffer.length() < MAXMSGLEN) || - (eol != std::string::npos && eol < MAXMSGLEN)) { - return eol; + ((eolPos != std::string::npos) && (eolPos <= eolMaxPos))) { + return eolPos; } else { sIOD.discardMode = true; msgTooLong = true; } } // discard mode - if (++sIOD.recvErrorCount >= SOCKETERRORLIMIT) { + if (++sIOD.recvErrorCount >= SOCKETERRORLIMIT) sIOD.closeFd = true; - return std::string::npos; - } - if (eol != std::string::npos) { - rdBuffer.erase(0, eol + 1); + else if (eolPos != std::string::npos) { + rdBuffer.erase(0, eolPos + eolSize); sIOD.discardMode = false; - return std::string::npos; - } - if (!rdBuffer.empty() && '\r' == *rdBuffer.rbegin()) + } else if (!rdBuffer.empty() && '\r' == *rdBuffer.rbegin()) rdBuffer = "\r"; else rdBuffer.clear();