From de2ba47180ca7427ed3385489a6682bf0dde6729 Mon Sep 17 00:00:00 2001 From: marcelb Date: Mon, 22 May 2023 23:06:38 +0200 Subject: [PATCH] Fix API parse method for special cases --- .vscode/settings.json | 30 +++++++++++++++++++++++++++++- README.md | 5 +++++ lib/api.hpp | 1 + src/api.cpp | 31 +++++++++++++++++++------------ test/test.cpp | 4 ++-- test/test.o | Bin 143104 -> 138520 bytes 6 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 README.md diff --git a/.vscode/settings.json b/.vscode/settings.json index fe45693..c79ea77 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,6 +16,34 @@ "streambuf": "cpp", "tuple": "cpp", "type_traits": "cpp", - "utility": "cpp" + "utility": "cpp", + "*.tcc": "cpp", + "bit": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "map": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "algorithm": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "system_error": "cpp", + "iostream": "cpp", + "limits": "cpp", + "numbers": "cpp", + "stdexcept": "cpp", + "typeinfo": "cpp" } } \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..009c9d5 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ + +# A simple API library for C++ + +API implementation, parsing, validation, definition, etc. + diff --git a/lib/api.hpp b/lib/api.hpp index b118e9e..059d321 100644 --- a/lib/api.hpp +++ b/lib/api.hpp @@ -5,6 +5,7 @@ #include #include #include +#include using namespace std; diff --git a/src/api.cpp b/src/api.cpp index b354080..ed08767 100644 --- a/src/api.cpp +++ b/src/api.cpp @@ -48,21 +48,28 @@ bool api::validate() { void api::parse() { - for (uint i=0; ioptions.size(); i++) { - if (body.find("/"+def->options[i]+"/") < body.length()) { - option = def->options[i]; - } + // Extract the query string from the API request + size_t queryStart = body.find('?'); + size_t protocolEnd = body.find("HTTP/"); + if (queryStart == string::npos || (protocolEnd != string::npos && queryStart > protocolEnd)) { + // cout << "No object found in the API request." << endl; + return; } - for (uint i=0; ikeys.size(); i++) { - string key = def->keys[i]+"="; - string value; - if (body.find(key) < body.length()) { - value = body.substr(body.find(key)+key.length(), body.find('&',body.find(key)+key.length())-body.find(key)-key.length() < body.find(' ',body.find(key)+key.length())-body.find(key)-key.length() ? body.find('&',body.find(key)+key.length())-body.find(key)-key.length() : body.find(' ',body.find(key)+key.length())-body.find(key)-key.length()); + size_t queryStringStart = (queryStart != string::npos) ? queryStart + 1 : 0; + string queryString = body.substr(queryStringStart, protocolEnd - queryStringStart); + + // Parse the query string and extract key-value pairs + istringstream iss(queryString); + string parameter; + while (getline(iss, parameter, '&')) { + size_t equalSignPos = parameter.find('='); + if (equalSignPos != string::npos) { + string key = parameter.substr(0, equalSignPos); + string value = parameter.substr(equalSignPos + 1); + object[key] = value; } - object[def->keys[i]] = value; } - } void api::format() { @@ -84,4 +91,4 @@ void api::format() { body.pop_back(); body += " HTTP/1.1"; -} \ No newline at end of file +} diff --git a/test/test.cpp b/test/test.cpp index a050777..5084d54 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -17,9 +17,9 @@ int main() { // cout << myDef.val_matrix["delete"].empty(); - api myApi(&myDef, "GET /update/?id=1&value=true HTTP/1.1"); + api myApi(&myDef, "GET /update/?id=1&value=tru eHTTP/1.1\n"); cout << myApi.object["value"]; -} \ No newline at end of file +} diff --git a/test/test.o b/test/test.o index 2896458d8a938a5e5d3a45504288b07f2762196a..52da17584c4e91c7aab2bf5603a5420adaaeb1be 100755 GIT binary patch delta 34279 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⪚I)n9|6CvpwQhG!m8)f11&KOpzbhIeVu(*m6g9Pp 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 YIpJ#cv-wLZU#O?@a){16y@qQ1fAwCsqW}N^