@@ -284,34 +284,33 @@ void HTTPConnection::raiseError(uint16_t code, std::string reason) {
284284}
285285
286286void HTTPConnection::readLine (int lengthLimit) {
287- _parserLine.text .reserve (lengthLimit);
287+ // Limit + CR size
288+ _parserLine.text .reserve (lengthLimit+1 );
288289 while (_bufferProcessed < _bufferUnusedIdx) {
289290 char newChar = _receiveBuffer[_bufferProcessed];
290291
291- if ( newChar == ' \r ' ) {
292- // Look ahead for \n (if not possible, wait for next round
293- if (_bufferProcessed+1 < _bufferUnusedIdx) {
294- if (_receiveBuffer[_bufferProcessed+1 ] == ' \n ' ) {
295- _bufferProcessed += 2 ;
296- _parserLine.parsingFinished = true ;
297- return ;
298- } else {
299- // Line has not been terminated by \r\n
300- HTTPS_LOGW (" Line without \\ r\\ n (got only \\ r). FID=%d" , _socket);
301- raiseError (400 , " Bad Request" );
302- return ;
303- }
304- } else { // meh, but still ok in most cases
305- _bufferProcessed += 1 ;
306- _parserLine.parsingFinished = true ;
292+ if (_parserLine.text .length () && _parserLine.text .back () == ' \r ' ) {
293+ if (newChar != ' \n ' ) {
294+ // Line has not been terminated by \r\n
295+ HTTPS_LOGW (" Line without \\ r\\ n (got only \\ r). FID=%d" , _socket);
296+ raiseError (400 , " Bad Request" );
307297 return ;
308298 }
309- } else if (newChar == ' \n ' ) {
310- // The next buffer after the '\r' which was at the end of the prev buffer.
311- // Don't care about "\r\n\n"
312299 _bufferProcessed += 1 ;
313- } else if (newChar < 32 ) { // all '\r' and '\n' was above so any other char is invalid
314- HTTPS_LOGW (" Recieved invalid character (%d) in headedrs FID=%d" , (int )newChar, _socket);
300+ _parserLine.text .resize (_parserLine.text .length ()-1 );
301+ _parserLine.parsingFinished = true ;
302+ return ;
303+ }
304+
305+ if ( newChar == ' \r ' ) {
306+ _parserLine.text += newChar;
307+ _bufferProcessed += 1 ;
308+ } else if (newChar < 32 ) {
309+ if (newChar == ' \n ' ) {
310+ HTTPS_LOGW (" Line without \\ r\\ n (got only \\ n). FID=%d" , _socket);
311+ } else {
312+ HTTPS_LOGW (" Recieved invalid character (%d) in headedrs FID=%d" , (int )newChar, _socket);
313+ }
315314 raiseError (400 , " Bad Request" );
316315 return ;
317316 } else {
0 commit comments