From 42b3ed44150c1f81a82553aab237efa774d2eb43 Mon Sep 17 00:00:00 2001 From: apio Date: Fri, 7 Oct 2022 16:38:14 +0200 Subject: [PATCH] Ready. Set. Go! --- .gitignore | 2 ++ CMakeLists.txt | 10 ++++++ main.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++ static/favicon.ico | Bin 0 -> 111997 bytes static/index.html | 12 +++++++ static/script.js | 1 + 6 files changed, 104 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 main.cpp create mode 100644 static/favicon.ico create mode 100644 static/index.html create mode 100644 static/script.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..065e739 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/** +.vscode/** diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..265747b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.8..3.22) + +project(example-webcxx-app LANGUAGES CXX) + +add_executable(main main.cpp) + +include(webcxx/CMakeLists.txt) + +target_include_directories(main PUBLIC ${webcxx_include}) +target_link_libraries(main PUBLIC ${webcxx_libs}) \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..14de64a --- /dev/null +++ b/main.cpp @@ -0,0 +1,79 @@ +#include "webcxx/App.h" +#include "webcxx/Request.h" +#include "webcxx/Response.h" +#include "webcxx/Map.h" +#include +#include + +using namespace webcxx; + +int main() { + auto app = App::create(); + + app->set_static_resource_path("/public"); + + app->set_favicon("static/favicon.ico"); + + app->on(GET, "/", + [](Request &req) { return html("

Hello, webcxx world!

"); }); + + app->on(GET, "/index.html", + [](Request& req) { return file("static/index.html"); }); + + app->on(GET, "/teapot", [](Request &req) { return error(418); }); + + app->on(GET, "/google", + [](Request &req) { return redirect("https://www.google.com"); }); + + app->on(GET, "/args", [](Request &req) { + auto args = req.args(); + if (args.contains("kirby") && args["kirby"] == "poyo") { + return html("

POYO!!

"); + } + return error(418); + }); + + app->on(GET, "/user-agent", [](Request &req) { + auto headers = req.headers(); + if (!headers.contains("User-Agent")) + return error(400); + return html(headers["User-Agent"], "Your user agent is..."); + }); + + app->on(POST, "/post", [](Request &req) { return html(req.content()); }); + + app->on(GET | POST, "/multiple", [](Request &req) { + return html(req.method() == GET ? "

GET

" : "

POST

"); + }); + + app->on(GET, "/all_args", [](Request& req){ + std::ostringstream ss; + for(const auto& arg : req.args()) + { + ss << "

"; + ss << arg.first; + ss << ":"; + ss << arg.second; + ss << "

"; + } + return html("
" + ss.str() + "
"); + }); + + app->on(GET, "/fail", [](Request& req) { + throw std::runtime_error("runtime error"); + return error(404); + }); + + app->on(GET, "/user", [](Request& req) { + auto args = req.args(); + if(!args.contains("username")) return error(400); + if(args["username"] != "john_doe") return error(404); + return html("

John Doe

"); + }); + + app->on_error(404, [](){ + return html("

Sorry, page not found

", "Page not found"); + }); + + return app->run(8080); +} \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..351efa2cc5cc8dd6979ad9b6a60971d3cd9b7701 GIT binary patch literal 111997 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 + + + + + + Index + + + download evo2 + + \ No newline at end of file diff --git a/static/script.js b/static/script.js new file mode 100644 index 0000000..acbc445 --- /dev/null +++ b/static/script.js @@ -0,0 +1 @@ +alert("hello world!"); \ No newline at end of file