Skip to content

Commit cf7fd27

Browse files
committed
Created universal checking of \r\n
1 parent 7b10a07 commit cf7fd27

File tree

1 file changed

+21
-22
lines changed

1 file changed

+21
-22
lines changed

src/HTTPConnection.cpp

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -284,34 +284,33 @@ void HTTPConnection::raiseError(uint16_t code, std::string reason) {
284284
}
285285

286286
void 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

Comments
 (0)