From 29891890488a260096bcc84e16cf9ee7b459ac4d Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Sun, 11 Oct 2020 19:56:35 +0200 Subject: [PATCH] Fix up the ParameterParser a bit more --- src/Multipart.h | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/Multipart.h b/src/Multipart.h index 093254b..70e5b5f 100644 --- a/src/Multipart.h +++ b/src/Multipart.h @@ -64,7 +64,10 @@ namespace uWS { } if (op[0] != ';') { - return {key, getToken()}; + auto value = getToken(); + /* Strip ; or if at end, nothing */ + getToken(); + return {key, value}; } return {key, ""}; @@ -91,18 +94,33 @@ namespace uWS { remainingLine.remove_prefix(1); return op; } else { - /* This part is not entirely correct */ - - /* Read the whole alpha word */ - std::string_view token = remainingLine; - - int tokenLength = 0; - while (remainingLine.length() && remainingLine[0] != ';' && remainingLine[0] != '=' && !isspace(remainingLine[0])) { + /* Are we at a quoted string? */ + if (remainingLine[0] == '\"') { + /* Remove first quote and start counting */ remainingLine.remove_prefix(1); - tokenLength++; - } + auto quote = remainingLine; + int quoteLength = 0; - return token.substr(0, tokenLength); + /* Read anything until other double quote appears */ + while (remainingLine.length() && remainingLine[0] != '\"') { + remainingLine.remove_prefix(1); + quoteLength++; + } + + remainingLine.remove_prefix(1); + return quote.substr(0, quoteLength); + } else { + /* Read anything until ; = space or end */ + std::string_view token = remainingLine; + + int tokenLength = 0; + while (remainingLine.length() && remainingLine[0] != ';' && remainingLine[0] != '=' && !isspace(remainingLine[0])) { + remainingLine.remove_prefix(1); + tokenLength++; + } + + return token.substr(0, tokenLength); + } } }