From 7c393c90c353c2774f1be879ed73762bcca0f485 Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Thu, 30 Aug 2018 00:27:23 +0200 Subject: [PATCH] Fix URL query separation --- main.cpp | 11 +++++------ src/HttpParser.h | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/main.cpp b/main.cpp index 288f576..3a414ce 100644 --- a/main.cpp +++ b/main.cpp @@ -71,14 +71,13 @@ int main(int argc, char **argv) { uWS::App a; // or uWS::SSLApp(options) for SSL - a/*.onGet("/", [](auto *s, auto *req, auto *args) { - std::cout << "URL: /" << std::endl; - std::cout << "user-agent: " << req->getHeader("user-agent") << std::endl; + a.onGet("/", [](auto *s, auto *req, auto *args) { - std::cout << "upgrade: " << req->getHeader("upgrade") << std::endl; + std::cout << "URL: <" << req->getUrl() << ">" << std::endl; + std::cout << "Query: <" << req->getQuery() << ">" << std::endl; + std::cout << "User-Agent: <" << req->getHeader("user-agent") << ">" << std::endl; - - })*/.onWebSocket("/", [](auto *ws, auto *req, auto *args) { + }).onWebSocket("/ws", [](auto *ws, auto *req, auto *args) { std::cout << "WebSocket connected to /wsApi" << std::endl; diff --git a/src/HttpParser.h b/src/HttpParser.h index 22f926b..a169f6c 100644 --- a/src/HttpParser.h +++ b/src/HttpParser.h @@ -14,6 +14,7 @@ private: struct Header { std::string_view key, value; } headers[MAX_HEADERS]; + int querySeparator; public: std::string_view getHeader(std::string_view header) { @@ -25,8 +26,17 @@ public: return std::string_view(nullptr, 0); } + // todo: implement this + int getHeader(std::string_view header) { + return 0; + } + std::string_view getUrl() { - return headers->value; + return std::string_view(headers->value.data(), querySeparator); + } + + std::string_view getQuery() { + return std::string_view(headers->value.data() + querySeparator, headers->value.length() - querySeparator); } }; @@ -89,6 +99,10 @@ private: req->headers->value = std::string_view(req->headers->value.data(), std::max(0, req->headers->value.length() - 9)); + // querySeparator is untested, todo: go through this + const char *querySeparatorPtr = (const char *) memchr(req->headers->value.data(), '?', req->headers->value.length()); + req->querySeparator = (querySeparatorPtr ? querySeparatorPtr : req->headers->value.data() + req->headers->value.length()) - req->headers->value.data(); + requestHandler(user, req); std::string_view contentLengthString = req->getHeader("content-length");