From 449ad7a82decf1ed830bc8826ff82a22e1a4bada Mon Sep 17 00:00:00 2001 From: The-EDev Date: Thu, 24 Jun 2021 11:48:01 +0300 Subject: [PATCH 01/51] added missing line to docs --- docs/getting_started/your_first_application.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/getting_started/your_first_application.md b/docs/getting_started/your_first_application.md index 3257b6dd9..95edbbe7f 100644 --- a/docs/getting_started/your_first_application.md +++ b/docs/getting_started/your_first_application.md @@ -1,7 +1,7 @@ This page shows how you can get started with a simple hello world application. ##1. Include -Starting with an empty `main.cpp` file, add `#!cpp #define CROW_MAIN` then `#!cpp #include "crow.h"` or `#!cpp #include "crow_all.h"` if you're using the single header file. +Starting with an empty `main.cpp` file, first add `#!cpp #define CROW_MAIN` then `#!cpp #include "crow.h"` or `#!cpp #include "crow_all.h"` if you're using the single header file. !!! note @@ -39,6 +39,7 @@ Please note that the `port()` and `multithreaded()` methods aren't needed, Thoug Once you've followed all the steps above, your code should look similar to this ``` cpp linenums="1" +#define CROW_MAIN //let the compiler know this is your main cpp file #include "crow.h" //#include "crow_all.h" From 189e0709b14e2c782f9dd94609bfd3af1212e1df Mon Sep 17 00:00:00 2001 From: The-EDev Date: Mon, 28 Jun 2021 13:01:12 +0300 Subject: [PATCH 02/51] explained CROW_JSON_NO_ERROR_CHECK --- docs/guides/json.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/guides/json.md b/docs/guides/json.md index 15123e385..9ed7748a4 100644 --- a/docs/guides/json.md +++ b/docs/guides/json.md @@ -36,3 +36,7 @@ An object type `wvalue` uses `std::unordered_map` by default, if you want to hav A JSON `wvalue` can be returned directly inside a route handler, this will cause the `content-type` header to automatically be set to `Application/json` and the JSON value will be converted to string and placed in the response body. For more information go to [Routes](../routes).

For more info on write values go [here](../../reference/classcrow_1_1json_1_1wvalue.html). + +!!!note + + Crow's json exceptions can be disabled by using the `#!cpp #define CROW_JSON_NO_ERROR_CHECK` macro. This should increase the program speed with the drawback of having unexpected behavious when used incorrectly (e.g. by attempting to parse an invalid json object). From f95f11547e29033cf6d0fe0b8f4d488ae71351e5 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Mon, 28 Jun 2021 18:56:27 +0300 Subject: [PATCH 03/51] added CROW_MAIN definition to readme examples (also mkdocs index) --- README.md | 3 ++- docs/index.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 15d8e8292..7a61e800d 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,8 @@ Available [here](https://crowcpp.github.io/crow). ## Examples #### Hello World -```c++ +```cpp +#define CROW_MAIN #include "crow.h" int main() diff --git a/docs/index.md b/docs/index.md index d1835284d..b934695fd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -35,7 +35,8 @@ Available [here](https://crowcpp.github.io/crow). ## Examples #### Hello World -```c++ +```cpp +#define CROW_MAIN #include "crow.h" int main() From 0593f42522d5d91526b54cb4adbee719ef0d5859 Mon Sep 17 00:00:00 2001 From: Luca Schlecker Date: Mon, 28 Jun 2021 18:05:34 +0200 Subject: [PATCH 04/51] http_response: fix move assign operator not moving file_info. Signed-off-by: Luca Schlecker --- include/crow/http_response.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/crow/http_response.h b/include/crow/http_response.h index 2b28353b8..18ac7cc72 100644 --- a/include/crow/http_response.h +++ b/include/crow/http_response.h @@ -87,6 +87,7 @@ namespace crow code = r.code; headers = std::move(r.headers); completed_ = r.completed_; + file_info = std::move(r.file_info); return *this; } From ea07b8ac0446ba2dc41ca10680607cb045049e1f Mon Sep 17 00:00:00 2001 From: odeits Date: Sat, 3 Jul 2021 17:08:12 +0200 Subject: [PATCH 05/51] Fix typo in example_with_all.cpp --- examples/example_with_all.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/example_with_all.cpp b/examples/example_with_all.cpp index 3874cdc86..a015e6b3a 100644 --- a/examples/example_with_all.cpp +++ b/examples/example_with_all.cpp @@ -42,7 +42,7 @@ int main() return crow::response(os.str()); }); - // example which uses only response as a paramter wihtout + // example which uses only response as a paramter without // request being a parameter. CROW_ROUTE(app,"/add//") ([](crow::response& res, int a, int b){ From 1d270fae19795a8e4a09363590162ac03ae6fc1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mr=C3=B3z?= Date: Sat, 3 Jul 2021 22:02:32 +0200 Subject: [PATCH 06/51] Add release script. Change server name to use release version to build name. --- CMakeLists.txt | 6 ++++++ include/crow/app.h | 5 +++-- include/crow/http_server.h | 7 ++++--- include/crow/version.h | 3 +++ scripts/release.py | 21 +++++++++++++++++++++ vcpkg.json | 32 ++++++++++++++++---------------- 6 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 include/crow/version.h create mode 100755 scripts/release.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 342cb13a4..ec229c0b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,3 +75,9 @@ endif() # Install Files ##################################### install(FILES ${CMAKE_CURRENT_BINARY_DIR}/crow_all.h DESTINATION include) + +set(CPACK_GENERATOR "DEB") +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "CrowCpp") +set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) + +include(CPack) diff --git a/include/crow/app.h b/include/crow/app.h index 1c9f03e7a..8c5b03380 100644 --- a/include/crow/app.h +++ b/include/crow/app.h @@ -10,6 +10,7 @@ #include #include +#include "crow/version.h" #include "crow/settings.h" #include "crow/logging.h" #include "crow/utility.h" @@ -120,7 +121,7 @@ namespace crow return *this; } - ///Set the server name (default Crow/0.3) + ///Set the server name self_t& server_name(std::string server_name) { server_name_ = server_name; @@ -360,7 +361,7 @@ namespace crow private: uint16_t port_ = 80; uint16_t concurrency_ = 1; - std::string server_name_ = "Crow/0.3"; + std::string server_name_ = std::string("Crow/") + VERSION; std::string bindaddr_ = "0.0.0.0"; Router router_; diff --git a/include/crow/http_server.h b/include/crow/http_server.h index 3e3a65a51..e6efa6fb0 100644 --- a/include/crow/http_server.h +++ b/include/crow/http_server.h @@ -13,6 +13,7 @@ #include +#include "crow/version.h" #include "crow/http_connection.h" #include "crow/logging.h" #include "crow/dumb_timer_queue.h" @@ -26,7 +27,7 @@ namespace crow class Server { public: - Server(Handler* handler, std::string bindaddr, uint16_t port, std::string server_name = "Crow/0.3", std::tuple* middlewares = nullptr, uint16_t concurrency = 1, typename Adaptor::context* adaptor_ctx = nullptr) + Server(Handler* handler, std::string bindaddr, uint16_t port, std::string server_name = std::string("Crow/") + VERSION, std::tuple* middlewares = nullptr, uint16_t concurrency = 1, typename Adaptor::context* adaptor_ctx = nullptr) : acceptor_(io_service_, tcp::endpoint(boost::asio::ip::address::from_string(bindaddr), port)), signals_(io_service_, SIGINT, SIGTERM), tick_timer_(io_service_), @@ -121,7 +122,7 @@ namespace crow init_count ++; while(1) { - try + try { if (io_service_pool_[i]->run() == 0) { @@ -135,7 +136,7 @@ namespace crow } })); - if (tick_function_ && tick_interval_.count() > 0) + if (tick_function_ && tick_interval_.count() > 0) { tick_timer_.expires_from_now(boost::posix_time::milliseconds(tick_interval_.count())); tick_timer_.async_wait([this](const boost::system::error_code& ec) diff --git a/include/crow/version.h b/include/crow/version.h new file mode 100644 index 000000000..d417df206 --- /dev/null +++ b/include/crow/version.h @@ -0,0 +1,3 @@ +#pragma once + +constexpr char VERSION[] = "master"; diff --git a/scripts/release.py b/scripts/release.py new file mode 100755 index 000000000..31b14cccd --- /dev/null +++ b/scripts/release.py @@ -0,0 +1,21 @@ +#!/bin/env python3 +import os +import sys +import shutil + +if len(sys.argv) != 2: + print("Usage: {} VERSION".format(sys.argv[0])) + sys.exit(1) + +version = str(sys.argv[1]) + +releasePath = os.path.join(os.path.dirname(__file__), "..", "build_release") + +if os.path.exists(releasePath): + shutil.rmtree(releasePath) + +os.mkdir(releasePath) +os.chdir(releasePath) +os.system("cmake -DCPACK_PACKAGE_FILE_NAME=\"crow-{}\" .. && make -j5".format(version)) +os.system("sed -i 's/constexpr char VERSION\\[\\] = \"master\";/constexpr char VERSION\\[\\] = \"{}\";/g' crow_all.h".format(version)) +os.system("cpack") diff --git a/vcpkg.json b/vcpkg.json index e9bfcd371..3b79e4a4a 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,37 +1,37 @@ { "name": "crow-examples", - "version": "0.3", + "version": "master", "dependencies": [ { "name": "boost-array", - "version>=": "1.70.0" + "version>=": "1.70.0" }, { "name": "boost-algorithm", - "version>=": "1.70.0" + "version>=": "1.70.0" }, { "name": "boost-asio", - "version>=": "1.70.0" + "version>=": "1.70.0" }, { "name": "boost-date-time", - "version>=": "1.70.0" + "version>=": "1.70.0" }, { "name": "boost-functional", - "version>=": "1.70.0" + "version>=": "1.70.0" }, { "name": "boost-lexical-cast", - "version>=": "1.70.0" + "version>=": "1.70.0" }, { "name": "boost-optional", - "version>=": "1.70.0" + "version>=": "1.70.0" }, { - "name": "openssl-windows" + "name": "openssl-windows" }, { "name": "zlib" @@ -40,31 +40,31 @@ "overrides": [ { "name": "boost-array", - "version": "1.70.0" + "version": "1.70.0" }, { "name": "boost-algorithm", - "version": "1.70.0" + "version": "1.70.0" }, { "name": "boost-asio", - "version-semver": "1.70.0-2" + "version-semver": "1.70.0-2" }, { "name": "boost-date-time", - "version": "1.70.0" + "version": "1.70.0" }, { "name": "boost-functional", - "version": "1.70.0" + "version": "1.70.0" }, { "name": "boost-lexical-cast", - "version": "1.70.0" + "version": "1.70.0" }, { "name": "boost-optional", - "version": "1.70.0" + "version": "1.70.0" } ], "builtin-baseline": "44d94c2edbd44f0c01d66c2ad95eb6982a9a61bc" From fea3eb03d08182641c8ff4d97f79ca5ceeb6bad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mr=C3=B3z?= Date: Sun, 4 Jul 2021 21:41:00 +0200 Subject: [PATCH 07/51] Turn off building examples and tests in release script. --- scripts/release.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/release.py b/scripts/release.py index 31b14cccd..3072dd195 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -16,6 +16,6 @@ os.mkdir(releasePath) os.chdir(releasePath) -os.system("cmake -DCPACK_PACKAGE_FILE_NAME=\"crow-{}\" .. && make -j5".format(version)) +os.system("cmake -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DCPACK_PACKAGE_FILE_NAME=\"crow-{}\" .. && make -j5".format(version)) os.system("sed -i 's/constexpr char VERSION\\[\\] = \"master\";/constexpr char VERSION\\[\\] = \"{}\";/g' crow_all.h".format(version)) os.system("cpack") From c46af69f415d089c4f3a318f02aaacb4c66c0402 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Mon, 5 Jul 2021 12:14:31 +0300 Subject: [PATCH 08/51] Added basic blueprint support (registration and prefix) --- examples/CMakeLists.txt | 4 ++ examples/example_blueprint.cpp | 18 ++++++ include/crow/app.h | 33 ++++++++++- include/crow/routing.h | 102 ++++++++++++++++++++++++++++++++- 4 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 examples/example_blueprint.cpp diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index cb9be6a29..5330892c7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -73,6 +73,10 @@ else () target_compile_options(example_json_map PRIVATE "${compiler_options}") target_link_libraries(example_json_map PUBLIC ${REQUIRED_LIBRARIES}) + add_executable(example_blueprint example_blueprint.cpp) + target_compile_options(example_blueprint PRIVATE "${compiler_options}") + target_link_libraries(example_blueprint PUBLIC ${REQUIRED_LIBRARIES}) + add_custom_command(OUTPUT example_chat.html COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/example_chat.html ${CMAKE_CURRENT_BINARY_DIR}/example_chat.html diff --git a/examples/example_blueprint.cpp b/examples/example_blueprint.cpp new file mode 100644 index 000000000..a9dae7220 --- /dev/null +++ b/examples/example_blueprint.cpp @@ -0,0 +1,18 @@ +#define CROW_MAIN +#include "crow.h" + +int main() +{ + crow::SimpleApp app; + + crow::Blueprint bp("bp_prefix"); + + CROW_BP_ROUTE(app, bp, "/") + ([]() { + return "Hello world!"; + }); + + app.register_blueprint(bp); + + app.port(18080).run(); +} diff --git a/include/crow/app.h b/include/crow/app.h index 1c9f03e7a..f4cf5eb50 100644 --- a/include/crow/app.h +++ b/include/crow/app.h @@ -24,8 +24,10 @@ #ifdef CROW_MSVC_WORKAROUND #define CROW_ROUTE(app, url) app.route_dynamic(url) +#define CROW_BP_ROUTE(app, blueprint, url) app.route_dynamic(blueprint, url) #else #define CROW_ROUTE(app, url) app.route(url) +#define CROW_BP_ROUTE(app, blueprint, url) app.route(blueprint, url) #endif #define CROW_CATCHALL_ROUTE(app) app.catchall_route() @@ -80,14 +82,28 @@ namespace crow return router_.new_rule_dynamic(std::move(rule)); } + ///Create a dynamic route for a blueprint using a rule (**Use CROW_ROUTE instead**) + DynamicRule& route_dynamic(Blueprint& blueprint, std::string&& rule) + { + return blueprint.new_rule_dynamic(std::move(rule)); + } + ///Create a route using a rule (**Use CROW_ROUTE instead**) template auto route(std::string&& rule) -> typename std::result_of)(Router, std::string&&)>::type - { + {//TODO process the blueprint return router_.new_rule_tagged(std::move(rule)); } + ///Create a route for a blueprint using a rule (**Use CROW_ROUTE instead**) + template + auto route(Blueprint& blueprint, std::string&& rule) + -> typename std::result_of)(Router, std::string&&)>::type + { + return blueprint.new_rule_tagged(std::move(rule)); + } + ///Create a route for any requests without a proper route (**Use CROW_CATCHALL_ROUTE instead**) CatchallRule& catchall_route() { @@ -158,12 +174,21 @@ namespace crow /// crow::LogLevel::Warning (2)
/// crow::LogLevel::Error (3)
/// crow::LogLevel::Critical (4)
- self_t& loglevel(crow::LogLevel level) + self_t& loglevel(LogLevel level) { crow::logger::setLogLevel(level); return *this; } + self_t& register_blueprint(Blueprint& blueprint) + { + if (blueprints_.empty() || std::find(blueprints_.begin(), blueprints_.end(), &blueprint) == blueprints_.end()) + { + blueprints_.emplace_back(&blueprint); + }//TODO error throwing + return *this; + } + ///Set a custom duration and function to run on every tick template self_t& tick(Duration d, Func f) { @@ -191,7 +216,7 @@ namespace crow ///Go through the rules, upgrade them if possible, and add them to the list of rules void validate() { - router_.validate(); + router_.validate(blueprints_); } ///Notify anything using `wait_for_server_start()` to proceed @@ -380,6 +405,8 @@ namespace crow std::vector signals_{SIGINT, SIGTERM}; + std::vector blueprints_; + bool server_started_{false}; std::condition_variable cv_started_; std::mutex start_mutex_; diff --git a/include/crow/routing.h b/include/crow/routing.h index f31c8386b..25be2bff1 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -1029,6 +1029,94 @@ namespace crow std::vector nodes_; }; + /// A blueprint can be considered a smaller section of a Crow app, specifically where the router is conecerned. + class Blueprint + { + public: + Blueprint() + { + } + + Blueprint(const std::string& prefix): + prefix_(prefix){}; + + Blueprint(std::string&& prefix): + prefix_(prefix){}; +/* + Blueprint(Blueprint& other) + { + prefix_ = std::move(other.prefix_); + all_rules_ = std::move(other.all_rules_); + } + + Blueprint(const Blueprint& other) + { + prefix_ = other.prefix_; + all_rules_ = other.all_rules_; + } +*/ + Blueprint(Blueprint&& value) + { + *this = std::move(value); + } + + Blueprint& operator = (const Blueprint& value) = delete; + + Blueprint& operator = (Blueprint&& value) noexcept + { + prefix_ = std::move(value.prefix_); + all_rules_ = std::move(value.all_rules_); + catchall_rule_ = std::move(value.catchall_rule_); + return *this; + } + + bool operator == (const Blueprint& value) + { + return value.prefix() == prefix_; + } + + bool operator != (const Blueprint& value) + { + return value.prefix() != prefix_; + } + + std::string prefix() const + { + return prefix_; + } + + DynamicRule& new_rule_dynamic(const std::string& rule) + { + std::string new_rule = '/' + prefix_ + rule; + auto ruleObject = new DynamicRule(new_rule); + all_rules_.emplace_back(ruleObject); + + return *ruleObject; + } + + template + typename black_magic::arguments::type::template rebind& new_rule_tagged(const std::string& rule) + { + std::string new_rule = '/' + prefix_ + rule; + using RuleT = typename black_magic::arguments::type::template rebind; + + auto ruleObject = new RuleT(new_rule); + all_rules_.emplace_back(ruleObject); + + return *ruleObject; + } + + CatchallRule& catchall_rule() + { + return catchall_rule_; + } + + private: + std::string prefix_; + std::vector> all_rules_; + CatchallRule catchall_rule_; + friend class Router; + }; /// Handles matching requests to existing rules and upgrade requests. class Router @@ -1088,8 +1176,20 @@ namespace crow } - void validate() + void validate(std::vector& bp_list) { + //Take all the routes from the registered blueprints and add them to `all_rules_` to be processed. + if (!(bp_list.empty())) + { + for (Blueprint* bp : bp_list) + { + for (auto& rule: bp->all_rules_) + { + all_rules_.push_back(std::move(rule)); + } + } + } + for(auto& rule:all_rules_) { if (rule) From 165c72f56c47775c78663ed967e30288a586b7fc Mon Sep 17 00:00:00 2001 From: The-EDev Date: Mon, 5 Jul 2021 12:18:00 +0300 Subject: [PATCH 09/51] fixed issue where disabling crow static directory would also disable all other routes --- examples/CMakeLists.txt | 4 ++++ examples/example_static_file.cpp | 1 + include/crow/app.h | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index cb9be6a29..ded51c771 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -65,6 +65,10 @@ else () target_compile_options(example_chat PRIVATE "${compiler_options}") target_link_libraries(example_chat PUBLIC ${REQUIRED_LIBRARIES}) + add_executable(example_static_file example_static_file.cpp) + target_compile_options(example_static_file PRIVATE "${compiler_options}") + target_link_libraries(example_static_file PUBLIC ${REQUIRED_LIBRARIES}) + add_executable(example_catchall example_catchall.cpp) target_compile_options(example_catchall PRIVATE "${compiler_options}") target_link_libraries(example_catchall PUBLIC ${REQUIRED_LIBRARIES}) diff --git a/examples/example_static_file.cpp b/examples/example_static_file.cpp index 2744fc1a1..908f9e27f 100644 --- a/examples/example_static_file.cpp +++ b/examples/example_static_file.cpp @@ -1,5 +1,6 @@ //#define CROW_STATIC_DRIECTORY "alternative_directory/" //#define CROW_STATIC_ENDPOINT "/alternative_endpoint/" +//#define CROW_DISABLE_STATIC_DIR #define CROW_MAIN #include "crow.h" diff --git a/include/crow/app.h b/include/crow/app.h index 1c9f03e7a..f50ec4dde 100644 --- a/include/crow/app.h +++ b/include/crow/app.h @@ -212,8 +212,8 @@ namespace crow res.set_static_file_info(CROW_STATIC_DIRECTORY + file_path_partial); res.end(); }); - validate(); #endif + validate(); #ifdef CROW_ENABLE_SSL if (use_ssl_) From 408166a06f36b4f6fe7be16ed0e5f2bb4ea9e76e Mon Sep 17 00:00:00 2001 From: The-EDev Date: Mon, 5 Jul 2021 21:04:51 +0300 Subject: [PATCH 10/51] removed extra semicolon (from @luxe) --- examples/websocket/example_ws.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/websocket/example_ws.cpp b/examples/websocket/example_ws.cpp index df52632d0..0543c0eec 100644 --- a/examples/websocket/example_ws.cpp +++ b/examples/websocket/example_ws.cpp @@ -8,7 +8,7 @@ int main() { crow::SimpleApp app; - std::mutex mtx;; + std::mutex mtx; std::unordered_set users; CROW_ROUTE(app, "/ws") From 85e4525d67e915c71e575771317f5220f0d9e8ae Mon Sep 17 00:00:00 2001 From: The-EDev Date: Tue, 6 Jul 2021 01:53:32 +0300 Subject: [PATCH 11/51] added custom static directory capability to blueprints (the endpoint remains "/static/") --- examples/example_blueprint.cpp | 2 +- include/crow/app.h | 13 +++++++++++++ include/crow/routing.h | 14 +++++++++----- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/examples/example_blueprint.cpp b/examples/example_blueprint.cpp index a9dae7220..a37df70f0 100644 --- a/examples/example_blueprint.cpp +++ b/examples/example_blueprint.cpp @@ -5,7 +5,7 @@ int main() { crow::SimpleApp app; - crow::Blueprint bp("bp_prefix"); + crow::Blueprint bp("bp_prefix", "cstat"); CROW_BP_ROUTE(app, bp, "/") ([]() { diff --git a/include/crow/app.h b/include/crow/app.h index 3b15b44f9..292afc069 100644 --- a/include/crow/app.h +++ b/include/crow/app.h @@ -237,6 +237,19 @@ namespace crow res.set_static_file_info(CROW_STATIC_DIRECTORY + file_path_partial); res.end(); }); + + for (auto& bp : blueprints_) + { + if (!bp->static_dir().empty()) + { + route(*bp, CROW_STATIC_ENDPOINT) + ([bp](crow::response& res, std::string file_path_partial) + { + res.set_static_file_info(bp->static_dir() + '/' + file_path_partial); + res.end(); + }); + } + } #endif validate(); diff --git a/include/crow/routing.h b/include/crow/routing.h index 25be2bff1..d5d9b2ba5 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -1033,15 +1033,13 @@ namespace crow class Blueprint { public: - Blueprint() - { - } Blueprint(const std::string& prefix): prefix_(prefix){}; - Blueprint(std::string&& prefix): - prefix_(prefix){}; + Blueprint(const std::string& prefix, const std::string& static_dir): + prefix_(prefix), static_dir_(static_dir){}; + /* Blueprint(Blueprint& other) { @@ -1085,6 +1083,11 @@ namespace crow return prefix_; } + std::string static_dir() const + { + return static_dir_; + } + DynamicRule& new_rule_dynamic(const std::string& rule) { std::string new_rule = '/' + prefix_ + rule; @@ -1113,6 +1116,7 @@ namespace crow private: std::string prefix_; + std::string static_dir_; std::vector> all_rules_; CatchallRule catchall_rule_; friend class Router; From 3839a4a8e51b1db02af36771e540acb4ce94b433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mr=C3=B3z?= Date: Tue, 6 Jul 2021 19:07:34 +0200 Subject: [PATCH 12/51] Add CROW_MAIN ifdef to VERSION variable. Move it to namespace. --- include/crow/version.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/include/crow/version.h b/include/crow/version.h index d417df206..5e1394f47 100644 --- a/include/crow/version.h +++ b/include/crow/version.h @@ -1,3 +1,10 @@ #pragma once -constexpr char VERSION[] = "master"; +namespace crow { + +#ifdef CROW_MAIN + constexpr char VERSION[] = "master"; +#else + extern constexpr char VERSION[]; +#endif +} From ea597d804a0161bbcc0580fb4949dfcb327ec285 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Wed, 7 Jul 2021 15:51:04 +0300 Subject: [PATCH 13/51] blueprint specific templates directory now supported --- examples/example_blueprint.cpp | 12 +++++++++++- include/crow/app.h | 11 +++++++++-- include/crow/routing.h | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/examples/example_blueprint.cpp b/examples/example_blueprint.cpp index a37df70f0..df1994b54 100644 --- a/examples/example_blueprint.cpp +++ b/examples/example_blueprint.cpp @@ -5,13 +5,23 @@ int main() { crow::SimpleApp app; - crow::Blueprint bp("bp_prefix", "cstat"); + crow::Blueprint bp("bp_prefix", "cstat", "ctemplate"); CROW_BP_ROUTE(app, bp, "/") ([]() { return "Hello world!"; }); + CROW_BP_ROUTE(app, bp, "/templatt") + ([]() { + crow::mustache::context ctxdat; + ctxdat["messg"] = "fifty five!!"; + + auto page = crow::mustache::load("indks.html"); + + return page.render(ctxdat); + }); + app.register_blueprint(bp); app.port(18080).run(); diff --git a/include/crow/app.h b/include/crow/app.h index 292afc069..93c9e5cb3 100644 --- a/include/crow/app.h +++ b/include/crow/app.h @@ -30,6 +30,7 @@ #define CROW_BP_ROUTE(app, blueprint, url) app.route(blueprint, url) #endif #define CROW_CATCHALL_ROUTE(app) app.catchall_route() +#define CROW_BP_CATCHALL_ROUTE(app, blueprint) app.catchall_route(blueprint) namespace crow { @@ -82,7 +83,7 @@ namespace crow return router_.new_rule_dynamic(std::move(rule)); } - ///Create a dynamic route for a blueprint using a rule (**Use CROW_ROUTE instead**) + ///Create a dynamic route for a blueprint using a rule (**Use CROW_BP_ROUTE instead**) DynamicRule& route_dynamic(Blueprint& blueprint, std::string&& rule) { return blueprint.new_rule_dynamic(std::move(rule)); @@ -96,7 +97,7 @@ namespace crow return router_.new_rule_tagged(std::move(rule)); } - ///Create a route for a blueprint using a rule (**Use CROW_ROUTE instead**) + ///Create a route for a blueprint using a rule (**Use CROW_BP_ROUTE instead**) template auto route(Blueprint& blueprint, std::string&& rule) -> typename std::result_of)(Router, std::string&&)>::type @@ -110,6 +111,12 @@ namespace crow return router_.catchall_rule(); } + ///Create a route for any requests without a proper route within the blueprint (**Use CROW_BP_CATCHALL_ROUTE instead**) + CatchallRule& catchall_route(Blueprint& blueprint) + { + return blueprint.catchall_rule(); + } + self_t& signal_clear() { signals_.clear(); diff --git a/include/crow/routing.h b/include/crow/routing.h index d5d9b2ba5..623553568 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -14,6 +14,7 @@ #include "crow/utility.h" #include "crow/logging.h" #include "crow/websocket.h" +#include "crow/mustache.h" namespace crow { @@ -70,6 +71,9 @@ namespace crow } } + + std::string custom_templates_base; + const std::string& rule() { return rule_; } protected: @@ -499,6 +503,10 @@ namespace crow void handle(const request& req, response& res, const routing_params& params) override { + if (!custom_templates_base.empty()) + mustache::set_base(custom_templates_base); + else if (mustache::detail::get_template_base_directory_ref() != "templates") + mustache::set_base("templates"); erased_handler_(req, res, params); } @@ -674,6 +682,11 @@ namespace crow void handle(const request& req, response& res, const routing_params& params) override { + if (!custom_templates_base.empty()) + mustache::set_base(custom_templates_base); + else if (mustache::detail::get_template_base_directory_ref() != "templates") + mustache::set_base("templates"); + detail::routing_handler_call_helper::call< detail::routing_handler_call_helper::call_params< decltype(handler_)>, @@ -1040,6 +1053,9 @@ namespace crow Blueprint(const std::string& prefix, const std::string& static_dir): prefix_(prefix), static_dir_(static_dir){}; + Blueprint(const std::string& prefix, const std::string& static_dir, const std::string& templates_dir): + prefix_(prefix), static_dir_(static_dir), templates_dir_(templates_dir){}; + /* Blueprint(Blueprint& other) { @@ -1092,6 +1108,7 @@ namespace crow { std::string new_rule = '/' + prefix_ + rule; auto ruleObject = new DynamicRule(new_rule); + ruleObject->custom_templates_base = templates_dir_; all_rules_.emplace_back(ruleObject); return *ruleObject; @@ -1104,6 +1121,7 @@ namespace crow using RuleT = typename black_magic::arguments::type::template rebind; auto ruleObject = new RuleT(new_rule); + ruleObject->custom_templates_base = templates_dir_; all_rules_.emplace_back(ruleObject); return *ruleObject; @@ -1117,6 +1135,7 @@ namespace crow private: std::string prefix_; std::string static_dir_; + std::string templates_dir_; std::vector> all_rules_; CatchallRule catchall_rule_; friend class Router; From 6ee7d298a43eb39e68d8a821ed9cce65cadf3208 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Sat, 10 Jul 2021 21:24:52 +0300 Subject: [PATCH 14/51] Edited license to reflect the change in development, and merge_all to add it to crow_all.h --- LICENSE | 3 ++- scripts/merge_all.py | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index 7295908f7..ea6d662fd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,5 @@ -Copyright (c) 2014, ipkn +Copyright (c) 2014-2017, ipkn + 2020-2021, CrowCpp All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/scripts/merge_all.py b/scripts/merge_all.py index 25cd19ce2..e8f02d216 100755 --- a/scripts/merge_all.py +++ b/scripts/merge_all.py @@ -18,6 +18,8 @@ middlewares = [x.rsplit(sep, 1)[-1][:-2] for x in glob(pt.join(header_path, ('crow'+sep+'middlewares'+sep+'*.h*')))] +with open(header_path+'/../LICENSE', 'r') as file: + lsc = file.read() middlewares_actual = [] if len(sys.argv) > 3: @@ -83,10 +85,10 @@ def dfs(x): assert order.index(x) < order.index(y), 'cyclic include detected' print(order) -build = [] +build = [lsc] for header in order: d = open(pt.join(header_path, header)).read() build.append(re_depends.sub(lambda x: '\n', d)) build.append('\n') -open(output_path, 'w').write('\n'.join(build)) \ No newline at end of file +open(output_path, 'w').write('\n'.join(build)) From 4710c1012041a14fe7ce46edcf6332bdc5108774 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Sat, 10 Jul 2021 21:48:42 +0300 Subject: [PATCH 15/51] fixed comment problem --- scripts/merge_all.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/merge_all.py b/scripts/merge_all.py index e8f02d216..f50bcaecf 100755 --- a/scripts/merge_all.py +++ b/scripts/merge_all.py @@ -19,7 +19,7 @@ middlewares = [x.rsplit(sep, 1)[-1][:-2] for x in glob(pt.join(header_path, ('crow'+sep+'middlewares'+sep+'*.h*')))] with open(header_path+'/../LICENSE', 'r') as file: - lsc = file.read() + lsc = '/*' + file.read() + '*/' middlewares_actual = [] if len(sys.argv) > 3: From 341a9b7fbee1ce05384532f5ee6da29502436f93 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Sat, 10 Jul 2021 22:45:47 +0300 Subject: [PATCH 16/51] Re-implemented Trie --- include/crow/routing.h | 391 ++++++++++++++++++++++------------------- 1 file changed, 208 insertions(+), 183 deletions(-) diff --git a/include/crow/routing.h b/include/crow/routing.h index f31c8386b..787f17a19 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -701,100 +701,133 @@ namespace crow struct Node { unsigned rule_index{}; - std::array(ParamType::MAX)> param_childrens{}; - std::unordered_map children; + std::string key; + ParamType param = ParamType::MAX; // MAX = No param. + std::vector children; bool IsSimpleNode() const { return !rule_index && - std::all_of( - std::begin(param_childrens), - std::end(param_childrens), - [](unsigned x){ return !x; }); + children.size() < 2 && + param == ParamType::MAX && + std::all_of(std::begin(children), std::end(children), [](Node* x){ return x->param == ParamType::MAX; }); } }; - Trie() : nodes_(1) + + Trie() { } ///Check whether or not the trie is empty. bool is_empty() { - return nodes_.size() > 1; + return head_.children.empty(); } - private: - void optimizeNode(Node* node) + void optimize() { - for(auto x : node->param_childrens) + for (auto child: head_.children) { - if (!x) - continue; - Node* child = &nodes_[x]; optimizeNode(child); } + } + + + private: + void optimizeNode(Node* node) + { if (node->children.empty()) return; bool mergeWithChild = true; - for(auto& kv : node->children) - { - Node* child = &nodes_[kv.second]; - if (!child->IsSimpleNode()) + if (!node->IsSimpleNode() /*|| node->children[0]->param != ParamType::MAX*/) { mergeWithChild = false; - break; } - } if (mergeWithChild) { - decltype(node->children) merged; - for(auto& kv : node->children) - { - Node* child = &nodes_[kv.second]; - for(auto& child_kv : child->children) - { - merged[kv.first + child_kv.first] = child_kv.second; - } - } - node->children = std::move(merged); + Node* child_temp = node->children[0]; + node->key = node->key + child_temp->key; + node->rule_index = child_temp->rule_index; + node->children = std::move(child_temp->children); + delete(child_temp); optimizeNode(node); } else { - for(auto& kv : node->children) + for(auto& child : node->children) { - Node* child = &nodes_[kv.second]; optimizeNode(child); } } } - void optimize() + void debug_node_print(Node* node, int level) { - optimizeNode(head()); - } + if (node->param != ParamType::MAX) + { + switch(node->param) + { + case ParamType::INT: + std::cout << std::string(2*level, ' ') << "" << std::endl; + break; + case ParamType::UINT: + std::cout << std::string(2*level, ' ') << "" << std::endl; + break; + case ParamType::DOUBLE: + std::cout << std::string(2*level, ' ') << "" << std::endl; + break; + case ParamType::STRING: + std::cout << std::string(2*level, ' ') << "" << std::endl; + break; + case ParamType::PATH: + std::cout << std::string(2*level, ' ') << "" << std::endl; + break; + default: + std::cout << std::string(2*level, ' ') << "" << std::endl; + break; + } + } + else + std::cout << std::string(2*level, ' ') << node->key << std::endl; + for(auto& child : node->children) + { + debug_node_print(child, level+1); + } + } public: + + void debug_print() + { + std::cout << "HEAD" << std::endl; + for (auto& child : head_.children) + debug_node_print(child, 1); + } + void validate() { - if (!head()->IsSimpleNode()) + if (!head_.IsSimpleNode()) throw std::runtime_error("Internal error: Trie header should be simple!"); optimize(); } std::pair find(const std::string& req_url, const Node* node = nullptr, unsigned pos = 0, routing_params* params = nullptr) const { + //start params as an empty struct routing_params empty; if (params == nullptr) params = ∅ - unsigned found{}; - routing_params match_params; + unsigned found{}; //The rule index to be found + routing_params match_params; //supposedly the final matched parameters + //start from the head node if (node == nullptr) - node = head(); + node = &head_; + + //if the function was called on a node at the end of the string (the last recursion), return the nodes rule index, and whatever params were passed to the function if (pos == req_url.size()) return {node->rule_index, *params}; @@ -807,109 +840,113 @@ namespace crow } }; - if (node->param_childrens[static_cast(ParamType::INT)]) + + for(auto& child : node->children) { - char c = req_url[pos]; - if ((c >= '0' && c <= '9') || c == '+' || c == '-') + if (child->param != ParamType::MAX) { - char* eptr; - errno = 0; - long long int value = strtoll(req_url.data()+pos, &eptr, 10); - if (errno != ERANGE && eptr != req_url.data()+pos) + if (child->param == ParamType::INT) { - params->int_params.push_back(value); - auto ret = find(req_url, &nodes_[node->param_childrens[static_cast(ParamType::INT)]], eptr - req_url.data(), params); - update_found(ret); - params->int_params.pop_back(); + char c = req_url[pos]; + if ((c >= '0' && c <= '9') || c == '+' || c == '-') + { + char* eptr; + errno = 0; + long long int value = strtoll(req_url.data()+pos, &eptr, 10); + if (errno != ERANGE && eptr != req_url.data()+pos) + { + params->int_params.push_back(value); + auto ret = find(req_url, child, eptr - req_url.data(), params); + update_found(ret); + params->int_params.pop_back(); + } + } } - } - } - if (node->param_childrens[static_cast(ParamType::UINT)]) - { - char c = req_url[pos]; - if ((c >= '0' && c <= '9') || c == '+') - { - char* eptr; - errno = 0; - unsigned long long int value = strtoull(req_url.data()+pos, &eptr, 10); - if (errno != ERANGE && eptr != req_url.data()+pos) + else if (child->param == ParamType::UINT) { - params->uint_params.push_back(value); - auto ret = find(req_url, &nodes_[node->param_childrens[static_cast(ParamType::UINT)]], eptr - req_url.data(), params); - update_found(ret); - params->uint_params.pop_back(); + char c = req_url[pos]; + if ((c >= '0' && c <= '9') || c == '+') + { + char* eptr; + errno = 0; + unsigned long long int value = strtoull(req_url.data()+pos, &eptr, 10); + if (errno != ERANGE && eptr != req_url.data()+pos) + { + params->uint_params.push_back(value); + auto ret = find(req_url, child, eptr - req_url.data(), params); + update_found(ret); + params->uint_params.pop_back(); + } + } } - } - } - if (node->param_childrens[static_cast(ParamType::DOUBLE)]) - { - char c = req_url[pos]; - if ((c >= '0' && c <= '9') || c == '+' || c == '-' || c == '.') - { - char* eptr; - errno = 0; - double value = strtod(req_url.data()+pos, &eptr); - if (errno != ERANGE && eptr != req_url.data()+pos) + else if (child->param == ParamType::DOUBLE) { - params->double_params.push_back(value); - auto ret = find(req_url, &nodes_[node->param_childrens[static_cast(ParamType::DOUBLE)]], eptr - req_url.data(), params); - update_found(ret); - params->double_params.pop_back(); + char c = req_url[pos]; + if ((c >= '0' && c <= '9') || c == '+' || c == '-' || c == '.') + { + char* eptr; + errno = 0; + double value = strtod(req_url.data()+pos, &eptr); + if (errno != ERANGE && eptr != req_url.data()+pos) + { + params->double_params.push_back(value); + auto ret = find(req_url, child, eptr - req_url.data(), params); + update_found(ret); + params->double_params.pop_back(); + } + } } - } - } - if (node->param_childrens[static_cast(ParamType::STRING)]) - { - size_t epos = pos; - for(; epos < req_url.size(); epos ++) - { - if (req_url[epos] == '/') - break; - } + else if (child->param == ParamType::STRING) + { + size_t epos = pos; + for(; epos < req_url.size(); epos ++) + { + if (req_url[epos] == '/') + break; + } - if (epos != pos) - { - params->string_params.push_back(req_url.substr(pos, epos-pos)); - auto ret = find(req_url, &nodes_[node->param_childrens[static_cast(ParamType::STRING)]], epos, params); - update_found(ret); - params->string_params.pop_back(); - } - } + if (epos != pos) + { + params->string_params.push_back(req_url.substr(pos, epos-pos)); + auto ret = find(req_url, child, epos, params); + update_found(ret); + params->string_params.pop_back(); + } + } - if (node->param_childrens[static_cast(ParamType::PATH)]) - { - size_t epos = req_url.size(); + else if (child->param == ParamType::PATH) + { + size_t epos = req_url.size(); - if (epos != pos) - { - params->string_params.push_back(req_url.substr(pos, epos-pos)); - auto ret = find(req_url, &nodes_[node->param_childrens[static_cast(ParamType::PATH)]], epos, params); - update_found(ret); - params->string_params.pop_back(); + if (epos != pos) + { + params->string_params.push_back(req_url.substr(pos, epos-pos)); + auto ret = find(req_url, child, epos, params); + update_found(ret); + params->string_params.pop_back(); + } + } } - } - - for(auto& kv : node->children) - { - const std::string& fragment = kv.first; - const Node* child = &nodes_[kv.second]; - if (req_url.compare(pos, fragment.size(), fragment) == 0) + else { - auto ret = find(req_url, child, pos + fragment.size(), params); - update_found(ret); + const std::string& fragment = child->key; + if (req_url.compare(pos, fragment.size(), fragment) == 0) + { + auto ret = find(req_url, child, pos + fragment.size(), params); + update_found(ret); + } } } - - return {found, match_params}; + return {found, match_params}; //Called after all the recursions have been done } void add(const std::string& url, unsigned rule_index) { - unsigned idx{0}; + Node* idx = &head_; for(unsigned i = 0; i < url.size(); i ++) { @@ -935,12 +972,23 @@ namespace crow { if (url.compare(i, x.name.size(), x.name) == 0) { - if (!nodes_[idx].param_childrens[static_cast(x.type)]) + bool found = false; + for (Node* child : idx->children) { - auto new_node_idx = new_node(); - nodes_[idx].param_childrens[static_cast(x.type)] = new_node_idx; + if (child->param == x.type) + { + idx = child; + i += x.name.size(); + found = true; + break; + } } - idx = nodes_[idx].param_childrens[static_cast(x.type)]; + if (found) + break; + + auto new_node_idx = new_node(idx); + new_node_idx->param = x.type; + idx = new_node_idx; i += x.name.size(); break; } @@ -950,83 +998,60 @@ namespace crow } else { - std::string piece(&c, 1); - if (!nodes_[idx].children.count(piece)) + //This part assumes the tree is unoptimized (every node has a max 1 character key) + bool piece_found = false; + for (auto& child : idx->children) { - auto new_node_idx = new_node(); - nodes_[idx].children.emplace(piece, new_node_idx); + if (child->key[0] == c) + { + idx = child; + piece_found = true; + break; + } } - idx = nodes_[idx].children[piece]; - } - } - if (nodes_[idx].rule_index) - throw std::runtime_error("handler already exists for " + url); - nodes_[idx].rule_index = rule_index; - } - private: - void debug_node_print(Node* n, int level) - { - for(int i = 0; i < static_cast(ParamType::MAX); i ++) - { - if (n->param_childrens[i]) - { - CROW_LOG_DEBUG << std::string(2*level, ' ') /*<< "("<param_childrens[i]<<") "*/; - switch(static_cast(i)) + if (!piece_found) { - case ParamType::INT: - CROW_LOG_DEBUG << ""; - break; - case ParamType::UINT: - CROW_LOG_DEBUG << ""; - break; - case ParamType::DOUBLE: - CROW_LOG_DEBUG << ""; - break; - case ParamType::STRING: - CROW_LOG_DEBUG << ""; - break; - case ParamType::PATH: - CROW_LOG_DEBUG << ""; - break; - default: - CROW_LOG_DEBUG << ""; - break; + auto new_node_idx = new_node(idx); + new_node_idx->key = c; + idx = new_node_idx; } - - debug_node_print(&nodes_[n->param_childrens[i]], level+1); } } - for(auto& kv : n->children) - { - CROW_LOG_DEBUG << std::string(2*level, ' ') /*<< "(" << kv.second << ") "*/ << kv.first; - debug_node_print(&nodes_[kv.second], level+1); - } - } - public: - void debug_print() - { - debug_node_print(head(), 0); + //check if the last node already has a value (exact url already in Trie) + if (idx->rule_index) + throw std::runtime_error("handler already exists for " + url); + idx->rule_index = rule_index; } - private: - const Node* head() const + size_t get_size() { - return &nodes_.front(); + return get_size(&head_); } - Node* head() + size_t get_size(Node* node) { - return &nodes_.front(); + unsigned size = 8; //rule_index and param + size += (node->key.size()); //each character in the key is 1 byte + for (auto child: node->children) + { + size += get_size(child); + } + return size; } - unsigned new_node() + + private: + + Node* new_node(Node* parent) { - nodes_.resize(nodes_.size()+1); - return nodes_.size() - 1; + auto& children = parent->children; + children.resize(children.size()+1); + children[children.size()-1] = new Node(); + return children[children.size()-1]; } - std::vector nodes_; + Node head_; }; @@ -1199,7 +1224,7 @@ namespace crow { for(int i = 0; i < static_cast(HTTPMethod::InternalMethodCount); i ++) { - if (per_methods_[i].trie.is_empty()) + if (!per_methods_[i].trie.is_empty()) { allow += method_name(static_cast(i)) + ", "; } From 32d88725bd8c620204e2d4fc396304c651fff20d Mon Sep 17 00:00:00 2001 From: The-EDev Date: Sat, 10 Jul 2021 23:14:38 +0300 Subject: [PATCH 17/51] used CROW_LOG_DEBUG instead of std::cout (which was used to rapidly test the trie outside crow) --- include/crow/routing.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/crow/routing.h b/include/crow/routing.h index 787f17a19..5bb23fb30 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -770,27 +770,27 @@ namespace crow switch(node->param) { case ParamType::INT: - std::cout << std::string(2*level, ' ') << "" << std::endl; + CROW_LOG_DEBUG << std::string(2*level, ' ') << ""; break; case ParamType::UINT: - std::cout << std::string(2*level, ' ') << "" << std::endl; + CROW_LOG_DEBUG << std::string(2*level, ' ') << ""; break; case ParamType::DOUBLE: - std::cout << std::string(2*level, ' ') << "" << std::endl; + CROW_LOG_DEBUG << std::string(2*level, ' ') << ""; break; case ParamType::STRING: - std::cout << std::string(2*level, ' ') << "" << std::endl; + CROW_LOG_DEBUG << std::string(2*level, ' ') << ""; break; case ParamType::PATH: - std::cout << std::string(2*level, ' ') << "" << std::endl; + CROW_LOG_DEBUG << std::string(2*level, ' ') << ""; break; default: - std::cout << std::string(2*level, ' ') << "" << std::endl; + CROW_LOG_DEBUG << std::string(2*level, ' ') << ""; break; } } else - std::cout << std::string(2*level, ' ') << node->key << std::endl; + CROW_LOG_DEBUG << std::string(2*level, ' ') << node->key; for(auto& child : node->children) { @@ -801,7 +801,7 @@ namespace crow void debug_print() { - std::cout << "HEAD" << std::endl; + CROW_LOG_DEBUG << "HEAD"; for (auto& child : head_.children) debug_node_print(child, 1); } From 6d6fbe23858807005b285b17cdba334642b0f4ac Mon Sep 17 00:00:00 2001 From: The-EDev Date: Mon, 19 Jul 2021 00:01:20 +0300 Subject: [PATCH 18/51] removed unnecessary boolean --- include/crow/routing.h | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/include/crow/routing.h b/include/crow/routing.h index 5bb23fb30..6de9f90c2 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -740,12 +740,7 @@ namespace crow { if (node->children.empty()) return; - bool mergeWithChild = true; - if (!node->IsSimpleNode() /*|| node->children[0]->param != ParamType::MAX*/) - { - mergeWithChild = false; - } - if (mergeWithChild) + if (node->IsSimpleNode()) { Node* child_temp = node->children[0]; node->key = node->key + child_temp->key; From c5d00f784bcd5b7fd911bb95a746e72568d571c2 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Thu, 22 Jul 2021 01:10:57 +0300 Subject: [PATCH 19/51] Added disclaimer to clear any potential misconceptions between this project and the original --- README.md | 7 ++++--- docs/index.md | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7a61e800d..cefe8fffb 100644 --- a/README.md +++ b/README.md @@ -100,10 +100,11 @@ More examples can be found [here](https://github.com/crowcpp/crow/tree/master/ex ## Setting Up / Building Available [here](https://crowcpp.github.io/crow/getting_started/setup). +## Disclaimer +CrowCpp/Crow is a project based on ipkn/crow. Neither CrowCpp, it's members, or this projects have been associated with, or endorsed or supported by ipkn (Jaeseung Ha) in any way. We do use ipkn/crow's source code under the BSD-3 clause license and sometimes refer to the public comments available on the github repository. But we do not in any way claim to be associated with or in contact with ipkn (Jaeseung Ha) regarding CrowCpp or CrowCpp/Crow -### Attributions - -Crow uses the following libraries. +## Attributions +Crow has incorporated the following libraries into its source. http-parser (used for converting http strings to crow::request objects) diff --git a/docs/index.md b/docs/index.md index b934695fd..7e0d5865b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -100,3 +100,6 @@ More examples can be found [here](https://github.com/crowcpp/crow/tree/master/ex ## Setting Up / Building Available [here](https://crowcpp.github.io/crow/getting_started/setup). + +## Disclaimer +CrowCpp/Crow is a project based on ipkn/crow. Neither CrowCpp, it's members, or this projects have been associated with, or endorsed or supported by ipkn (Jaeseung Ha) in any way. We do use ipkn/crow's source code under the BSD-3 clause license and sometimes refer to the public comments available on the github repository. But we do not in any way claim to be associated with or in contact with ipkn (Jaeseung Ha) regarding CrowCpp or CrowCpp/Crow From 337f1a45f5d0e77928b010ceea6218dc7e432e7f Mon Sep 17 00:00:00 2001 From: The-EDev Date: Fri, 23 Jul 2021 01:17:36 +0300 Subject: [PATCH 20/51] Updated Logo and made logo copyright clear --- LICENSE | 2 + docs/assets/crowlogo.svg | 101 +++++++++++++++++++------ docs/assets/crowlogo_inverted.svg | 121 ++++++++++++++++++++++++++++++ docs/assets/favicon.png | Bin 5203 -> 6605 bytes docs/assets/favicon.svg | 82 ++++++++++++++------ logo55.png | Bin 3092 -> 3044 bytes 6 files changed, 261 insertions(+), 45 deletions(-) create mode 100644 docs/assets/crowlogo_inverted.svg diff --git a/LICENSE b/LICENSE index ea6d662fd..046b8fc1b 100644 --- a/LICENSE +++ b/LICENSE @@ -26,3 +26,5 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The Crow logo used is under Copyright (c) 2021, Farook Al-Sammarraie (The-EDev), All rights reserved. diff --git a/docs/assets/crowlogo.svg b/docs/assets/crowlogo.svg index 056246387..e33d0f75d 100644 --- a/docs/assets/crowlogo.svg +++ b/docs/assets/crowlogo.svg @@ -1,22 +1,22 @@ + inkscape:export-ydpi="324.99619" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + units="px" + inkscape:pagecheckerboard="0" /> @@ -47,7 +48,7 @@ image/svg+xml - + @@ -57,14 +58,70 @@ id="layer1" transform="translate(2.890729,-78.735456)"> + id="rect51232" + style="stroke-width:1.621;stroke-linecap:round;stroke-linejoin:round" + d="m 86.263122,129.89227 c -1.679885,0.94306 -0.970661,50.071 -0.970661,50.071 h 8.67359 c 0,0 -1.146978,-23.39877 0.97066,-22.01299 5.738329,3.75514 18.678879,22.04105 18.678879,22.04105 l 10.82099,0.0233 c 0,0 -22.33706,-23.42311 -21.33927,-25.78171 0.99777,-2.35858 13.45284,-3.56535 14.28699,-5.61353 0.83414,-2.04817 0.74681,-7.53026 0.0119,-9.332 -0.73488,-1.80175 -17.951097,-8.50923 -22.459538,-9.39514 -4.508449,-0.88592 -6.875855,-1.00922 -8.67359,0 z m 8.673589,7.89629 c 0.435027,-0.21177 12.515509,4.68197 12.527659,5.49714 0.0113,0.76226 -12.065069,5.41359 -12.527659,5.04327 -0.327731,-0.26235 -0.43502,-10.32863 0,-10.54041 z" + sodipodi:nodetypes="sccscczzzzszssz" /> + + + style="color:#000000;fill:#000000;stroke-width:0.669208;-inkscape-stroke:none" + d="m 75.361766,164.31848 c -1.522517,0.0929 -3.225106,0.23753 -5.059422,0.41007 -14.861309,1.39786 -38.370023,4.6261 -44.831721,-3.01508 -7.259264,-8.58431 -5.992766,-15.11802 -3.7379,-29.04552 2.254865,-13.92751 11.768175,-32.3183 23.453693,-33.61763 11.685519,-1.299327 24.289435,-0.14247 28.381026,1.21309 L 77.417321,85.791987 C 62.828148,82.27312 56.039475,80.867702 37.328615,83.440263 18.617756,86.012824 9.3053305,108.67011 6.7920712,129.55115 c -2.5132504,20.88098 -0.630659,37.59767 5.7039948,44.13904 6.334653,6.54136 43.941662,8.861 64.480651,5.0425 z" + id="path830" + sodipodi:nodetypes="csszzcczzzcc" /> + + + + + + + + + + diff --git a/docs/assets/crowlogo_inverted.svg b/docs/assets/crowlogo_inverted.svg new file mode 100644 index 000000000..2784f9c50 --- /dev/null +++ b/docs/assets/crowlogo_inverted.svg @@ -0,0 +1,121 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/favicon.png b/docs/assets/favicon.png index 07d6489fadab5dac3bf348f2e195971b94c42cb8..81ff297d2144ddc06b689cb11c3ab4236d8517ee 100644 GIT binary patch literal 6605 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 A)&Kwi literal 5203 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 N002ovPDHLkV1iuQ3@iWu diff --git a/docs/assets/favicon.svg b/docs/assets/favicon.svg index 1ee597f54..3ef8866f9 100644 --- a/docs/assets/favicon.svg +++ b/docs/assets/favicon.svg @@ -1,19 +1,19 @@ + sodipodi:docname="favicon.svg" + inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + inkscape:window-maximized="1" + inkscape:pagecheckerboard="0" /> @@ -43,7 +44,6 @@ image/svg+xml - @@ -53,14 +53,50 @@ id="layer1" transform="translate(-52.906909,-78.735456)"> + style="color:#000000;fill:#ffffff;stroke-width:0.633931;-inkscape-stroke:none;fill-opacity:1" + d="m 131.60351,157.53369 c -1.44225,0.088 -3.05509,0.225 -4.79271,0.38845 -14.0779,1.32417 -36.347368,4.38223 -42.468437,-2.85614 -6.876591,-8.13179 -5.676856,-14.32107 -3.540856,-27.51438 2.136,-13.19332 11.147817,-30.61464 22.217343,-31.845476 11.06952,-1.230833 23.00902,-0.134959 26.88493,1.149142 l 3.64693,-13.70856 c -13.8201,-3.333369 -20.25092,-4.6647 -37.975455,-2.227752 -17.724509,2.436948 -26.546029,23.899856 -28.926801,43.680146 -2.380764,19.78024 -0.597414,35.6157 5.403308,41.81224 6.000721,6.19654 41.625298,8.3939 61.081568,4.77669 z" + id="path830" + sodipodi:nodetypes="csszzcczzzcc" /> + + + + + + + + style="fill:none;stroke:none;stroke-width:0.141638px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 102.26433,110.83508 c 0,0 4.57649,0.7119 5.79689,2.03401 1.2204,1.3221 2.64419,2.44079 2.44079,4.16968 -0.2034,1.7289 0.4068,2.8476 -0.30509,3.86461 -0.7119,1.01698 -2.8476,3.76288 -4.77989,4.98328 -1.9323,1.2204 -7.220698,21.45867 -6.407099,23.08587 0.813599,1.62719 1.525499,0.10169 1.423799,1.1187 -0.1017,1.01699 -1.118698,4.88159 -1.322096,6.50878 -0.203402,1.6272 0.203398,5.69519 -0.101703,6.81389 -0.305097,1.1187 -1.322093,4.47479 -1.322093,4.47479 l 10.576782,0.5085 2.44079,-7.32239 c 0,0 2.5425,-7.01728 2.9493,-7.62748 0.4068,-0.61021 5.59349,-0.9153 7.93259,-2.034 0.36582,-0.17496 2.12886,-2.01002 2.1519,-0.807 0.0203,1.06109 -1.70612,5.16186 -1.3613,5.25648 0.3559,0.0977 2.22569,-4.57149 2.44526,-4.17875 0.34889,0.62408 -0.23447,3.55624 0.23509,3.21194 0.69943,-0.51286 2.55912,-7.10284 2.93614,-7.75406 0.25365,-0.43813 1.28141,3.12689 1.70873,2.26144 0.2816,-0.57033 -0.0181,-5.90925 0.16501,-5.49611 0.32584,0.73534 0.67896,0.003 0.64824,-0.35721 -0.11292,-1.32339 0.47718,1.22581 0.5992,1.02006 0.1483,-0.25009 -0.0609,-1.9612 0.0782,-2.23063 0.0919,-0.17795 0.28677,0.0263 0.37136,-0.16703 0.0686,-0.15669 -0.21818,-2.29341 -0.15223,-2.44361 0.34625,-0.78862 1.03546,-1.00099 1.15799,-1.63819 0.26212,-1.36304 0.57981,-4.46484 -1.63944,-7.24958 -0.14669,-0.18406 0.3442,-0.59186 0.28792,-0.8065 -0.55394,-2.11267 -0.83313,-3.20434 -1.19098,-3.74111 -0.81359,-1.2204 -1.3221,-0.1017 -2.54249,-1.72889 -1.2204,-1.6272 -2.034,-0.91531 -1.8306,-2.4408 0.0298,-0.22308 0.27158,-1.19455 0.13911,-2.14899 -0.0642,-0.4628 -0.59951,-1.0748 -0.55695,-1.30247 0.0732,-0.39183 0.94,0.97767 0.89568,0.59958 -0.0755,-0.64466 -0.77244,-1.07679 -0.86951,-1.55887 -0.0631,-0.31315 0.83737,0.1895 0.6225,-0.0808 -0.62916,-0.79141 -1.09222,-1.63098 -1.3183,-2.27693 -0.71191,-2.034 -3.18392,-6.45253 -5.92982,-7.26612 -2.74589,-0.8136 -3.71474,-0.52713 -6.20368,-0.38138 -1.64439,0.0963 -3.36191,-0.13787 -5.3099,-0.27042 -1.57517,-0.10718 -5.26689,0.44839 -5.87709,1.56709 -0.6102,1.1187 -0.14778,1.10889 -0.14778,1.10889 0,0 0.25083,-0.0891 0.30563,-0.0899 0.2612,-0.004 0.85915,0.81159 0.85915,0.81159 z" + id="path3379" + sodipodi:nodetypes="csssssssscccsssssssssssssssssssssssssssssscsc" /> diff --git a/logo55.png b/logo55.png index b98b46cc249ccfe91641c4c52f1c7bfaa4b476e6..c6cd8bf58c90f5154ecae0772c7c05dc99fbcda5 100644 GIT binary patch delta 3036 zcmV<23nTQD7~~f=iBL{Q4GJ0x0000DNk~Le0001d0000t2nGNE0M3Cf5dZ)H32;bR za{vGW2mk;A2mxC3+lG-gD1UKDL_t(|ob8=^u+>!+$G_`5qLb{@7>#9_O6Py)$^eGiT2I?ce&Xz4l&buf6wLYyYm)z()$!8Gn@kyGa@>X;8V& z-6g#%sZG*5X7+Yx$k9LtDjet`=_pBuOFBqS!NbengLCTIBMgTvkLfMZ2dvvwT4b%vrC$OfVvRi=OT`hA1bpSY}pt9Ek`**dx z4b%zXj)Dq5t*d2ipibZxYefPh_vY}q2zUY50Bi+b1|9{L0PBFo!0&-ibynLN2mm;< zfU@5QMrH8m0e}1&c&BXk*OmWf(V|7nnl&rQYcnvWGuzle0>I4$6n=9-UVVTQftf&C z2EYH%Smk#OaLET*h=Gwc@Vy|1@8vtAJq=_4*tfvwey~Q~-GNmZeAfVbb#$8=a7YWD z6p4uas+J1P>;p;9WRMJybY?BQ8^}kR!Vk`Qu2oV^BY(V%ym@->I(Rpbfi#7GI_J6j z%&e`J3W0+q9hXDaw-(+F0U_(79c-YQY+A8W~A^tRnjy`-Q?o!%OpK1sinM5XrKsy{yD4j_0^6(U=QH+0xN$X zS7-2iGJoZnb-*8hlYnmZ_s9-)4hIeejsp$>2Gz)?Cmk4Q0zL^;o36I~;ZZqCSWpAc zX*DPtAOc3D@LXBo`8Rk0hIG6R5 z4B9Jzd5O=t8MM8CZ8#6+-N1Kn8A^p4czjMLR)2jc0C=VfCHn|&(QvNVYVZVbG6k&@ za9|wAEh$P4eYQqXG!y8V!tZuZo}Xsay~LxvCxdpJNBcgoXBvIT3=GWd3F)<*`@TR! z<<6VciY8x4I8*I!?cS5LGK0@ilIBQS1e~6w`0@{9p``Iu$l24(E&?7QobmIxcO6Xi z27h*!w7*w8K11Fkyz7N#wmD76kizrK!K*pamM5#YH*uA`2Zbc>v? zAcRqpZkP0v&`n@0@MqP&H9QJuhI@JCk9pT)Qj|DSm3kQ<>422_e1-e>VrD0s*)eAJ zRotR-MSym69LG0!W&e_tJQm$o(kBAXra8UFrIa7(U1uu10_10?hB_mSS8uYTV?{C9 z;~UyZEKHGMZz|_RfQmEeQ50Psn48}MPRM9uuPBOUgywbNaF6z{o(!i4_{~V^gMVKH zXa{*T9{~NbbP^ijSx%9SRpy9~Rd}>igO?=T@0EqNTYZujKtJF@NzW>54kM4gkC|QI z(QGlZNoJOMn9hKVJRd$V)68BfB4nvlnl9-@ulQ6T zxd`?Z{<#3FG=(2RWv;+j@7iA&Rv@JCEH72H2Ma!5C4C4XQyo(HAh{DQ4@){n*=v!F zl5R{E#BqF#M-!Jyr3y2ehVuHsUkH{Y9i6y-xh!Kljs&*11?PHB+s}7b<$rwb52)Pv zJEZWeQQVJ$v1;53G;N_#6wgSS87L2#^pZTY?qRXqi2stLea-B5$(v^8%ettBch5W^ z&qBs=yj|gD7E5{}al4PC&nB+NDSJmVq5TisD^`+ggjiBbo`4~R=N-)*oyW9{5vnih z)h211nY|mhSM)^&%OzbPX@7q+8)aq}nc0IWk-i;{H35Z8c@pLMbFo+UF^|kQyGbkP z&&fU}B>o;N_j06m{Ikfh>X5?oe$_=&lIzV)yHe7lDffyhe43fvXlBa`(C*`1*Lo)1 ze-TlC@7g!JNwe(F$v^h4kKjWeygyx5w;gK-&he0ijTAgP23(WF%YVlk!1K6#y1}Fb z1b~AI@>`I`!$%y)QF2QaMbVYj^jm_@J>K^0c~AE4` z^xcB8`kuM0^*|Q4 zGut3(RnBwg1E&<=AKG@b<2kvr-(%$5o#W-spZ`V9=beR6jQsJkhwUn_{3_tY0Ve(!PbtH5tN6uxJA;3wepFVy2uQ?#!egU4ozkj_q@T^DELVCPjUs`P9=3=?b@{r8#auA0|#>1WtXvatFv00 zH*aRjlqsxRw~iGnR)8~Sems0cfaMnhZ5WQrdP(As1Xk|AkT{OFc?w%fPB0?z{KbI) z%AFbXS${#Q^F7+bGid)^M7|;o$jf}G8!K0?WaP+^%$hZeIdeW-Hq4thkJi@KB&qKd z86IHwm6UdjrE(7Zd5AWOqFVz>YXOF5^i$6$imveI?ohPMd+z9rt{LOe`dhgq3Z3sO z1mHIrLUjmQT3TpsZYGMN?PZ%bZSu(u^W+*9V1MOefs`&hyBeKl0=GiEFHKn;h1s)b z=aHP^$rU>LmU%o0m&xkm!T{a0D)QLUKCe*V6fEwXypJbRXuqG*H@@q(e&AAm?*uA_ zUVkT{$&+VDfM#k=8}7wnKqC z;6D+#8kkF^+iz!Kh9`%g=>hQV0`h-`N;CQ%a8iKwv^b7eRhhN=Gpg9i;qu#kd?ST+ zH=xy{{cX{@+EMp$9^5MSAW8emy+LtE`G32=TmYr7q~1yorbKdHuJ+G*xd6^Gxf3Nz zB&|-mS%E&P44d9=X7dZkdxl)HLlRpgUFt{Xa9g-@aDM9Xs*L`{l3oNJDwRq%nORoW zY)F`CkMK*z;0|Fo5AWGO*LAC?O00Ln-AQ~hJvPwYAVKIh9kqBWi35x@PU{JCdNQRlo z{QPkHkxsv=?y6qiL(Ko2cV_1GU8}3BtM0v3W8^akps$GRFCzPh$bVKMvWbZFjxNs> zkq1O%k}+mcb1Ynq$^mQ-+zkAOY%BzR1hh2U?$sy}KyTnCpxdJpB=ICLu-QJWMhO5~ zfctWEf;e6VHfpvnt5FcZ_X~D}8r}f5XtqDAkrU{sFuSDA0Q#Dl2Al+J*lho*0zou_Gk09JmDNQHA}@0$_k=fpe1AOhLhGipZWKvaN`GCHgr? zMEYA~FA<0jM1CV83q)jy zF=lBIVFuU>_yvATxHK#TZUA-&(7zwhQBZFvF3;UypCSNj0Du38`E^ziVIzR2Dr)eD zfK4*=Z-jQBMxz60#3)oLfYTFxeE_TzDr5uTo{R=t4m<#yj0S&(qH~6U(eGOUhXE6T ze>!9=298Rx92@GatjOiV2RkTD!;1&aA<&k7bTew%wRaF0S;VY(Yr--t*RJD7UuFl7M4cS z`fqyr_kSMHw`YubO%X{O3g?N)ZIyc=a=nNQ5Rt_qvMl;60=_6BJ2ybT4c8fCR)jDB z+lfdIW6bjv*_4HoL}aKZ?FGh|4?p<}_(4YRIkOUzJpmk_^QkV1HlR-qdnW)lR?!w7 zx(5OaJpFr#_^5}bf?rQz=ms`xhGUU^yQ2jtjekZruul$qd!kX+#pH;?07EEHYy zz{kCl%-_ghcs8$L1sv)Rw9>qJ0>Ffvw(k>@@!cH!cLBf7se35t0j4+}wF&rD2GePYx1QTW}He+2$T!8h9k?Bv0it6}m2SQEI# z)2XsCodP9cXc#{UuX+gJa0~A#p1jG9l!m3i1~wtbWiSR;B9(=xah7;GSO#tb)`;ov z2kZ-65M8@3`rHQm5X%z}JZO>o9vQD3w114R&BD6~80^tj2M73hzDtNJwfTuL9`~&> z0K;%6%*sLsv49$|8(P1y+=F*IFfzt_lY{QS3_s6E(UBV8K?6)_tHC(lB_%2K`wZr0 zcZMB3oy?1ei6&BLCDre8$mk-9!{A<-J(%L-=co_E$FTw!k-~pUfUT`*jr}(d0e=mh zGbHS@C9lfBOkiwG&z@+ZM-iNbP9T?Au65!lzenppv+x|2t$@G)`~yrc*kr_o&Gitn zSs6Dr6zHU=&C^j|yaXIYEb0dAkN?^{4PEFfW{Tr_T@)8h$tR0@TsY3cKOw-rFLPT!U_`ITj7ur_Co`j%aO|W6|&GI5zx? z*gh1pE12S#;?v+h!JT7EyTbtht_o-a${zMBPsM$?j* zjRvE}qh)f#iQfId;22$UnKj8Ge{1YZ))@p8@Bs5HGM)f_;%Lid=%mlJVYmzX$QH-5 z=!DV-OYn$O)SP+EQ|K<%!)7TwC&cLfnBdzaLE8uWy8fXY zwq9b9vj8m%a4l849N&L{Zg%NM{i`ky<`OWOhS^EiSH2llZAF0hm5B@Y)hg(;iIK`BD#ay z7cYqJEU)245lMF95P!@Nkvl^eYMr6elYXR#F^OHA}7b|ETf|eE)KCLfzzVVDGY?|MOXoRyMU1{ z8+xLXu2BxXtr`4tBHPwy)pzv}3+=5A9UBMQ>?+-#9Ha4>lYiZj(k62}_>*wvLDEnQ zs7y|!s^^&u*oN|4K;#dMF2bia=tCSi*R zwgbIAWL<$4mwyaK_ZM~m+gs=^bolf<9+gGt24Ghhc^S|@MmsE{9aFc&qpK2E0LzB! zv+U1AN&{u#ufT3O^z{d>V`bpy9AFoRjv1aZdjXH2Vdnm5xcC(kSywbs<-*;hY*9xy z8oiprf2D=z?+)78_;vFAQ}o5L7#QT!R#^(Oa_U)l8hQNO!;Ia(3if;(vxw5<<4J!X&S_uA;QOM>Qsl6ueSgp-&mkj@Hp;9!K_h>UmfA$==tfT;6JX~QI`4^H%#Ul(!rHaaC;d%g$tPe7 z%Bf+f`O%tUPfu1YKxqetx#&~mq}`h%Lgo1=?1vVBRE0W3ya~_FP=Lr=NGNOAFvnvbfClWdE{Ka0jCx5 zB_`+g$fkC{ciVkAKzsGsxXZj;=s?4<2a{5jiyjE-LV6Krw(Wh<)y(ne2vkcsTRUdN z(;MC9HwKM;Y)64p?aBsv)KWW%C38^(O@BJjjO8d1*;hoqDk5JJkqt%v<t-Eh0li4>#`??acE;J56+( zh}>h0@vZY%jjDiV9c#P1?k!n%3$R|w^ Date: Fri, 23 Jul 2021 12:00:43 +0300 Subject: [PATCH 21/51] fixed typo in disclaimer --- README.md | 2 +- docs/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cefe8fffb..22dd0c0b2 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ More examples can be found [here](https://github.com/crowcpp/crow/tree/master/ex Available [here](https://crowcpp.github.io/crow/getting_started/setup). ## Disclaimer -CrowCpp/Crow is a project based on ipkn/crow. Neither CrowCpp, it's members, or this projects have been associated with, or endorsed or supported by ipkn (Jaeseung Ha) in any way. We do use ipkn/crow's source code under the BSD-3 clause license and sometimes refer to the public comments available on the github repository. But we do not in any way claim to be associated with or in contact with ipkn (Jaeseung Ha) regarding CrowCpp or CrowCpp/Crow +CrowCpp/Crow is a project based on ipkn/crow. Neither CrowCpp, it's members, or this project have been associated with, or endorsed or supported by ipkn (Jaeseung Ha) in any way. We do use ipkn/crow's source code under the BSD-3 clause license and sometimes refer to the public comments available on the github repository. But we do not in any way claim to be associated with or in contact with ipkn (Jaeseung Ha) regarding CrowCpp or CrowCpp/Crow ## Attributions Crow has incorporated the following libraries into its source. diff --git a/docs/index.md b/docs/index.md index 7e0d5865b..19006d8f2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -102,4 +102,4 @@ More examples can be found [here](https://github.com/crowcpp/crow/tree/master/ex Available [here](https://crowcpp.github.io/crow/getting_started/setup). ## Disclaimer -CrowCpp/Crow is a project based on ipkn/crow. Neither CrowCpp, it's members, or this projects have been associated with, or endorsed or supported by ipkn (Jaeseung Ha) in any way. We do use ipkn/crow's source code under the BSD-3 clause license and sometimes refer to the public comments available on the github repository. But we do not in any way claim to be associated with or in contact with ipkn (Jaeseung Ha) regarding CrowCpp or CrowCpp/Crow +CrowCpp/Crow is a project based on ipkn/crow. Neither CrowCpp, it's members, or this project have been associated with, or endorsed or supported by ipkn (Jaeseung Ha) in any way. We do use ipkn/crow's source code under the BSD-3 clause license and sometimes refer to the public comments available on the github repository. But we do not in any way claim to be associated with or in contact with ipkn (Jaeseung Ha) regarding CrowCpp or CrowCpp/Crow From cbf1b664816403a75ebc26495342d9b96d1134ee Mon Sep 17 00:00:00 2001 From: Farook Al-Sammarraie Date: Mon, 26 Jul 2021 01:31:50 +0300 Subject: [PATCH 22/51] Create FUNDING.yml --- .github/FUNDING.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..dff867dc5 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +open_collective: crow From 6878897f0a93755e4585e06e8820eb7b7be222ce Mon Sep 17 00:00:00 2001 From: The-EDev Date: Mon, 26 Jul 2021 14:02:31 +0300 Subject: [PATCH 23/51] Added logo that works in light and dark mode for github readme --- README.md | 2 +- docs/assets/crowlogo_dual_color.svg | 90 +++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 docs/assets/crowlogo_dual_color.svg diff --git a/README.md b/README.md index 22dd0c0b2..cbb70cf94 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

+

A Fast and Easy to use microframework for the web.

diff --git a/docs/assets/crowlogo_dual_color.svg b/docs/assets/crowlogo_dual_color.svg new file mode 100644 index 000000000..b70a954c6 --- /dev/null +++ b/docs/assets/crowlogo_dual_color.svg @@ -0,0 +1,90 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + From dad25b0dab8260f3113d2465bf288ec5a8946120 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Mon, 26 Jul 2021 14:04:32 +0300 Subject: [PATCH 24/51] use github as readme logo source (doesn't require CI to show logo changes) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cbb70cf94..6e741b628 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

+

A Fast and Easy to use microframework for the web.

From 06c4829ca73a96679e38eb1ff8ec5da341d82422 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Tue, 27 Jul 2021 10:52:49 +0300 Subject: [PATCH 25/51] implemented all blueprint features --- examples/example_blueprint.cpp | 13 +- include/crow/app.h | 82 ++++++------ include/crow/routing.h | 235 ++++++++++++++++++++++++++------- 3 files changed, 240 insertions(+), 90 deletions(-) diff --git a/examples/example_blueprint.cpp b/examples/example_blueprint.cpp index df1994b54..4717bed64 100644 --- a/examples/example_blueprint.cpp +++ b/examples/example_blueprint.cpp @@ -7,12 +7,15 @@ int main() crow::Blueprint bp("bp_prefix", "cstat", "ctemplate"); - CROW_BP_ROUTE(app, bp, "/") + + crow::Blueprint sub_bp("bp2", "csstat", "cstemplate"); + + CROW_BP_ROUTE(sub_bp, "/") ([]() { return "Hello world!"; }); - CROW_BP_ROUTE(app, bp, "/templatt") + CROW_BP_ROUTE(bp, "/templatt") ([]() { crow::mustache::context ctxdat; ctxdat["messg"] = "fifty five!!"; @@ -22,7 +25,11 @@ int main() return page.render(ctxdat); }); + CROW_BP_CATCHALL_ROUTE(sub_bp)([](){return "WRONG!!";}); + + + bp.register_blueprint(sub_bp); app.register_blueprint(bp); - app.port(18080).run(); + app.loglevel(crow::LogLevel::DEBUG).port(18080).run(); } diff --git a/include/crow/app.h b/include/crow/app.h index ab6d6065d..c3e7ad5fd 100644 --- a/include/crow/app.h +++ b/include/crow/app.h @@ -25,13 +25,13 @@ #ifdef CROW_MSVC_WORKAROUND #define CROW_ROUTE(app, url) app.route_dynamic(url) -#define CROW_BP_ROUTE(app, blueprint, url) app.route_dynamic(blueprint, url) +//#define CROW_BP_ROUTE(app, blueprint, url) app.route_dynamic(blueprint, url) #else #define CROW_ROUTE(app, url) app.route(url) -#define CROW_BP_ROUTE(app, blueprint, url) app.route(blueprint, url) +//#define CROW_BP_ROUTE(app, blueprint, url) app.route(blueprint, url) #endif #define CROW_CATCHALL_ROUTE(app) app.catchall_route() -#define CROW_BP_CATCHALL_ROUTE(app, blueprint) app.catchall_route(blueprint) +//#define CROW_BP_CATCHALL_ROUTE(app, blueprint) app.catchall_route(blueprint) namespace crow { @@ -84,27 +84,27 @@ namespace crow return router_.new_rule_dynamic(std::move(rule)); } - ///Create a dynamic route for a blueprint using a rule (**Use CROW_BP_ROUTE instead**) - DynamicRule& route_dynamic(Blueprint& blueprint, std::string&& rule) - { - return blueprint.new_rule_dynamic(std::move(rule)); - } +// ///Create a dynamic route for a blueprint using a rule (**Use CROW_BP_ROUTE instead**) +// DynamicRule& route_dynamic(Blueprint& blueprint, std::string&& rule) +// { +// return blueprint.new_rule_dynamic(std::move(rule)); +// } ///Create a route using a rule (**Use CROW_ROUTE instead**) template auto route(std::string&& rule) -> typename std::result_of)(Router, std::string&&)>::type - {//TODO process the blueprint + { return router_.new_rule_tagged(std::move(rule)); } - ///Create a route for a blueprint using a rule (**Use CROW_BP_ROUTE instead**) - template - auto route(Blueprint& blueprint, std::string&& rule) - -> typename std::result_of)(Router, std::string&&)>::type - { - return blueprint.new_rule_tagged(std::move(rule)); - } +// ///Create a route for a blueprint using a rule (**Use CROW_BP_ROUTE instead**) +// template +// auto route(Blueprint& blueprint, std::string&& rule) +// -> typename std::result_of)(Router, std::string&&)>::type +// { +// return blueprint.new_rule_tagged(std::move(rule)); +// } ///Create a route for any requests without a proper route (**Use CROW_CATCHALL_ROUTE instead**) CatchallRule& catchall_route() @@ -112,11 +112,11 @@ namespace crow return router_.catchall_rule(); } - ///Create a route for any requests without a proper route within the blueprint (**Use CROW_BP_CATCHALL_ROUTE instead**) - CatchallRule& catchall_route(Blueprint& blueprint) - { - return blueprint.catchall_rule(); - } +// ///Create a route for any requests without a proper route within the blueprint (**Use CROW_BP_CATCHALL_ROUTE instead**) +// CatchallRule& catchall_route(Blueprint& blueprint) +// { +// return blueprint.catchall_rule(); +// } self_t& signal_clear() { @@ -190,10 +190,7 @@ namespace crow self_t& register_blueprint(Blueprint& blueprint) { - if (blueprints_.empty() || std::find(blueprints_.begin(), blueprints_.end(), &blueprint) == blueprints_.end()) - { - blueprints_.emplace_back(&blueprint); - }//TODO error throwing + router_.register_blueprint(blueprint); return *this; } @@ -224,20 +221,7 @@ namespace crow ///Go through the rules, upgrade them if possible, and add them to the list of rules void validate() { - router_.validate(blueprints_); - } - - ///Notify anything using `wait_for_server_start()` to proceed - void notify_server_start() - { - std::unique_lock lock(start_mutex_); - server_started_ = true; - cv_started_.notify_all(); - } - ///Run the server - void run() - { #ifndef CROW_DISABLE_STATIC_DIR route(CROW_STATIC_ENDPOINT) ([](crow::response& res, std::string file_path_partial) @@ -246,11 +230,11 @@ namespace crow res.end(); }); - for (auto& bp : blueprints_) + for (auto& bp : router_.blueprints()) { if (!bp->static_dir().empty()) { - route(*bp, CROW_STATIC_ENDPOINT) + bp->new_rule_tagged(CROW_STATIC_ENDPOINT) ([bp](crow::response& res, std::string file_path_partial) { res.set_static_file_info(bp->static_dir() + '/' + file_path_partial); @@ -259,6 +243,22 @@ namespace crow } } #endif + + router_.validate(); + } + + ///Notify anything using `wait_for_server_start()` to proceed + void notify_server_start() + { + std::unique_lock lock(start_mutex_); + server_started_ = true; + cv_started_.notify_all(); + } + + ///Run the server + void run() + { + validate(); #ifdef CROW_ENABLE_SSL @@ -426,8 +426,6 @@ namespace crow std::vector signals_{SIGINT, SIGTERM}; - std::vector blueprints_; - bool server_started_{false}; std::condition_variable cv_started_; std::mutex start_mutex_; diff --git a/include/crow/routing.h b/include/crow/routing.h index 1fc1bf8a8..b521c81dd 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -85,6 +85,7 @@ namespace crow std::unique_ptr rule_to_upgrade_; friend class Router; + friend class Blueprint; template friend struct RuleParameterTraits; }; @@ -707,13 +708,16 @@ namespace crow const int RULE_SPECIAL_REDIRECT_SLASH = 1; + /// A search tree. class Trie { public: struct Node { - unsigned rule_index{}; + uint16_t rule_index{}; + // Assign the index to the maximum 32 unsigned integer value by default so that any other number (specifically 0) is a valid BP id. + uint16_t blueprint_index{0xFFFF}; std::string key; ParamType param = ParamType::MAX; // MAX = No param. std::vector children; @@ -722,6 +726,7 @@ namespace crow { return !rule_index && + blueprint_index == 0xFFFF && children.size() < 2 && param == ParamType::MAX && std::all_of(std::begin(children), std::end(children), [](Node* x){ return x->param == ParamType::MAX; }); @@ -758,6 +763,7 @@ namespace crow Node* child_temp = node->children[0]; node->key = node->key + child_temp->key; node->rule_index = child_temp->rule_index; + node->blueprint_index = child_temp->blueprint_index; node->children = std::move(child_temp->children); delete(child_temp); optimizeNode(node); @@ -821,33 +827,45 @@ namespace crow optimize(); } - std::pair find(const std::string& req_url, const Node* node = nullptr, unsigned pos = 0, routing_params* params = nullptr) const + //Rule_index, Blueprint_index, routing_params + std::tuple, routing_params> find(const std::string& req_url, const Node* node = nullptr, unsigned pos = 0, routing_params* params = nullptr, std::vector* blueprints = nullptr) const { + static const uint16_t idx_max{0xFFFF}; //start params as an empty struct routing_params empty; if (params == nullptr) params = ∅ + //same for blueprint vector + std::vector MT; + if (blueprints == nullptr) + blueprints = &MT; - unsigned found{}; //The rule index to be found + uint16_t found{}; //The rule index to be found + std::vector found_BP; //The Blueprint indices to be found routing_params match_params; //supposedly the final matched parameters //start from the head node if (node == nullptr) node = &head_; - //if the function was called on a node at the end of the string (the last recursion), return the nodes rule index, and whatever params were passed to the function - if (pos == req_url.size()) - return {node->rule_index, *params}; - - auto update_found = [&found, &match_params](std::pair& ret) + auto update_found = [&found, &found_BP, &match_params](std::tuple, routing_params>& ret) { - if (ret.first && (!found || found > ret.first)) + found_BP = std::move(std::get<1>(ret)); + if (std::get<0>(ret) && (!found || found > std::get<0>(ret))) { - found = ret.first; - match_params = std::move(ret.second); + found = std::get<0>(ret); + match_params = std::move(std::get<2>(ret)); } }; + //if the function was called on a node at the end of the string (the last recursion), return the nodes rule index, and whatever params were passed to the function + if (pos == req_url.size()) + { + found_BP = std::move(*blueprints); + return {node->rule_index, *blueprints, *params}; + } + + bool found_fragment = false; for(auto& child : node->children) { @@ -863,10 +881,13 @@ namespace crow long long int value = strtoll(req_url.data()+pos, &eptr, 10); if (errno != ERANGE && eptr != req_url.data()+pos) { + found_fragment = true; params->int_params.push_back(value); - auto ret = find(req_url, child, eptr - req_url.data(), params); + if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + auto ret = find(req_url, child, eptr - req_url.data(), params, blueprints); update_found(ret); params->int_params.pop_back(); + blueprints->pop_back(); } } } @@ -881,10 +902,13 @@ namespace crow unsigned long long int value = strtoull(req_url.data()+pos, &eptr, 10); if (errno != ERANGE && eptr != req_url.data()+pos) { + found_fragment = true; params->uint_params.push_back(value); - auto ret = find(req_url, child, eptr - req_url.data(), params); + if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + auto ret = find(req_url, child, eptr - req_url.data(), params, blueprints); update_found(ret); params->uint_params.pop_back(); + blueprints->pop_back(); } } } @@ -899,10 +923,13 @@ namespace crow double value = strtod(req_url.data()+pos, &eptr); if (errno != ERANGE && eptr != req_url.data()+pos) { + found_fragment = true; params->double_params.push_back(value); - auto ret = find(req_url, child, eptr - req_url.data(), params); + if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + auto ret = find(req_url, child, eptr - req_url.data(), params, blueprints); update_found(ret); params->double_params.pop_back(); + blueprints->pop_back(); } } } @@ -918,10 +945,13 @@ namespace crow if (epos != pos) { + found_fragment = true; params->string_params.push_back(req_url.substr(pos, epos-pos)); - auto ret = find(req_url, child, epos, params); + if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + auto ret = find(req_url, child, epos, params, blueprints); update_found(ret); params->string_params.pop_back(); + blueprints->pop_back(); } } @@ -931,10 +961,13 @@ namespace crow if (epos != pos) { + found_fragment = true; params->string_params.push_back(req_url.substr(pos, epos-pos)); - auto ret = find(req_url, child, epos, params); + if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + auto ret = find(req_url, child, epos, params, blueprints); update_found(ret); params->string_params.pop_back(); + blueprints->pop_back(); } } } @@ -944,18 +977,28 @@ namespace crow const std::string& fragment = child->key; if (req_url.compare(pos, fragment.size(), fragment) == 0) { - auto ret = find(req_url, child, pos + fragment.size(), params); + found_fragment = true; + if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + auto ret = find(req_url, child, pos + fragment.size(), params, blueprints); update_found(ret); + blueprints->pop_back(); } } } - return {found, match_params}; //Called after all the recursions have been done + + if (!found_fragment) + found_BP = std::move(*blueprints); + + return {found, found_BP, match_params}; //Called after all the recursions have been done } - void add(const std::string& url, unsigned rule_index) + //This functions assumes any blueprint info passed is valid + void add(const std::string& url, uint16_t rule_index, unsigned bp_prefix_length = 0, uint16_t blueprint_index = 0xFFFF) { Node* idx = &head_; + bool has_blueprint = bp_prefix_length != 0 && blueprint_index != 0xFFFF; + for(unsigned i = 0; i < url.size(); i ++) { char c = url[i]; @@ -1021,6 +1064,9 @@ namespace crow { auto new_node_idx = new_node(idx); new_node_idx->key = c; + //The assumption here is that you'd only need to add a blueprint index if the tree didn't have the BP prefix. + if (has_blueprint && i == bp_prefix_length) + new_node_idx->blueprint_index = blueprint_index; idx = new_node_idx; } } @@ -1032,14 +1078,14 @@ namespace crow idx->rule_index = rule_index; } - size_t get_size() + size_t get_size(bool small_enum_flag = false) { - return get_size(&head_); + return get_size(&head_, small_enum_flag); } - size_t get_size(Node* node) + size_t get_size(Node* node, bool small_enum_flag) { - unsigned size = 8; //rule_index and param + unsigned size = small_enum_flag ? 3 : 6; //rule_index and param size += (node->key.size()); //each character in the key is 1 byte for (auto child: node->children) { @@ -1062,6 +1108,12 @@ namespace crow Node head_; }; +#ifdef CROW_MSVC_WORKAROUND +#define CROW_BP_ROUTE(blueprint, url) blueprint.new_rule_dynamic(url) +#else +#define CROW_BP_ROUTE(blueprint, url) blueprint.new_rule_tagged(url) +#endif +#define CROW_BP_CATCHALL_ROUTE(blueprint) blueprint.catchall_rule() /// A blueprint can be considered a smaller section of a Crow app, specifically where the router is conecerned. class Blueprint { @@ -1124,8 +1176,8 @@ namespace crow return static_dir_; } - DynamicRule& new_rule_dynamic(const std::string& rule) - { + DynamicRule& new_rule_dynamic(const std::string&& rule) + {//TODO maybe try not copying the same data (reuse rule) std::string new_rule = '/' + prefix_ + rule; auto ruleObject = new DynamicRule(new_rule); ruleObject->custom_templates_base = templates_dir_; @@ -1135,7 +1187,7 @@ namespace crow } template - typename black_magic::arguments::type::template rebind& new_rule_tagged(const std::string& rule) + typename black_magic::arguments::type::template rebind& new_rule_tagged(const std::string&& rule) { std::string new_rule = '/' + prefix_ + rule; using RuleT = typename black_magic::arguments::type::template rebind; @@ -1147,6 +1199,22 @@ namespace crow return *ruleObject; } + void register_blueprint(Blueprint& blueprint) + { + if (blueprints_.empty() || std::find(blueprints_.begin(), blueprints_.end(), &blueprint) == blueprints_.end()) + { + blueprint.prefix_ = prefix_ + '/' + blueprint.prefix_; + blueprint.static_dir_ = static_dir_ + '/' + blueprint.static_dir_; + blueprint.templates_dir_ = templates_dir_ + '/' + blueprint.templates_dir_; + for (auto& rule : blueprint.all_rules_) + { + std::string new_rule = '/' + prefix_ + rule->rule_; + rule->rule_ = new_rule; + } + blueprints_.emplace_back(&blueprint); + }//TODO error throwing + } + CatchallRule& catchall_rule() { return catchall_rule_; @@ -1158,6 +1226,8 @@ namespace crow std::string templates_dir_; std::vector> all_rules_; CatchallRule catchall_rule_; + std::vector blueprints_; + friend class Router; }; @@ -1193,7 +1263,7 @@ namespace crow return catchall_rule_; } - void internal_add_rule_object(const std::string& rule, BaseRule* ruleObject) + void internal_add_rule_object(const std::string& rule, BaseRule* ruleObject, const uint16_t& BP_index, std::vector& blueprints) { bool has_trailing_slash = false; std::string rule_without_trailing_slash; @@ -1207,31 +1277,82 @@ namespace crow ruleObject->foreach_method([&](int method) { per_methods_[method].rules.emplace_back(ruleObject); - per_methods_[method].trie.add(rule, per_methods_[method].rules.size() - 1); + per_methods_[method].trie.add(rule, per_methods_[method].rules.size() - 1, BP_index != 0xFFFF ? blueprints[BP_index]->prefix().length() : 0, BP_index); // directory case: // request to '/about' url matches '/about/' rule if (has_trailing_slash) { - per_methods_[method].trie.add(rule_without_trailing_slash, RULE_SPECIAL_REDIRECT_SLASH); + per_methods_[method].trie.add(rule_without_trailing_slash, RULE_SPECIAL_REDIRECT_SLASH, BP_index != 0xFFFF ? blueprints_[BP_index]->prefix().length() : 0, BP_index); } }); } - void validate(std::vector& bp_list) + void register_blueprint(Blueprint& blueprint) { - //Take all the routes from the registered blueprints and add them to `all_rules_` to be processed. - if (!(bp_list.empty())) + if (blueprints_.empty() || std::find(blueprints_.begin(), blueprints_.end(), &blueprint) == blueprints_.end()) + { + blueprints_.emplace_back(&blueprint); + }//TODO error throwing + } + + void get_recursive_child_methods(Blueprint* blueprint, std::vector& methods) + { + //we only need to deal with children if the blueprint has absolutely no methods (meaning its index won't be added to the trie) + if (blueprint->static_dir_ == "" && blueprint->all_rules_.empty()) { - for (Blueprint* bp : bp_list) + for(Blueprint* bp : blueprint->blueprints_) { - for (auto& rule: bp->all_rules_) + get_recursive_child_methods(bp, methods); + } + } + else if (blueprint->static_dir_ != "") + methods.emplace_back(HTTPMethod::GET); + for (auto& rule: blueprint->all_rules_) + { + rule->foreach_method([&methods](unsigned method){ + HTTPMethod method_final = static_cast(method); + if (std::find(methods.begin(), methods.end(), method_final) == methods.end()) + methods.emplace_back(method_final); + }); + } + } + + void validate_bp(std::vector blueprints) + { + for (unsigned i = 0; i < blueprints.size(); i++) + { + Blueprint* blueprint = blueprints[i]; + if (blueprint->static_dir_ == "" && blueprint->all_rules_.empty()) + { + std::vector methods; + get_recursive_child_methods(blueprint, methods); + for (HTTPMethod x : methods) { - all_rules_.push_back(std::move(rule)); + int i = static_cast(x); + per_methods_[i].trie.add(blueprint->prefix(), 0, blueprint->prefix().length(), i); } - } + } + for (auto& rule: blueprint->all_rules_) + { + if (rule) + { + auto upgraded = rule->upgrade(); + if (upgraded) + rule = std::move(upgraded); + rule->validate(); + internal_add_rule_object(rule->rule(), rule.get(), i, blueprints); + } + } + validate_bp(blueprint->blueprints_); } + } + + void validate() + { + //Take all the routes from the registered blueprints and add them to `all_rules_` to be processed. + validate_bp(blueprints_); for(auto& rule:all_rules_) { @@ -1241,7 +1362,7 @@ namespace crow if (upgraded) rule = std::move(upgraded); rule->validate(); - internal_add_rule_object(rule->rule(), rule.get()); + internal_add_rule_object(rule->rule(), rule.get(), 0xFFFF, blueprints_); } } for(auto& per_method:per_methods_) @@ -1259,13 +1380,13 @@ namespace crow auto& per_method = per_methods_[static_cast(req.method)]; auto& rules = per_method.rules; - unsigned rule_index = per_method.trie.find(req.url).first; + unsigned rule_index = std::get<0>(per_method.trie.find(req.url)); if (!rule_index) { for (auto& per_method: per_methods_) { - if (per_method.trie.find(req.url).first) + if (std::get<0>(per_method.trie.find(req.url))) { CROW_LOG_DEBUG << "Cannot match method " << req.url << " " << method_name(req.method); res = response(405); @@ -1324,6 +1445,18 @@ namespace crow } } + Blueprint* get_found_bp(std::vector& bp_i, std::vector& blueprints) + { + if (bp_i.empty()) + return nullptr; + else if (bp_i.size() == 1) + return blueprints[bp_i[0]]; + + uint16_t index = bp_i[0]; + bp_i.erase(bp_i.begin()); + return get_found_bp(bp_i, blueprints[index]->blueprints_); + } + void handle(const request& req, response& res) { HTTPMethod method_actual = req.method; @@ -1358,7 +1491,7 @@ namespace crow { for(int i = 0; i < static_cast(HTTPMethod::InternalMethodCount); i ++) { - if (per_methods_[i].trie.find(req.url).first) + if (std::get<0>(per_methods_[i].trie.find(req.url))) { allow += method_name(static_cast(i)) + ", "; } @@ -1388,13 +1521,13 @@ namespace crow auto found = trie.find(req.url); - unsigned rule_index = found.first; + unsigned rule_index = std::get<0>(found); if (!rule_index) { for (auto& per_method: per_methods_) { - if (per_method.trie.find(req.url).first) + if (std::get<0>(per_method.trie.find(req.url))) { CROW_LOG_DEBUG << "Cannot match method " << req.url << " " << method_name(method_actual); res = response(405); @@ -1403,9 +1536,15 @@ namespace crow } } - if (catchall_rule_.has_handler()) + Blueprint* bp_found = get_found_bp(std::get<1>(found), blueprints_); + if (bp_found != nullptr && bp_found->catchall_rule().has_handler()) + { + CROW_LOG_DEBUG << "Cannot match rules " << req.url << ". Redirecting to Blueprint \"" << bp_found->prefix() << "\" Catchall rule"; + bp_found->catchall_rule().handler_(req, res); + } + else if (catchall_rule_.has_handler()) { - CROW_LOG_DEBUG << "Cannot match rules " << req.url << ". Redirecting to Catchall rule"; + CROW_LOG_DEBUG << "Cannot match rules " << req.url << ". Redirecting to global Catchall rule"; catchall_rule_.handler_(req, res); } else @@ -1443,7 +1582,7 @@ namespace crow // any uncaught exceptions become 500s try { - rules[rule_index]->handle(req, res, found.second); + rules[rule_index]->handle(req, res, std::get<2>(found)); } catch(std::exception& e) { @@ -1470,6 +1609,11 @@ namespace crow } } + std::vector& blueprints() + { + return blueprints_; + } + private: CatchallRule catchall_rule_; @@ -1483,6 +1627,7 @@ namespace crow }; std::array(HTTPMethod::InternalMethodCount)> per_methods_; std::vector> all_rules_; + std::vector blueprints_; }; } From 6aa5dba57968a5b196ca2b527288a3187a8b150d Mon Sep 17 00:00:00 2001 From: Lucas David Date: Tue, 27 Jul 2021 15:39:51 +0200 Subject: [PATCH 26/51] + buf[1] += static_cast(size); - buf[1] += size; ~ Warning was triggered by 'size' being std::size_t and lossing data by implicit casting to a narrower type. This behavior seems correct, then we can explicit cast it. --- include/crow/websocket.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/crow/websocket.h b/include/crow/websocket.h index 6b2d4e73d..4c4f2b944 100644 --- a/include/crow/websocket.h +++ b/include/crow/websocket.h @@ -194,7 +194,7 @@ namespace crow buf[0] += opcode; if (size < 126) { - buf[1] += size; + buf[1] += static_cast(size); return {buf, buf+2}; } else if (size < 0x10000) From 1bb5e0ac6316da5525e9456c60829cb2a31aafd7 Mon Sep 17 00:00:00 2001 From: Lucas David Date: Tue, 27 Jul 2021 17:04:54 +0200 Subject: [PATCH 27/51] + auto to_read = static_cast(buffer_.size()); ~ if (remaining_length_ < to_read) ~ to_read = remaining_length_; + adaptor_.socket().async_read_some(boost::asio::buffer(buffer_, static_cast(to_read)) - size_t to_read = buffer_.size(); ~ if (remaining_length_ < to_read) ~ to_read = remaining_length_; - adaptor_.socket().async_read_some( boost::asio::buffer(buffer_, to_read) ~ Changed 'to_read' from [std::size_t] to [std::uint64_t], hence when 'remaining_length_' [std::uint64_t] is assigned in 'to_read' no data is lossed. When boost::asio::buffer is created 'to_read' is casted back to [std::size_t] explicitly truncating data. It seems to be the correct behavior to choose fixed 'network side' types. --- include/crow/websocket.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/crow/websocket.h b/include/crow/websocket.h index 4c4f2b944..f32b5189d 100644 --- a/include/crow/websocket.h +++ b/include/crow/websocket.h @@ -408,10 +408,10 @@ namespace crow break; case WebSocketReadState::Payload: { - size_t to_read = buffer_.size(); + auto to_read = static_cast(buffer_.size()); if (remaining_length_ < to_read) to_read = remaining_length_; - adaptor_.socket().async_read_some( boost::asio::buffer(buffer_, to_read), + adaptor_.socket().async_read_some(boost::asio::buffer(buffer_, static_cast(to_read)), [this](const boost::system::error_code& ec, std::size_t bytes_transferred) { is_reading = false; From 933b8a1890f2e662f7f69b14d1e1c353b1f955f5 Mon Sep 17 00:00:00 2001 From: Farook Al-Sammarraie Date: Tue, 27 Jul 2021 18:48:49 +0300 Subject: [PATCH 28/51] updated data related to renamed repository --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6e741b628..bf576a4e1 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@

A Fast and Easy to use microframework for the web.

-Build Status -Coverage Status -Documentation +Build Status +Coverage Status +Documentation Gitter

From faebef73d20e901ffdee921836999a61f445614b Mon Sep 17 00:00:00 2001 From: The-EDev Date: Wed, 28 Jul 2021 02:03:51 +0300 Subject: [PATCH 29/51] also updated index.md and more links --- README.md | 4 ++-- docs/index.md | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index bf576a4e1..9147b14eb 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Crow is a C++ microframework for running web services. It uses routing similar t - [HTTP/2 support](https://github.com/crowcpp/crow/issues/8) ## Documentation -Available [here](https://crowcpp.github.io/crow). +Available [here](https://crowcpp.org). ## Examples @@ -98,7 +98,7 @@ CROW_ROUTE(app, "/add_json") More examples can be found [here](https://github.com/crowcpp/crow/tree/master/examples). ## Setting Up / Building -Available [here](https://crowcpp.github.io/crow/getting_started/setup). +Available [here](https://crowcpp.org/getting_started/setup). ## Disclaimer CrowCpp/Crow is a project based on ipkn/crow. Neither CrowCpp, it's members, or this project have been associated with, or endorsed or supported by ipkn (Jaeseung Ha) in any way. We do use ipkn/crow's source code under the BSD-3 clause license and sometimes refer to the public comments available on the github repository. But we do not in any way claim to be associated with or in contact with ipkn (Jaeseung Ha) regarding CrowCpp or CrowCpp/Crow diff --git a/docs/index.md b/docs/index.md index 19006d8f2..587f35f7f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,9 +3,9 @@

A Fast and Easy to use microframework for the web.

-Build Status -Coverage Status -Documentation +Build Status +Coverage Status +Documentation Gitter

@@ -30,7 +30,7 @@ Crow is a C++ microframework for running web services. It uses routing similar t - [HTTP/2 support](https://github.com/crowcpp/crow/issues/8) ## Documentation -Available [here](https://crowcpp.github.io/crow). +Available [here](https://crowcpp.org). ## Examples @@ -99,7 +99,7 @@ CROW_ROUTE(app, "/add_json") More examples can be found [here](https://github.com/crowcpp/crow/tree/master/examples). ## Setting Up / Building -Available [here](https://crowcpp.github.io/crow/getting_started/setup). +Available [here](https://crowcpp.org/getting_started/setup). ## Disclaimer CrowCpp/Crow is a project based on ipkn/crow. Neither CrowCpp, it's members, or this project have been associated with, or endorsed or supported by ipkn (Jaeseung Ha) in any way. We do use ipkn/crow's source code under the BSD-3 clause license and sometimes refer to the public comments available on the github repository. But we do not in any way claim to be associated with or in contact with ipkn (Jaeseung Ha) regarding CrowCpp or CrowCpp/Crow From e713ad54cb490788fc8a01ecada7c416b27b411e Mon Sep 17 00:00:00 2001 From: The-EDev Date: Wed, 28 Jul 2021 22:31:08 +0300 Subject: [PATCH 30/51] added unit test, moved macros to app.h, and fixed bug where "bp_prefix2" would be considered a child of "bp_prefix" even if it's not --- include/crow/app.h | 43 +++++++------ include/crow/routing.h | 129 ++++++++++++++++++++++++++------------- tests/unittest.cpp | 134 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 232 insertions(+), 74 deletions(-) diff --git a/include/crow/app.h b/include/crow/app.h index c3e7ad5fd..0e3fbe3ca 100644 --- a/include/crow/app.h +++ b/include/crow/app.h @@ -25,13 +25,13 @@ #ifdef CROW_MSVC_WORKAROUND #define CROW_ROUTE(app, url) app.route_dynamic(url) -//#define CROW_BP_ROUTE(app, blueprint, url) app.route_dynamic(blueprint, url) +#define CROW_BP_ROUTE(blueprint, url) blueprint.new_rule_dynamic(url) #else #define CROW_ROUTE(app, url) app.route(url) -//#define CROW_BP_ROUTE(app, blueprint, url) app.route(blueprint, url) +#define CROW_BP_ROUTE(blueprint, url) blueprint.new_rule_tagged(url) #endif #define CROW_CATCHALL_ROUTE(app) app.catchall_route() -//#define CROW_BP_CATCHALL_ROUTE(app, blueprint) app.catchall_route(blueprint) +#define CROW_BP_CATCHALL_ROUTE(blueprint) blueprint.catchall_rule() namespace crow { @@ -221,30 +221,34 @@ namespace crow ///Go through the rules, upgrade them if possible, and add them to the list of rules void validate() { + if (!validated_) + { #ifndef CROW_DISABLE_STATIC_DIR - route(CROW_STATIC_ENDPOINT) - ([](crow::response& res, std::string file_path_partial) - { - res.set_static_file_info(CROW_STATIC_DIRECTORY + file_path_partial); - res.end(); - }); + route(CROW_STATIC_ENDPOINT) + ([](crow::response& res, std::string file_path_partial) + { + res.set_static_file_info(CROW_STATIC_DIRECTORY + file_path_partial); + res.end(); + }); - for (auto& bp : router_.blueprints()) - { - if (!bp->static_dir().empty()) + for (auto& bp : router_.blueprints()) { - bp->new_rule_tagged(CROW_STATIC_ENDPOINT) - ([bp](crow::response& res, std::string file_path_partial) + if (!bp->static_dir().empty()) { - res.set_static_file_info(bp->static_dir() + '/' + file_path_partial); - res.end(); - }); + bp->new_rule_tagged(CROW_STATIC_ENDPOINT) + ([bp](crow::response& res, std::string file_path_partial) + { + res.set_static_file_info(bp->static_dir() + '/' + file_path_partial); + res.end(); + }); + } } - } #endif - router_.validate(); + router_.validate(); + validated_ = true; + } } ///Notify anything using `wait_for_server_start()` to proceed @@ -406,6 +410,7 @@ namespace crow private: uint16_t port_ = 80; uint16_t concurrency_ = 1; + bool validated_ = false; std::string server_name_ = std::string("Crow/") + VERSION; std::string bindaddr_ = "0.0.0.0"; Router router_; diff --git a/include/crow/routing.h b/include/crow/routing.h index b521c81dd..590bfdcbe 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -1108,12 +1108,6 @@ namespace crow Node head_; }; -#ifdef CROW_MSVC_WORKAROUND -#define CROW_BP_ROUTE(blueprint, url) blueprint.new_rule_dynamic(url) -#else -#define CROW_BP_ROUTE(blueprint, url) blueprint.new_rule_tagged(url) -#endif -#define CROW_BP_CATCHALL_ROUTE(blueprint) blueprint.catchall_rule() /// A blueprint can be considered a smaller section of a Crow app, specifically where the router is conecerned. class Blueprint { @@ -1176,9 +1170,10 @@ namespace crow return static_dir_; } - DynamicRule& new_rule_dynamic(const std::string&& rule) - {//TODO maybe try not copying the same data (reuse rule) - std::string new_rule = '/' + prefix_ + rule; + DynamicRule& new_rule_dynamic(std::string&& rule) + { + std::string new_rule = std::move(rule); + new_rule = '/' + prefix_ + new_rule; auto ruleObject = new DynamicRule(new_rule); ruleObject->custom_templates_base = templates_dir_; all_rules_.emplace_back(ruleObject); @@ -1187,9 +1182,10 @@ namespace crow } template - typename black_magic::arguments::type::template rebind& new_rule_tagged(const std::string&& rule) + typename black_magic::arguments::type::template rebind& new_rule_tagged(std::string&& rule) { - std::string new_rule = '/' + prefix_ + rule; + std::string new_rule = std::move(rule); + new_rule = '/' + prefix_ + new_rule; using RuleT = typename black_magic::arguments::type::template rebind; auto ruleObject = new RuleT(new_rule); @@ -1203,16 +1199,29 @@ namespace crow { if (blueprints_.empty() || std::find(blueprints_.begin(), blueprints_.end(), &blueprint) == blueprints_.end()) { - blueprint.prefix_ = prefix_ + '/' + blueprint.prefix_; - blueprint.static_dir_ = static_dir_ + '/' + blueprint.static_dir_; - blueprint.templates_dir_ = templates_dir_ + '/' + blueprint.templates_dir_; - for (auto& rule : blueprint.all_rules_) - { - std::string new_rule = '/' + prefix_ + rule->rule_; - rule->rule_ = new_rule; - } + apply_blueprint(blueprint); blueprints_.emplace_back(&blueprint); - }//TODO error throwing + } + else + throw std::runtime_error("blueprint \"" + blueprint.prefix_ + "\" already exists in blueprint \"" + prefix_ + '\"'); + } + + void apply_blueprint(Blueprint& blueprint) + { + + blueprint.prefix_ = prefix_ + '/' + blueprint.prefix_; + blueprint.static_dir_ = static_dir_ + '/' + blueprint.static_dir_; + blueprint.templates_dir_ = templates_dir_ + '/' + blueprint.templates_dir_; + for (auto& rule : blueprint.all_rules_) + { + std::string new_rule = '/' + prefix_ + rule->rule_; + rule->rule_ = new_rule; + } + for (Blueprint* bp_child : blueprint.blueprints_) + { + Blueprint& bp_ref = *bp_child; + apply_blueprint(bp_ref); + } } CatchallRule& catchall_rule() @@ -1294,7 +1303,9 @@ namespace crow if (blueprints_.empty() || std::find(blueprints_.begin(), blueprints_.end(), &blueprint) == blueprints_.end()) { blueprints_.emplace_back(&blueprint); - }//TODO error throwing + } + else + throw std::runtime_error("blueprint \"" + blueprint.prefix_ + "\" already exists in router"); } void get_recursive_child_methods(Blueprint* blueprint, std::vector& methods) @@ -1445,16 +1456,41 @@ namespace crow } } - Blueprint* get_found_bp(std::vector& bp_i, std::vector& blueprints) + void get_found_bp(std::vector& bp_i, std::vector& blueprints, std::vector& found_bps, uint16_t index = 0) { - if (bp_i.empty()) - return nullptr; - else if (bp_i.size() == 1) - return blueprints[bp_i[0]]; + if (index < bp_i.size()) + { + // This statement makes 3 assertions: + // 1. The index is above 0. + // 2. The index does not lie outside the given blueprint list. + // 3. The next blueprint we're adding has a prefix that starts the same as the already added blueprint + a slash (the rest is irrelevant). + // + // This is done to prevent a blueprint that has a prefix of "bp_prefix2" to be assumed as a child of one that has "bp_prefix". + // + // If any of the assertions is untrue, we delete the last item added, and continue using the blueprint list of the blueprint found before, the topmost being the router's list + if (index > 0 && bp_i[index] < blueprints.size() && blueprints[bp_i[index]]->prefix().substr(0,found_bps[index-1]->prefix().length()+1).compare(std::string(found_bps[index-1]->prefix()+'/')) == 0) + { + found_bps.push_back(blueprints[bp_i[index]]); + get_found_bp(bp_i, found_bps.back()->blueprints_, found_bps, ++index); + } + else + { + if (!found_bps.empty()) + found_bps.pop_back(); - uint16_t index = bp_i[0]; - bp_i.erase(bp_i.begin()); - return get_found_bp(bp_i, blueprints[index]->blueprints_); + if (found_bps.empty()) + { + found_bps.push_back(blueprints_[bp_i[index]]); + get_found_bp(bp_i, found_bps.back()->blueprints_, found_bps, ++index); + } + else + { + Blueprint* last_element = found_bps.back(); + found_bps.push_back(last_element->blueprints_[bp_i[index]]); + get_found_bp(bp_i, found_bps.back()->blueprints_, found_bps, ++index); + } + } + } } void handle(const request& req, response& res) @@ -1536,21 +1572,32 @@ namespace crow } } - Blueprint* bp_found = get_found_bp(std::get<1>(found), blueprints_); - if (bp_found != nullptr && bp_found->catchall_rule().has_handler()) + std::vector bps_found; + get_found_bp(std::get<1>(found), blueprints_, bps_found); + bool no_bp_catchall = true; + for (int i = bps_found.size()-1; i > 0; i--) { - CROW_LOG_DEBUG << "Cannot match rules " << req.url << ". Redirecting to Blueprint \"" << bp_found->prefix() << "\" Catchall rule"; - bp_found->catchall_rule().handler_(req, res); - } - else if (catchall_rule_.has_handler()) - { - CROW_LOG_DEBUG << "Cannot match rules " << req.url << ". Redirecting to global Catchall rule"; - catchall_rule_.handler_(req, res); + std::vector bpi = std::get<1>(found); + if (bps_found[i]->catchall_rule().has_handler()) + { + no_bp_catchall = false; + CROW_LOG_DEBUG << "Cannot match rules " << req.url << ". Redirecting to Blueprint \"" << bps_found[i]->prefix() << "\" Catchall rule"; + bps_found[i]->catchall_rule().handler_(req, res); + break; + } } - else + if (no_bp_catchall) { - CROW_LOG_DEBUG << "Cannot match rules " << req.url; - res = response(404); + if (catchall_rule_.has_handler()) + { + CROW_LOG_DEBUG << "Cannot match rules " << req.url << ". Redirecting to global Catchall rule"; + catchall_rule_.handler_(req, res); + } + else + { + CROW_LOG_DEBUG << "Cannot match rules " << req.url; + res = response(404); + } } res.end(); return; diff --git a/tests/unittest.cpp b/tests/unittest.cpp index 70d9fab58..22d2e038d 100644 --- a/tests/unittest.cpp +++ b/tests/unittest.cpp @@ -1418,14 +1418,15 @@ TEST_CASE("stream_response") SimpleApp app; + + std::string keyword_ = "hello"; + std::string key_response; + for (unsigned int i = 0; i<250000; i++) + key_response += keyword_; + CROW_ROUTE(app, "/test") - ([](const crow::request&, crow::response& res) + ([&key_response](const crow::request&, crow::response& res) { - std::string keyword_ = "hello"; - std::string key_response; - for (unsigned int i = 0; i<250000; i++) - key_response += keyword_; - res.body = key_response; res.end(); }); @@ -1433,7 +1434,7 @@ TEST_CASE("stream_response") app.validate(); //running the test on a separate thread to allow the client to sleep - std::thread runTest([&app](){ + std::thread runTest([&app, &key_response](){ auto _ = async(launch::async, [&] { app.bindaddr(LOCALHOST_ADDRESS).port(45451).run(); }); @@ -1447,9 +1448,6 @@ TEST_CASE("stream_response") { asio::streambuf b; - std::string keyword_ = "hello"; - std::string key_response; - asio::ip::tcp::socket c(is); c.connect(asio::ip::tcp::endpoint( asio::ip::address::from_string(LOCALHOST_ADDRESS), 45451)); @@ -1459,10 +1457,6 @@ TEST_CASE("stream_response") static char buf[2048]; c.receive(asio::buffer(buf, 2048)); - //creating the string to compare against - for (unsigned int i = 0; i<250000; i++) - key_response += keyword_; - //"hello" is 5 bytes, (5*250000)/16384 = 76.2939 for (unsigned int i = 0; i<76; i++) { @@ -1887,3 +1881,115 @@ TEST_CASE("catchall") CHECK(404 == res.code); } } + +TEST_CASE("blueprint") +{ + SimpleApp app; + crow::Blueprint bp("bp_prefix", "cstat", "ctemplate"); + crow::Blueprint bp_not_sub("bp_prefix_second"); + crow::Blueprint sub_bp("bp2", "csstat", "cstemplate"); + crow::Blueprint sub_sub_bp("bp3"); + + CROW_BP_ROUTE(sub_bp, "/hello") + ([]() { + return "Hello world!"; + }); + + CROW_BP_ROUTE(bp_not_sub, "/hello") + ([]() { + return "Hello world!"; + }); + + CROW_BP_ROUTE(sub_sub_bp, "/hi") + ([]() { + return "Hi world!"; + }); + + CROW_BP_CATCHALL_ROUTE(sub_bp)([](){return response(200, "WRONG!!");}); + + app. register_blueprint(bp); + app. register_blueprint(bp_not_sub); + bp. register_blueprint(sub_bp); + sub_bp.register_blueprint(sub_sub_bp); + + app.validate(); + + { + request req; + response res; + + req.url = "/bp_prefix/bp2/hello"; + + app.handle(req, res); + + CHECK("Hello world!" == res.body); + } + + { + request req; + response res; + + req.url = "/bp_prefix_second/hello"; + + app.handle(req, res); + + CHECK("Hello world!" == res.body); + } + + { + request req; + response res; + + req.url = "/bp_prefix/bp2/bp3/hi"; + + app.handle(req, res); + + CHECK("Hi world!" == res.body); + } + + { + request req; + response res; + + req.url = "/bp_prefix/nonexistent"; + + app.handle(req, res); + + CHECK(404 == res.code); + } + + { + request req; + response res; + + req.url = "/bp_prefix_second/nonexistent"; + + app.handle(req, res); + + CHECK(404 == res.code); + } + + { + request req; + response res; + + req.url = "/bp_prefix/bp2/nonexistent"; + + app.handle(req, res); + + CHECK(200 == res.code); + CHECK("WRONG!!" == res.body); + } + + { + request req; + response res; + + req.url = "/bp_prefix/bp2/bp3/nonexistent"; + + app.handle(req, res); + + CHECK(200 == res.code); + CHECK("WRONG!!" == res.body); + } +} From addcce9e938f54da04a2324f56dd591b7f4649e5 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Fri, 30 Jul 2021 13:09:01 +0300 Subject: [PATCH 31/51] small fixes, optimizations, and documentation --- docs/guides/blueprints.md | 43 +++++++++++++++++++++++++++++++++ examples/example_blueprint.cpp | 4 +-- include/crow/app.h | 14 ----------- include/crow/common.h | 4 +-- include/crow/routing.h | 39 +++++++++++++++++------------- mkdocs.yml | 7 +++--- tests/img/cat.jpg | Bin 34459 -> 42294 bytes 7 files changed, 73 insertions(+), 38 deletions(-) create mode 100644 docs/guides/blueprints.md diff --git a/docs/guides/blueprints.md b/docs/guides/blueprints.md new file mode 100644 index 000000000..2a0637611 --- /dev/null +++ b/docs/guides/blueprints.md @@ -0,0 +1,43 @@ +!!!Warning + + This feature is currently only available on the "master" branch. + +Crow supports flask style blueprints.
+A blueprint is a limited app. It cannot handle networking. But it can handle routes.
+Blueprints allow developers to compartmentalize their Crow applications, making them a lot more modular.

+ +In order for a blueprint to work, it has to be registered with a Crow app before the app is run. This can be done using `#!cpp app.register_blueprint(blueprint);`.

+ +Blueprints let you do the following:

+ +### Define Routes +You can define routes in a blueprint, similarly to how `#!cpp CROW_ROUTE(app, "/xyz")` works, you can use `#!cpp CROW_BP_ROUTE(blueprint, "/xyz")` to define a blueprint route. + +### Define a Prefix +Blueprints can have a prefix assigned to them. This can be done when creating a new blueprint as in `#!cpp crow::blueprint bp("prefix");`. This prefix will be applied to all routes belonging to the blueprint. truning a route such as `/crow/rocks` into `/prefix/crow/rocks`. + +!!!Warning + + Unlike routes, blueprint prefixes should contain no slashes. + + +### Use a custom Static directory +Blueprints let you define a custom static directory (relative to your working directory). This can be done by initializing a blueprint as `#!cpp crow::blueprint bp("prefix", "custom_static");`. This does not have an effect on `#!cpp set_static_file_info()`, it's only for when you want direct access to a file. + +!!!note + + Currently changing which endpoint the blueprint uses isn't possible, so whatever you've set in `CROW_STATIC_ENDPOINT` (default is "static") will be used. Making your final route `/prefix/static/filename`. + + +### Use a custom Templates directory +Similar to static directories, You can set a custom templates directory (relative to your working directory). To do this you initialize the blueprint as `#!cpp crow::blueprint bp("prefix", "custom_static", "custom_templates");`. Any routes defined for the blueprint will use that directory when calling `#!cpp crow::mustache::load("filename.html")`. + +!!!note + + If you want to define a custom templates directory without defining a custom static directory, you can pass the static directory as an empty string. Making your constructor `#!cpp crow::blueprint bp("prefix", "", "custom_templates");`. + +### Define a custom Catchall route +You can define a custom catchall route for a blueprint by calling `#!cpp CROW_BP_CATCHALL_ROUTE(blueprint)`. This causes any requests with a URL starting with `/prefix` and no route found to call the blueprint's catchall route. if no catchall route is defined, Crow will default to either the parent blueprint or the app's catchall route. + +### Register other Blueprints +Blueprints can also register other blueprints. This is done through `#!cpp blueprint.register_blueprint(blueprint_2);`. The child blueprint's routes become `/prefix/prefix_2/abc/xyz`. diff --git a/examples/example_blueprint.cpp b/examples/example_blueprint.cpp index 4717bed64..af007bd09 100644 --- a/examples/example_blueprint.cpp +++ b/examples/example_blueprint.cpp @@ -15,7 +15,7 @@ int main() return "Hello world!"; }); - CROW_BP_ROUTE(bp, "/templatt") +/* CROW_BP_ROUTE(bp, "/templatt") ([]() { crow::mustache::context ctxdat; ctxdat["messg"] = "fifty five!!"; @@ -24,7 +24,7 @@ int main() return page.render(ctxdat); }); - +*/ CROW_BP_CATCHALL_ROUTE(sub_bp)([](){return "WRONG!!";}); diff --git a/include/crow/app.h b/include/crow/app.h index 0e3fbe3ca..eb8a0bb6f 100644 --- a/include/crow/app.h +++ b/include/crow/app.h @@ -98,26 +98,12 @@ namespace crow return router_.new_rule_tagged(std::move(rule)); } -// ///Create a route for a blueprint using a rule (**Use CROW_BP_ROUTE instead**) -// template -// auto route(Blueprint& blueprint, std::string&& rule) -// -> typename std::result_of)(Router, std::string&&)>::type -// { -// return blueprint.new_rule_tagged(std::move(rule)); -// } - ///Create a route for any requests without a proper route (**Use CROW_CATCHALL_ROUTE instead**) CatchallRule& catchall_route() { return router_.catchall_rule(); } -// ///Create a route for any requests without a proper route within the blueprint (**Use CROW_BP_CATCHALL_ROUTE instead**) -// CatchallRule& catchall_route(Blueprint& blueprint) -// { -// return blueprint.catchall_rule(); -// } - self_t& signal_clear() { signals_.clear(); diff --git a/include/crow/common.h b/include/crow/common.h index f38a3c767..2aa95a388 100644 --- a/include/crow/common.h +++ b/include/crow/common.h @@ -8,7 +8,7 @@ namespace crow { - enum class HTTPMethod + enum class HTTPMethod : char { #ifndef DELETE DELETE = 0, @@ -69,7 +69,7 @@ namespace crow return "invalid"; } - enum class ParamType + enum class ParamType : char { INT, UINT, diff --git a/include/crow/routing.h b/include/crow/routing.h index 590bfdcbe..5ecdce52c 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -1078,14 +1078,14 @@ namespace crow idx->rule_index = rule_index; } - size_t get_size(bool small_enum_flag = false) + size_t get_size() { - return get_size(&head_, small_enum_flag); + return get_size(&head_); } - size_t get_size(Node* node, bool small_enum_flag) + size_t get_size(Node* node) { - unsigned size = small_enum_flag ? 3 : 6; //rule_index and param + unsigned size = 5 ; //rule_index, blueprint_index, and param size += (node->key.size()); //each character in the key is 1 byte for (auto child: node->children) { @@ -1109,6 +1109,9 @@ namespace crow }; /// A blueprint can be considered a smaller section of a Crow app, specifically where the router is conecerned. + /// + /// You can use blueprints to assign a common prefix to rules' prefix, set custom static and template folders, and set a custom catchall route. + /// You can also assign nest blueprints for maximum Compartmentalization. class Blueprint { public: @@ -1206,6 +1209,14 @@ namespace crow throw std::runtime_error("blueprint \"" + blueprint.prefix_ + "\" already exists in blueprint \"" + prefix_ + '\"'); } + + CatchallRule& catchall_rule() + { + return catchall_rule_; + } + + private: + void apply_blueprint(Blueprint& blueprint) { @@ -1224,20 +1235,14 @@ namespace crow } } - CatchallRule& catchall_rule() - { - return catchall_rule_; - } + std::string prefix_; + std::string static_dir_; + std::string templates_dir_; + std::vector> all_rules_; + CatchallRule catchall_rule_; + std::vector blueprints_; - private: - std::string prefix_; - std::string static_dir_; - std::string templates_dir_; - std::vector> all_rules_; - CatchallRule catchall_rule_; - std::vector blueprints_; - - friend class Router; + friend class Router; }; /// Handles matching requests to existing rules and upgrade requests. diff --git a/mkdocs.yml b/mkdocs.yml index d3507a839..adac457e4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,9 +1,9 @@ site_name: Crow # Repository -repo_name: crowcpp/crow -repo_url: https://github.com/crowcpp/crow -site_url: https://crowcpp.github.io/crow +repo_name: CrowCpp/Crow +repo_url: https://github.com/CrowCpp/Crow +site_url: https://crowcpp.org edit_uri: "" theme: @@ -41,6 +41,7 @@ nav: - Middleware: guides/middleware.md - SSL: guides/ssl.md - Static Files: guides/static.md + - Blueprints: guides/blueprints.md - Compression: guides/compression.md - Websockets: guides/websockets.md - Writing Tests: guides/testing.md diff --git a/tests/img/cat.jpg b/tests/img/cat.jpg index 2cd578ec12fcea298874ea40d543bca29b0b3f08..b5fcec3bd4d9da3001eb4b73e0c8aa75d7924f1e 100644 GIT binary patch literal 42294 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 literal 34459 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 From 2def62bd4ac26d96a6e03359d0c71c56b1d64890 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Tue, 3 Aug 2021 12:46:41 +0300 Subject: [PATCH 32/51] removed unnecessary code / added constexpr for max bp id --- include/crow/app.h | 6 ------ include/crow/routing.h | 21 ++++++++++++--------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/include/crow/app.h b/include/crow/app.h index eb8a0bb6f..2491ebc6a 100644 --- a/include/crow/app.h +++ b/include/crow/app.h @@ -84,12 +84,6 @@ namespace crow return router_.new_rule_dynamic(std::move(rule)); } -// ///Create a dynamic route for a blueprint using a rule (**Use CROW_BP_ROUTE instead**) -// DynamicRule& route_dynamic(Blueprint& blueprint, std::string&& rule) -// { -// return blueprint.new_rule_dynamic(std::move(rule)); -// } - ///Create a route using a rule (**Use CROW_ROUTE instead**) template auto route(std::string&& rule) diff --git a/include/crow/routing.h b/include/crow/routing.h index 5ecdce52c..19c332942 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -717,7 +717,7 @@ namespace crow { uint16_t rule_index{}; // Assign the index to the maximum 32 unsigned integer value by default so that any other number (specifically 0) is a valid BP id. - uint16_t blueprint_index{0xFFFF}; + uint16_t blueprint_index{INVALID_BP_ID}; std::string key; ParamType param = ParamType::MAX; // MAX = No param. std::vector children; @@ -726,7 +726,7 @@ namespace crow { return !rule_index && - blueprint_index == 0xFFFF && + blueprint_index == INVALID_BP_ID && children.size() < 2 && param == ParamType::MAX && std::all_of(std::begin(children), std::end(children), [](Node* x){ return x->param == ParamType::MAX; }); @@ -754,6 +754,8 @@ namespace crow private: + + void optimizeNode(Node* node) { if (node->children.empty()) @@ -830,7 +832,6 @@ namespace crow //Rule_index, Blueprint_index, routing_params std::tuple, routing_params> find(const std::string& req_url, const Node* node = nullptr, unsigned pos = 0, routing_params* params = nullptr, std::vector* blueprints = nullptr) const { - static const uint16_t idx_max{0xFFFF}; //start params as an empty struct routing_params empty; if (params == nullptr) @@ -883,7 +884,7 @@ namespace crow { found_fragment = true; params->int_params.push_back(value); - if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + if (child->blueprint_index != INVALID_BP_ID) blueprints->push_back(child->blueprint_index); auto ret = find(req_url, child, eptr - req_url.data(), params, blueprints); update_found(ret); params->int_params.pop_back(); @@ -904,7 +905,7 @@ namespace crow { found_fragment = true; params->uint_params.push_back(value); - if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + if (child->blueprint_index != INVALID_BP_ID) blueprints->push_back(child->blueprint_index); auto ret = find(req_url, child, eptr - req_url.data(), params, blueprints); update_found(ret); params->uint_params.pop_back(); @@ -925,7 +926,7 @@ namespace crow { found_fragment = true; params->double_params.push_back(value); - if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + if (child->blueprint_index != INVALID_BP_ID) blueprints->push_back(child->blueprint_index); auto ret = find(req_url, child, eptr - req_url.data(), params, blueprints); update_found(ret); params->double_params.pop_back(); @@ -947,7 +948,7 @@ namespace crow { found_fragment = true; params->string_params.push_back(req_url.substr(pos, epos-pos)); - if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + if (child->blueprint_index != INVALID_BP_ID) blueprints->push_back(child->blueprint_index); auto ret = find(req_url, child, epos, params, blueprints); update_found(ret); params->string_params.pop_back(); @@ -963,7 +964,7 @@ namespace crow { found_fragment = true; params->string_params.push_back(req_url.substr(pos, epos-pos)); - if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + if (child->blueprint_index != INVALID_BP_ID) blueprints->push_back(child->blueprint_index); auto ret = find(req_url, child, epos, params, blueprints); update_found(ret); params->string_params.pop_back(); @@ -978,7 +979,7 @@ namespace crow if (req_url.compare(pos, fragment.size(), fragment) == 0) { found_fragment = true; - if (child->blueprint_index != idx_max) blueprints->push_back(child->blueprint_index); + if (child->blueprint_index != INVALID_BP_ID) blueprints->push_back(child->blueprint_index); auto ret = find(req_url, child, pos + fragment.size(), params, blueprints); update_found(ret); blueprints->pop_back(); @@ -1105,6 +1106,8 @@ namespace crow return children[children.size()-1]; } + static constexpr uint16_t INVALID_BP_ID{0xFFFF}; + Node head_; }; From 1474fbec336c55542331d528c6ac38d4b5bea466 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Wed, 4 Aug 2021 23:58:38 +0300 Subject: [PATCH 33/51] used constant 0xffff in more places, used .empty(), and split the if statement into a method. --- include/crow/routing.h | 49 ++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/include/crow/routing.h b/include/crow/routing.h index 19c332942..6ea93a7df 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -18,6 +18,12 @@ namespace crow { + +#ifdef CROW_MAIN + constexpr uint16_t INVALID_BP_ID{0xFFFF}; +#else + extern constexpr uint16_t INVALID_BP_ID{0xFFFF}; +#endif /// A base class for all rules. /// Used to provide a common interface for code dealing with different types of rules. @@ -994,11 +1000,11 @@ namespace crow } //This functions assumes any blueprint info passed is valid - void add(const std::string& url, uint16_t rule_index, unsigned bp_prefix_length = 0, uint16_t blueprint_index = 0xFFFF) + void add(const std::string& url, uint16_t rule_index, unsigned bp_prefix_length = 0, uint16_t blueprint_index = INVALID_BP_ID) { Node* idx = &head_; - bool has_blueprint = bp_prefix_length != 0 && blueprint_index != 0xFFFF; + bool has_blueprint = bp_prefix_length != 0 && blueprint_index != INVALID_BP_ID; for(unsigned i = 0; i < url.size(); i ++) { @@ -1106,7 +1112,6 @@ namespace crow return children[children.size()-1]; } - static constexpr uint16_t INVALID_BP_ID{0xFFFF}; Node head_; }; @@ -1294,13 +1299,13 @@ namespace crow ruleObject->foreach_method([&](int method) { per_methods_[method].rules.emplace_back(ruleObject); - per_methods_[method].trie.add(rule, per_methods_[method].rules.size() - 1, BP_index != 0xFFFF ? blueprints[BP_index]->prefix().length() : 0, BP_index); + per_methods_[method].trie.add(rule, per_methods_[method].rules.size() - 1, BP_index != INVALID_BP_ID ? blueprints[BP_index]->prefix().length() : 0, BP_index); // directory case: // request to '/about' url matches '/about/' rule if (has_trailing_slash) { - per_methods_[method].trie.add(rule_without_trailing_slash, RULE_SPECIAL_REDIRECT_SLASH, BP_index != 0xFFFF ? blueprints_[BP_index]->prefix().length() : 0, BP_index); + per_methods_[method].trie.add(rule_without_trailing_slash, RULE_SPECIAL_REDIRECT_SLASH, BP_index != INVALID_BP_ID ? blueprints_[BP_index]->prefix().length() : 0, BP_index); } }); @@ -1308,7 +1313,7 @@ namespace crow void register_blueprint(Blueprint& blueprint) { - if (blueprints_.empty() || std::find(blueprints_.begin(), blueprints_.end(), &blueprint) == blueprints_.end()) + if (std::find(blueprints_.begin(), blueprints_.end(), &blueprint) == blueprints_.end()) { blueprints_.emplace_back(&blueprint); } @@ -1319,14 +1324,14 @@ namespace crow void get_recursive_child_methods(Blueprint* blueprint, std::vector& methods) { //we only need to deal with children if the blueprint has absolutely no methods (meaning its index won't be added to the trie) - if (blueprint->static_dir_ == "" && blueprint->all_rules_.empty()) + if (blueprint->static_dir_.empty() && blueprint->all_rules_.empty()) { for(Blueprint* bp : blueprint->blueprints_) { get_recursive_child_methods(bp, methods); } } - else if (blueprint->static_dir_ != "") + else if (!blueprint->static_dir_.empty()) methods.emplace_back(HTTPMethod::GET); for (auto& rule: blueprint->all_rules_) { @@ -1381,7 +1386,7 @@ namespace crow if (upgraded) rule = std::move(upgraded); rule->validate(); - internal_add_rule_object(rule->rule(), rule.get(), 0xFFFF, blueprints_); + internal_add_rule_object(rule->rule(), rule.get(), INVALID_BP_ID, blueprints_); } } for(auto& per_method:per_methods_) @@ -1466,17 +1471,25 @@ namespace crow void get_found_bp(std::vector& bp_i, std::vector& blueprints, std::vector& found_bps, uint16_t index = 0) { + // This statement makes 3 assertions: + // 1. The index is above 0. + // 2. The index does not lie outside the given blueprint list. + // 3. The next blueprint we're adding has a prefix that starts the same as the already added blueprint + a slash (the rest is irrelevant). + // + // This is done to prevent a blueprint that has a prefix of "bp_prefix2" to be assumed as a child of one that has "bp_prefix". + // + // If any of the assertions is untrue, we delete the last item added, and continue using the blueprint list of the blueprint found before, the topmost being the router's list + auto verify_prefix = [&bp_i, &index, &blueprints, &found_bps]() + { + return index > 0 && + bp_i[index] < blueprints.size() && + blueprints[bp_i[index]]->prefix().substr(0,found_bps[index-1]->prefix().length()+1) + .compare(std::string(found_bps[index-1]->prefix()+'/')) == 0; + }; if (index < bp_i.size()) { - // This statement makes 3 assertions: - // 1. The index is above 0. - // 2. The index does not lie outside the given blueprint list. - // 3. The next blueprint we're adding has a prefix that starts the same as the already added blueprint + a slash (the rest is irrelevant). - // - // This is done to prevent a blueprint that has a prefix of "bp_prefix2" to be assumed as a child of one that has "bp_prefix". - // - // If any of the assertions is untrue, we delete the last item added, and continue using the blueprint list of the blueprint found before, the topmost being the router's list - if (index > 0 && bp_i[index] < blueprints.size() && blueprints[bp_i[index]]->prefix().substr(0,found_bps[index-1]->prefix().length()+1).compare(std::string(found_bps[index-1]->prefix()+'/')) == 0) + + if (verify_prefix()) { found_bps.push_back(blueprints[bp_i[index]]); get_found_bp(bp_i, found_bps.back()->blueprints_, found_bps, ++index); From 9418c39a9232cba23cad8256831b115d89fe34d5 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Thu, 5 Aug 2021 17:01:03 +0300 Subject: [PATCH 34/51] fixed problem where using multiple files caused an error because you can't have extern constexpr --- include/crow/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/crow/version.h b/include/crow/version.h index 5e1394f47..60d39ed6f 100644 --- a/include/crow/version.h +++ b/include/crow/version.h @@ -3,8 +3,8 @@ namespace crow { #ifdef CROW_MAIN - constexpr char VERSION[] = "master"; + char VERSION[] = "master"; #else - extern constexpr char VERSION[]; + extern char VERSION[]; #endif } From 0588471d6d27e4c35dbd17c9d685ddffcd20df76 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Thu, 5 Aug 2021 19:53:52 +0300 Subject: [PATCH 35/51] fixed extern constexpr problem --- include/crow/routing.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/crow/routing.h b/include/crow/routing.h index 6ea93a7df..64e1de09a 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -20,9 +20,9 @@ namespace crow { #ifdef CROW_MAIN - constexpr uint16_t INVALID_BP_ID{0xFFFF}; + uint16_t INVALID_BP_ID{0xFFFF}; #else - extern constexpr uint16_t INVALID_BP_ID{0xFFFF}; + extern uint16_t INVALID_BP_ID{0xFFFF}; #endif /// A base class for all rules. From d5c1b54918a4e9b2edf445e5a45fd132ed0c1df4 Mon Sep 17 00:00:00 2001 From: Mustafa Mahmoud <43878201+d35ha@users.noreply.github.com> Date: Fri, 6 Aug 2021 19:01:13 +0200 Subject: [PATCH 36/51] Replace `HTTPMethod::GET` with `HTTPMethod::Get` --- include/crow/routing.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/crow/routing.h b/include/crow/routing.h index 64e1de09a..38a5aa594 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -1332,7 +1332,7 @@ namespace crow } } else if (!blueprint->static_dir_.empty()) - methods.emplace_back(HTTPMethod::GET); + methods.emplace_back(HTTPMethod::Get); for (auto& rule: blueprint->all_rules_) { rule->foreach_method([&methods](unsigned method){ From e6b36c3c03d0e10c4519cff39bfe92e9b257442b Mon Sep 17 00:00:00 2001 From: Dan Kersten Date: Fri, 6 Aug 2021 22:28:13 +0100 Subject: [PATCH 37/51] Eliminate extern-initializer warning --- include/crow/routing.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/crow/routing.h b/include/crow/routing.h index 64e1de09a..ab3a9f6f9 100644 --- a/include/crow/routing.h +++ b/include/crow/routing.h @@ -22,7 +22,7 @@ namespace crow #ifdef CROW_MAIN uint16_t INVALID_BP_ID{0xFFFF}; #else - extern uint16_t INVALID_BP_ID{0xFFFF}; + extern uint16_t INVALID_BP_ID; #endif /// A base class for all rules. From 762af683068c7b54773c0adc0acd0b3a4bae1059 Mon Sep 17 00:00:00 2001 From: Lucas David Date: Fri, 6 Aug 2021 18:37:18 +0200 Subject: [PATCH 38/51] + Added object constructor and assignment for json::wvalue and unit tests. + json::wvalue::wvalue(std::initializer_list> + json::wvalue::wvalue(std::[unordered_]map const&) + json::wvalue::wvalue(std::[unordered_]map&&) + json::wvalue::operator=(std::initializer_list>) + json::wvalue::operator=(std::[unordered_]map const&) + json::wvalue::operator=(std::[unordered_]map&&) --- include/crow/json.h | 48 ++++++++++++++ tests/unittest.cpp | 155 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+) diff --git a/include/crow/json.h b/include/crow/json.h index d53dee275..6941def3b 100644 --- a/include/crow/json.h +++ b/include/crow/json.h @@ -1224,6 +1224,15 @@ namespace crow class wvalue : public returnable { friend class crow::mustache::template_t; + + public: + using object_type = +#ifdef CROW_JSON_USE_MAP + std::map; +#else + std::unordered_map; +#endif + public: type t() const { return t_; } private: @@ -1246,6 +1255,12 @@ namespace crow wvalue() : returnable("application/json") {} + wvalue(std::initializer_list> initializer_list) : returnable("application/json"), t_(type::Object), o(new object_type(initializer_list)) {} + + wvalue(object_type const& value) : returnable("application/json"), t_(type::Object), o(new object_type(value)) {} + + wvalue(object_type&& value) : returnable("application/json"), t_(type::Object), o(new object_type(std::move(value))) {} + wvalue(std::vector& r) : returnable("application/json") { t_ = type::List; @@ -1508,6 +1523,39 @@ namespace crow return *this; } + wvalue& operator=(std::initializer_list> initializer_list) + { + if (t_ != type::Object) { + reset(); + t_ = type::Object; + o = std::unique_ptr(new object_type(initializer_list)); + } else + (*o) = initializer_list; + return *this; + } + + wvalue& operator=(object_type const& value) + { + if (t_ != type::Object) { + reset(); + t_ = type::Object; + o = std::unique_ptr(new object_type(value)); + } else + (*o) = value; + return *this; + } + + wvalue& operator=(object_type&& value) + { + if (t_ != type::Object) { + reset(); + t_ = type::Object; + o = std::unique_ptr(new object_type(std::move(value))); + } else + (*o) = value; + return *this; + } + wvalue& operator[](unsigned index) { if (t_ != type::List) diff --git a/tests/unittest.cpp b/tests/unittest.cpp index 22d2e038d..cb3f60925 100644 --- a/tests/unittest.cpp +++ b/tests/unittest.cpp @@ -746,6 +746,161 @@ TEST_CASE("json_copy_r_to_w_to_w_to_r") CHECK("other" == x["obj"]["other"].key()); } +TEST_CASE("json::wvalue::wvalue(std::initializer_list>)") { + json::wvalue integer, number, truth, lie, null; + integer = 2147483647; + number = 23.43; + truth = true; + lie = false; + + /* initializer-list constructor. */ + json::wvalue value({ + {"integer", integer}, + {"number", number}, + {"truth", truth}, + {"lie", lie}, + {"null", null} + }); + /* initializer-list constructor. *//* + json::wvalue value = {{ + {"integer", integer}, + {"number", number}, + {"truth", truth}, + {"lie", lie}, + {"null", null} + }}; */ + + CHECK(value["integer"].dump() == integer.dump()); + CHECK(value["number"].dump() == number.dump()); + CHECK(value["truth"].dump() == truth.dump()); + CHECK(value["lie"].dump() == lie.dump()); + CHECK(value["null"].dump() == null.dump()); +} + +TEST_CASE("json::wvalue::wvalue(std::[unordered_]map const&)") { + json::wvalue integer, number, truth, lie, null; + integer = 2147483647; + number = 23.43; + truth = true; + lie = false; + + json::wvalue::object_type map({ + {"integer", integer}, + {"number", number}, + {"truth", truth}, + {"lie", lie}, + {"null", null} + }); + + json::wvalue value(map); /* copy-constructor. */ + //json::wvalue value = map; /* copy-constructor. */ + + CHECK(value["integer"].dump() == integer.dump()); + CHECK(value["number"].dump() == number.dump()); + CHECK(value["truth"].dump() == truth.dump()); + CHECK(value["lie"].dump() == lie.dump()); + CHECK(value["null"].dump() == null.dump()); +} + +TEST_CASE("json::wvalue::wvalue(std::[unordered_]map&&)") { + json::wvalue integer, number, truth, lie, null; + integer = 2147483647; + number = 23.43; + truth = true; + lie = false; + + json::wvalue::object_type map = {{ + {"integer", integer}, + {"number", number}, + {"truth", truth}, + {"lie", lie}, + {"null", null} + }}; + + json::wvalue value(std::move(map)); /* move constructor. */ + // json::wvalue value = std::move(map); /* move constructor. */ + + CHECK(value["integer"].dump() == integer.dump()); + CHECK(value["number"].dump() == number.dump()); + CHECK(value["truth"].dump() == truth.dump()); + CHECK(value["lie"].dump() == lie.dump()); + CHECK(value["null"].dump() == null.dump()); +} + +TEST_CASE("json::wvalue::operator=(std::initializer_list>)") { + json::wvalue integer, number, truth, lie, null; + integer = 2147483647; + number = 23.43; + truth = true; + lie = false; + + json::wvalue value; + /* initializer-list assignment. */ + value = { + {"integer", integer}, + {"number", number}, + {"truth", truth}, + {"lie", lie}, + {"null", null} + }; + + CHECK(value["integer"].dump() == integer.dump()); + CHECK(value["number"].dump() == number.dump()); + CHECK(value["truth"].dump() == truth.dump()); + CHECK(value["lie"].dump() == lie.dump()); + CHECK(value["null"].dump() == null.dump()); +} + +TEST_CASE("json::wvalue::operator=(std::[unordered_]map const&)") { + json::wvalue integer, number, truth, lie, null; + integer = 2147483647; + number = 23.43; + truth = true; + lie = false; + + json::wvalue::object_type map({ + {"integer", integer}, + {"number", number}, + {"truth", truth}, + {"lie", lie}, + {"null", null} + }); + + json::wvalue value; + value = map; /* copy assignment. */ + + CHECK(value["integer"].dump() == integer.dump()); + CHECK(value["number"].dump() == number.dump()); + CHECK(value["truth"].dump() == truth.dump()); + CHECK(value["lie"].dump() == lie.dump()); + CHECK(value["null"].dump() == null.dump()); +} + +TEST_CASE("json::wvalue::operator=(std::[unordered_]map&&)") { + json::wvalue integer, number, truth, lie, null; + integer = 2147483647; + number = 23.43; + truth = true; + lie = false; + + json::wvalue::object_type map({ + {"integer", integer}, + {"number", number}, + {"truth", truth}, + {"lie", lie}, + {"null", null} + }); + + json::wvalue value; + value = std::move(map); /* move assignment. */ + + CHECK(value["integer"].dump() == integer.dump()); + CHECK(value["number"].dump() == number.dump()); + CHECK(value["truth"].dump() == truth.dump()); + CHECK(value["lie"].dump() == lie.dump()); + CHECK(value["null"].dump() == null.dump()); +} + TEST_CASE("json_vector") {//TODO probably make constructors for the same values as = operator json::wvalue a; From 235f2b9ef4bb14f7aef793b8bd068c10c1ed8393 Mon Sep 17 00:00:00 2001 From: Lucas David Date: Mon, 9 Aug 2021 14:31:28 +0200 Subject: [PATCH 39/51] =?UTF-8?q?+=20Added=20(implicit)=20constructors=20f?= =?UTF-8?q?or=20json=20"supported"=20types.=20=C2=A0=20+=20added=20corresp?= =?UTF-8?q?onding=20tests.=20+=20Added=20json-map=20examples.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/example_json_map.cpp | 37 +++++++++++- include/crow/json.h | 44 ++++++++++++-- tests/unittest.cpp | 109 ++++++++++++++++++++++++++++++++++ 3 files changed, 184 insertions(+), 6 deletions(-) diff --git a/examples/example_json_map.cpp b/examples/example_json_map.cpp index 4ce1884c3..3eb737d55 100644 --- a/examples/example_json_map.cpp +++ b/examples/example_json_map.cpp @@ -2,8 +2,6 @@ #define CROW_JSON_USE_MAP #include "crow.h" - - int main() { crow::SimpleApp app; @@ -19,6 +17,41 @@ CROW_ROUTE(app, "/json") return x; }); +CROW_ROUTE(app, "/json-initializer-list-constructor") +([] { + return crow::json::wvalue({ + {"first", "Hello world!"}, /* stores a char const* hence a type::String */ + {"second", "How are you today?"}, /* stores a char const* hence a std::int64_t. */ + {"third", 54}, /* stores an int (as 54 is an int literal) hence a std::int64_t. */ + {"fourth", 54l}, /* stores a long (as 54l is a long literal) hence a std::int64_t. */ + {"fifth", 54u}, /* stores an unsigned int (as 54u is a unsigned int literal) hence a std::uint64_t. */ + {"sixth", 54ul}, /* stores an unsigned long (as 54ul is an unsigned long literal) hence a std::uint64_t. */ + {"seventh", 2.f}, /* stores a float (as 2.f is a float literal) hence a double. */ + {"eighth", 2.}, /* stores a double (as 2. is a double literal) hence a double. */ + {"ninth", nullptr}, /* stores a std::nullptr hence type::Null . */ + {"tenth", true} /* stores a bool hence type::True . */ + }); +}); + +CROW_ROUTE(app, "/json-map-constructor") +([] { + crow::json::wvalue::object_type map({ + {"first", "Hello world!"}, /* stores a char const* hence a type::String */ + {"second", "How are you today?"}, /* stores a char const* hence a std::int64_t. */ + {"third", 54}, /* stores an int (as 54 is an int literal) hence a std::int64_t. */ + {"fourth", 54l}, /* stores a long (as 54l is a long literal) hence a std::int64_t. */ + {"fifth", 54u}, /* stores an unsigned int (as 54u is a unsigned int literal) hence a std::uint64_t. */ + {"sixth", 54ul}, /* stores an unsigned long (as 54ul is an unsigned long literal) hence a std::uint64_t. */ + {"seventh", 2.f}, /* stores a float (as 2.f is a float literal) hence a double. */ + {"eighth", 2.}, /* stores a double (as 2. is a double literal) hence a double. */ + {"ninth", nullptr}, /* stores a std::nullptr hence type::Null . */ + {"tenth", true} /* stores a bool hence type::True . */ + }); + + return crow::json::wvalue(map); +}); + + // enables all log app.loglevel(crow::LogLevel::Debug); diff --git a/include/crow/json.h b/include/crow/json.h index 6941def3b..c1b20f357 100644 --- a/include/crow/json.h +++ b/include/crow/json.h @@ -1238,10 +1238,26 @@ namespace crow private: type t_{type::Null}; ///< The type of the value. num_type nt{num_type::Null}; ///< The specific type of the number if \ref t_ is a number. - union { + union number { double d; int64_t si; - uint64_t ui {}; + uint64_t ui; + + public: + constexpr number() noexcept : ui() {} /* default constructor initializes unsigned integer. */ + + constexpr number(std::uint8_t value) noexcept : ui(static_cast(value)) {} + constexpr number(std::uint16_t value) noexcept : ui(static_cast(value)) {} + constexpr number(std::uint32_t value) noexcept : ui(static_cast(value)) {} + constexpr number(std::uint64_t value) noexcept : ui(value) {} + + constexpr number(std::int8_t value) noexcept : si(static_cast(value)) {} + constexpr number(std::int16_t value) noexcept : si(static_cast(value)) {} + constexpr number(std::int32_t value) noexcept : si(static_cast(value)) {} + constexpr number(std::int64_t value) noexcept : si(value) {} + + constexpr number(float value) noexcept : d(static_cast(value)) {} + constexpr number(double value) noexcept : d(value) {} } num; ///< Value if type is a number. std::string s; ///< Value if type is a string. std::unique_ptr> l; ///< Value if type is a list. @@ -1252,13 +1268,33 @@ namespace crow #endif public: - wvalue() : returnable("application/json") {} + wvalue(std::nullptr_t) : returnable("application/json"), t_(type::Null) {} + + wvalue(bool value) : returnable("application/json"), t_(value ? type::True : type::False) {} + + wvalue(std::uint8_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(value) {} + wvalue(std::uint16_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(value) {} + wvalue(std::uint32_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(value) {} + wvalue(std::uint64_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(value) {} + + wvalue(std::int8_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(value) {} + wvalue(std::int16_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(value) {} + wvalue(std::int32_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(value) {} + wvalue(std::int64_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(value) {} + + wvalue(float value) : returnable("application/json"), t_(type::Number), nt(num_type::Floating_point), num(value) {} + wvalue(double value) : returnable("application/json"), t_(type::Number), nt(num_type::Floating_point), num(value) {} + + wvalue(char const* value) : returnable("application/json"), t_(type::String), s(value) {} + + wvalue(std::string const& value) : returnable("application/json"), t_(type::String), s(value) {} + wvalue(std::string&& value) : returnable("application/json"), t_(type::String), s(std::move(value)) {} + wvalue(std::initializer_list> initializer_list) : returnable("application/json"), t_(type::Object), o(new object_type(initializer_list)) {} wvalue(object_type const& value) : returnable("application/json"), t_(type::Object), o(new object_type(value)) {} - wvalue(object_type&& value) : returnable("application/json"), t_(type::Object), o(new object_type(std::move(value))) {} wvalue(std::vector& r) : returnable("application/json") diff --git a/tests/unittest.cpp b/tests/unittest.cpp index cb3f60925..44f92634a 100644 --- a/tests/unittest.cpp +++ b/tests/unittest.cpp @@ -746,6 +746,115 @@ TEST_CASE("json_copy_r_to_w_to_w_to_r") CHECK("other" == x["obj"]["other"].key()); } +TEST_CASE("json::wvalue::wvalue(bool)") { + CHECK(json::wvalue(true).t() == json::type::True); + CHECK(json::wvalue(false).t() == json::type::False); +} + +TEST_CASE("json::wvalue::wvalue(std::uint8_t)") { + std::uint8_t i = 42; + json::wvalue value = i; + + CHECK(value.t() == json::type::Number); + CHECK(value.dump() == "42"); +} + +TEST_CASE("json::wvalue::wvalue(std::uint16_t)") { + std::uint16_t i = 42; + json::wvalue value = i; + + CHECK(value.t() == json::type::Number); + CHECK(value.dump() == "42"); +} + +TEST_CASE("json::wvalue::wvalue(std::uint32_t)") { + std::uint32_t i = 42; + json::wvalue value = i; + + CHECK(value.t() == json::type::Number); + CHECK(value.dump() == "42"); +} + +TEST_CASE("json::wvalue::wvalue(std::uint64_t)") { + std::uint64_t i = 42; + json::wvalue value = i; + + CHECK(value.t() == json::type::Number); + CHECK(value.dump() == "42"); +} + +TEST_CASE("json::wvalue::wvalue(std::int8_t)") { + std::int8_t i = -42; + json::wvalue value = i; + + CHECK(value.t() == json::type::Number); + CHECK(value.dump() == "-42"); +} + +TEST_CASE("json::wvalue::wvalue(std::int16_t)") { + std::int16_t i = -42; + json::wvalue value = i; + + CHECK(value.t() == json::type::Number); + CHECK(value.dump() == "-42"); +} + +TEST_CASE("json::wvalue::wvalue(std::int32_t)") { + std::int32_t i = -42; + json::wvalue value = i; + + CHECK(value.t() == json::type::Number); + CHECK(value.dump() == "-42"); +} + +TEST_CASE("json::wvalue::wvalue(std::int64_t)") { + std::int64_t i = -42; + json::wvalue value = i; + + CHECK(value.t() == json::type::Number); + CHECK(value.dump() == "-42"); +} + +TEST_CASE("json::wvalue::wvalue(float)") { + float f = 4.2; + json::wvalue value = f; + + CHECK(value.t() == json::type::Number); + CHECK(value.dump() == "4.2"); +} + +TEST_CASE("json::wvalue::wvalue(double)") { + double d = 4.2; + json::wvalue value = d; + + CHECK(value.t() == json::type::Number); + CHECK(value.dump() == "4.2"); +} + +TEST_CASE("json::wvalue::wvalue(char const*)") { + char const* str = "Hello world!"; + json::wvalue value = str; + + CHECK(value.t() == json::type::String); + CHECK(value.dump() == "\"Hello world!\""); +} + +TEST_CASE("json::wvalue::wvalue(std::string const&)") { + std::string str = "Hello world!"; + json::wvalue value = str; + + CHECK(value.t() == json::type::String); + CHECK(value.dump() == "\"Hello world!\""); +} + +TEST_CASE("json::wvalue::wvalue(std::string&&)") { + std::string str = "Hello world!"; + json::wvalue value = std::move(str); + + CHECK(value.t() == json::type::String); + CHECK(value.dump() == "\"Hello world!\""); +} + TEST_CASE("json::wvalue::wvalue(std::initializer_list>)") { json::wvalue integer, number, truth, lie, null; integer = 2147483647; From df41cbec497287f806b93433fd5462da7441b4ec Mon Sep 17 00:00:00 2001 From: Lucas David Date: Wed, 11 Aug 2021 15:43:40 +0200 Subject: [PATCH 40/51] ~ Replaced foreach character type `unsigned char` by `auto` to resolve issue #195. --- include/crow/json.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/crow/json.h b/include/crow/json.h index d53dee275..d5699ebe5 100644 --- a/include/crow/json.h +++ b/include/crow/json.h @@ -41,7 +41,7 @@ namespace crow inline void escape(const std::string& str, std::string& ret) { ret.reserve(ret.size() + str.size()+str.size()/4); - for(unsigned char c:str) + for(auto c:str) { switch(c) { From 1e52b0182d2151dad04f2d16bff52187b0cf7d8c Mon Sep 17 00:00:00 2001 From: Lucas David Date: Wed, 11 Aug 2021 22:25:58 +0200 Subject: [PATCH 41/51] ~ Corrected code as mentionned in review comments. --- examples/example_json_map.cpp | 8 +++---- include/crow/json.h | 41 +++++++++++++++-------------------- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/examples/example_json_map.cpp b/examples/example_json_map.cpp index 3eb737d55..8bf5257f2 100644 --- a/examples/example_json_map.cpp +++ b/examples/example_json_map.cpp @@ -20,16 +20,16 @@ CROW_ROUTE(app, "/json") CROW_ROUTE(app, "/json-initializer-list-constructor") ([] { return crow::json::wvalue({ - {"first", "Hello world!"}, /* stores a char const* hence a type::String */ - {"second", "How are you today?"}, /* stores a char const* hence a std::int64_t. */ + {"first", "Hello world!"}, /* stores a char const* hence a json::type::String */ + {"second", std::string("How are you today?")}, /* stores a std::string hence a json::type::String. */ {"third", 54}, /* stores an int (as 54 is an int literal) hence a std::int64_t. */ {"fourth", 54l}, /* stores a long (as 54l is a long literal) hence a std::int64_t. */ {"fifth", 54u}, /* stores an unsigned int (as 54u is a unsigned int literal) hence a std::uint64_t. */ {"sixth", 54ul}, /* stores an unsigned long (as 54ul is an unsigned long literal) hence a std::uint64_t. */ {"seventh", 2.f}, /* stores a float (as 2.f is a float literal) hence a double. */ {"eighth", 2.}, /* stores a double (as 2. is a double literal) hence a double. */ - {"ninth", nullptr}, /* stores a std::nullptr hence type::Null . */ - {"tenth", true} /* stores a bool hence type::True . */ + {"ninth", nullptr}, /* stores a std::nullptr hence json::type::Null . */ + {"tenth", true} /* stores a bool hence json::type::True . */ }); }); diff --git a/include/crow/json.h b/include/crow/json.h index 34434fc4c..04a6209ae 100644 --- a/include/crow/json.h +++ b/include/crow/json.h @@ -1245,18 +1245,8 @@ namespace crow public: constexpr number() noexcept : ui() {} /* default constructor initializes unsigned integer. */ - - constexpr number(std::uint8_t value) noexcept : ui(static_cast(value)) {} - constexpr number(std::uint16_t value) noexcept : ui(static_cast(value)) {} - constexpr number(std::uint32_t value) noexcept : ui(static_cast(value)) {} constexpr number(std::uint64_t value) noexcept : ui(value) {} - - constexpr number(std::int8_t value) noexcept : si(static_cast(value)) {} - constexpr number(std::int16_t value) noexcept : si(static_cast(value)) {} - constexpr number(std::int32_t value) noexcept : si(static_cast(value)) {} constexpr number(std::int64_t value) noexcept : si(value) {} - - constexpr number(float value) noexcept : d(static_cast(value)) {} constexpr number(double value) noexcept : d(value) {} } num; ///< Value if type is a number. std::string s; ///< Value if type is a string. @@ -1274,18 +1264,18 @@ namespace crow wvalue(bool value) : returnable("application/json"), t_(value ? type::True : type::False) {} - wvalue(std::uint8_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(value) {} - wvalue(std::uint16_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(value) {} - wvalue(std::uint32_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(value) {} - wvalue(std::uint64_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(value) {} + wvalue(std::uint8_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(static_cast(value)) {} + wvalue(std::uint16_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(static_cast(value)) {} + wvalue(std::uint32_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(static_cast(value)) {} + wvalue(std::uint64_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Unsigned_integer), num(static_cast(value)) {} - wvalue(std::int8_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(value) {} - wvalue(std::int16_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(value) {} - wvalue(std::int32_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(value) {} - wvalue(std::int64_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(value) {} + wvalue(std::int8_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(static_cast(value)) {} + wvalue(std::int16_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(static_cast(value)) {} + wvalue(std::int32_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(static_cast(value)) {} + wvalue(std::int64_t value) : returnable("application/json"), t_(type::Number), nt(num_type::Signed_integer), num(static_cast(value)) {} - wvalue(float value) : returnable("application/json"), t_(type::Number), nt(num_type::Floating_point), num(value) {} - wvalue(double value) : returnable("application/json"), t_(type::Number), nt(num_type::Floating_point), num(value) {} + wvalue(float value) : returnable("application/json"), t_(type::Number), nt(num_type::Floating_point), num(static_cast(value)) {} + wvalue(double value) : returnable("application/json"), t_(type::Number), nt(num_type::Floating_point), num(static_cast(value)) {} wvalue(char const* value) : returnable("application/json"), t_(type::String), s(value) {} @@ -1565,8 +1555,9 @@ namespace crow reset(); t_ = type::Object; o = std::unique_ptr(new object_type(initializer_list)); - } else + } else { (*o) = initializer_list; + } return *this; } @@ -1576,8 +1567,9 @@ namespace crow reset(); t_ = type::Object; o = std::unique_ptr(new object_type(value)); - } else + } else { (*o) = value; + } return *this; } @@ -1587,8 +1579,9 @@ namespace crow reset(); t_ = type::Object; o = std::unique_ptr(new object_type(std::move(value))); - } else - (*o) = value; + } else { + (*o) = std::move(value); + } return *this; } From 6ae3025bd672a6860b048fcae1b7cde575504b92 Mon Sep 17 00:00:00 2001 From: Lucas David Date: Thu, 12 Aug 2021 09:31:27 +0200 Subject: [PATCH 42/51] - Removed useless comments. --- tests/unittest.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/unittest.cpp b/tests/unittest.cpp index 44f92634a..ebb15c854 100644 --- a/tests/unittest.cpp +++ b/tests/unittest.cpp @@ -870,14 +870,6 @@ TEST_CASE("json::wvalue::wvalue(std::initializer_list }); json::wvalue value(map); /* copy-constructor. */ - //json::wvalue value = map; /* copy-constructor. */ CHECK(value["integer"].dump() == integer.dump()); CHECK(value["number"].dump() == number.dump()); From 8617aaf6a9fe05e35338ac4c7e1fd0b078c98e61 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Fri, 13 Aug 2021 03:49:34 +0300 Subject: [PATCH 43/51] Made several changes to docs - Added landing page - Changed theme completely - Added donate button - Added social media picture and description (OpenGraph) - Added version tag to any feature introduced after v0.1 --- LICENSE | 2 +- docs/assets/crowlogo_main_color.svg | 90 +++++++++ docs/assets/fast_icon.svg | 105 ++++++++++ docs/assets/header_icon.svg | 74 +++++++ docs/assets/og_img.png | Bin 0 -> 72385 bytes docs/assets/pkg_logos/arch.png | Bin 0 -> 31559 bytes docs/assets/pkg_logos/conan.png | Bin 0 -> 18890 bytes docs/assets/pkg_logos/github.png | Bin 0 -> 23802 bytes docs/assets/pkg_logos/ubuntu.png | Bin 0 -> 221513 bytes docs/assets/pkg_logos/vcpkg.png | Bin 0 -> 19736 bytes docs/assets/typesafe_icon.svg | 67 +++++++ docs/assets/websocket_icon.svg | 48 +++++ docs/guides/compression.md | 1 + docs/guides/multipart.md | 1 + docs/guides/query-string.md | 3 + docs/guides/routes.md | 2 + docs/guides/static.md | 1 + docs/index.md | 108 +--------- docs/overrides/home.html | 300 ++++++++++++++++++++++++++++ docs/overrides/main.html | 9 + docs/overrides/partials/header.html | 150 ++++++++++++++ docs/stylesheets/colors.css | 31 ++- docs/stylesheets/extra.css | 8 + 23 files changed, 891 insertions(+), 109 deletions(-) create mode 100644 docs/assets/crowlogo_main_color.svg create mode 100644 docs/assets/fast_icon.svg create mode 100644 docs/assets/header_icon.svg create mode 100644 docs/assets/og_img.png create mode 100644 docs/assets/pkg_logos/arch.png create mode 100644 docs/assets/pkg_logos/conan.png create mode 100644 docs/assets/pkg_logos/github.png create mode 100644 docs/assets/pkg_logos/ubuntu.png create mode 100644 docs/assets/pkg_logos/vcpkg.png create mode 100644 docs/assets/typesafe_icon.svg create mode 100644 docs/assets/websocket_icon.svg create mode 100644 docs/overrides/home.html create mode 100644 docs/overrides/main.html create mode 100644 docs/overrides/partials/header.html create mode 100644 docs/stylesheets/extra.css diff --git a/LICENSE b/LICENSE index 046b8fc1b..9b0cb0f68 100644 --- a/LICENSE +++ b/LICENSE @@ -27,4 +27,4 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -The Crow logo used is under Copyright (c) 2021, Farook Al-Sammarraie (The-EDev), All rights reserved. +The Crow logo and other graphic material (excluding third party logos) used are under Copyright (c) 2021, Farook Al-Sammarraie (The-EDev), All rights reserved. diff --git a/docs/assets/crowlogo_main_color.svg b/docs/assets/crowlogo_main_color.svg new file mode 100644 index 000000000..5929a8b91 --- /dev/null +++ b/docs/assets/crowlogo_main_color.svg @@ -0,0 +1,90 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/docs/assets/fast_icon.svg b/docs/assets/fast_icon.svg new file mode 100644 index 000000000..3c87ba259 --- /dev/null +++ b/docs/assets/fast_icon.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/header_icon.svg b/docs/assets/header_icon.svg new file mode 100644 index 000000000..0da85be15 --- /dev/null +++ b/docs/assets/header_icon.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + .h + + diff --git a/docs/assets/og_img.png b/docs/assets/og_img.png new file mode 100644 index 0000000000000000000000000000000000000000..36574ddad253572d1d670838f64c8cede9aef43d GIT binary patch literal 72385 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∋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 JS?83{1OSsRLe~HQ literal 0 HcmV?d00001 diff --git a/docs/assets/pkg_logos/arch.png b/docs/assets/pkg_logos/arch.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd851d44dd6a6a3984959602b437310290119ac GIT binary patch literal 31559 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 literal 0 HcmV?d00001 diff --git a/docs/assets/pkg_logos/conan.png b/docs/assets/pkg_logos/conan.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ec063e14264869ac2cf0fad7859618602980f1 GIT binary patch literal 18890 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

muS=-Nn_91*LU>KR``IQ#zH&x_zJ`sY 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 literal 0 HcmV?d00001 diff --git a/docs/assets/pkg_logos/github.png b/docs/assets/pkg_logos/github.png new file mode 100644 index 0000000000000000000000000000000000000000..402191e09edaf5619244f4cbbe449d69c949dbf5 GIT binary patch literal 23802 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 literal 0 HcmV?d00001 diff --git a/docs/assets/pkg_logos/ubuntu.png b/docs/assets/pkg_logos/ubuntu.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef25b7c0ff7f2293725aa6137be8d3a1b7ae50d GIT binary patch literal 221513 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 DMr6cX literal 0 HcmV?d00001 diff --git a/docs/assets/pkg_logos/vcpkg.png b/docs/assets/pkg_logos/vcpkg.png new file mode 100644 index 0000000000000000000000000000000000000000..899ab89ffdfd59c02f0ca6c6374d5c0ba28bff60 GIT binary patch literal 19736 zcmeIZWmH~GlQs&0purP@ySux)ySux)-8jMBAxLm{*I>bdTW}8!!5z*f&pR{ktn>Yu zwa)kJ3@jGhdv{;mb#--hRdo@rASaFhhXn@)28JLhA)*8Z1|IkJ0|Ny-@$Y8)2?q9I z*-J&kMaj^ez`@Dh%+kh`z{S(Sl)%)((hLmDW9cMayXlA{M&y+<0`Hw<93%%0-@+m0 z)gN!+Ci!*qxv`OlBQ81VwmOk`0Rp1j4|{$uk6&K5@)2?{ym17s8OyB6uno~}oe3lcUo3M?Jy{N=F zx;*fq@m~`iao2IY&@3&M(XykmERMJ1n(!?g_$bY%xwzLMk(9$cwQ`w&F{E}b-=oYqqPQ$rI51o;*hB=1Y-JJL<*h@y8iZp@uyi}sduE{|BgiV~HvC@RgE z#+ART4Zx>``XZLBWmQ>e)wpzIF)dYI$!aU-D=ZqRW?N>phmqC*UTbLT&3B} zOexYt+lQE7lZ(#iw8;rU#pBNC-bGYaW+`)t^@-+DA5s#XIuEGbUsGGpF3_d!wLM33 ze!iDq?Iw2aQNGRm`TVt6-^8|kse)p2I4<=YG%MWh-~jRRkTWw2=7q7vpPb{q9KE}o zfR`LZ7VBkN{bZKNMkC_I=`=Z8>L#}d#*J2CHZc8i^r>JJELSrr3~46rg(!Iaohhog z)V3nrv=+<_U0bCEt}P00{o*AMn3Gj8ZI`wOOtRXjDbHBY76n{p&bQfxqOL=x{0Qr0 zUDpqX{U(Jd4!Mr$dRYg@-pfPOYqU`c2t^#iO))VMDu!_#+-1!3sEdCVx_DQG1GHgN z2FpHqQPD)zj&LeWpyhzaCy)5q!MrZ=Jv~8O)gv9|$d5*=wz;RZ&*4o}g_o&wN;5&e zH>M#nF;2xQyNp2g@5S20rx{*dKBz19jl^+QBgB#{;so!mORwNVimjdB{P2nIUaQNu zLq)#5%KKXn=r&|!_!(mmi@Be9Lao29zTi)X)RsK0bquChrtVDd@aeCboM5&=?KMeS zk5e^XhR{dJKmdr40?XWOcZN1Mi_EzOIf6(Mj@m z5>P){f7`5|?rxIj8f}$8z!a2GKKRD9rC1X3ngI%WFxs>Gu8ta?);}SK6+xrZ>;?S^ zV#0DzOJa8bdmbFIPwaqBhIjhcTxI7E9vGg&izO<~^eka+Z%IoV^i0N+ln+<;l!=oH zTKr-DJBHr6)uI{x%x8<|hlE=swx^AQOO@sgA0QR`2($}nu-6Kcmuh|Y$wHEdKMAi) z64fybN_46)q;AuNtQpZbN|IFmjC!A?Q=D(p-nPUSYXZUBpSI=CR8vuEQ}p1IC1j>; zk3stQo?V81g4eC&Q*rx2k!&pkV1H~vnk&`AVhH<`M9!I81_fUkyAgNip4jz!P+eiT4~P!V>A(vg=5w47kEW!XNk8N{_J<_c<-Wfjb8Bqv(6+G8IB@fh@LZKn7K9h zL>)Lv`3{72LO9_E(#kVs)D#m_926MN4`3^n%=0w10Uno;zh&94O=howMhCsN} zMtQ5iz7BMMI2am6JG&JwG_)a3u$bh*S1tUS3KsgRnIrQG&k`GTt)-br9SwWFIdOEV!AUAG#oAuumxU;7WmU_A`nOplKe|d)HkU#0_Xdp zt}*KkKYl&lsqP3B)3gu^7#(%&9w)VDTenW%oZS=WAK^ZO&U7l2(&i1F>>!C1RJ!Pv zuC_iw)Ns+r?S+@%nqWHzMDO7{6&G$NsI?kT2g5Muh14c@RAazd!bkNkb;O^n`zJ5Q z9M9PcpP^;R%2eWbCD(@$*TPOOIO8g|eey$Q_>=DG|2UEwTsE@}|0O61>3(Qw# z9j41W#-h1z&^=*Ms2q8)SHuZzym(CB^bPph8sWG^taN#dYt!X?d?$IYcZl44lSMEX zi}#w2kI;Qbn6r9KSI7?`Q?OS- z1vhE*GS!vCdxDdoGH$3w#V^Y^3gt7d$skb+ZF2u47$yuXzT9%+-@oDuU*r(*n+*9$ zJn4J45SVr(yCdFXxasoiz%*Mefefs(7Z9OwvkIs%u@av{zIa(~Q63Shp`cQWu9$uE zd#S1gBlfEVFBj@`|8f$=+{uh1yn<~QMZOX^Ysq~_>lsXI_hFPjZ&~2o+;mvPG1ik@ zv7iSgCB!~IWR20)6Zpa1Mnpw0W5Nf^d z`ng&z`KT4uaz9mBqdL3yv`V0A%+XM(snTc@#2v*}M)<0r5pG;rT(s%?JHbD1Lp!Y} z;At-VwR2}|r6GCDz*S@a3Ly8#jx>sAfW*CZpvEJ_c<`{PjEMQtE2!v@CMhe()_ z6vpjI;a@?O>v&S86ExL(qh5kb&STXKPm4m5K?PZGonDa-{qYJ6?M~Eahn`+a`ScIF zRv5!#*t$n-b8HA)3NJmMS8yOKl}pGE)uhah&}J9@5!vL98N_uL^Ys@cUmp#r_F?j~ zU38pHA!kOJK$t<)2YL+~k21Yy#h)H?;3YFMb`KN{S-LTr%&3_gCr*y1#2clKjRy)f zJj2UGJgTpTx_%qmeG~j5CsU1)zDU|W53D3f$x?~YA)}T!v+&WBnR-J+PHUDipJHW^ zhCtEf(6fs1EUd&J7;d%rA3Jbtrq+gExSQXF6Y&@fA%F3)tbk$jQr++gb0r^0l5eAB zmh#s#6bp3II<8XkxLGXi75mgDlq{fTewRldSPl%L_Xp=&7ynyHI>c2MrtrL znd8#&K|1Y21{%6z^5JgJDDQHKp)(5)Vj4vSnymibxM+H0uS4$hicp|>b_tj=u5kKD z0$eH_9*0>rpLeb~xTl{3kz z`~#T*(<@-OEP&!92=00L5YLq(V>*zy4YI6xX4SGZD%bTk2=ox2VGz!RG#pUQ6>wT1$Q%2YV?;SAFIy|=T zB8K|VKDGKBFc2^{RC3$W0=3>72Z=48MLkOijWP&1yS7R+z53aYFe{?eMQHTPeyT`( ztHh>Q)Sv9jIHNo3;D<-hT|2~+d9I%=LB+=DrXRQw@~U&vx$qhg^8{N83oA$p3;#!$ z0|Yl;LGip2eF8WG`pN@J)QIRG9fuUMXu{APXQ@7Z6Ds|r<;u`{1)sq}LP-}BXx-Bj zJ5UxBSzm=%6-aOgzV-We!9Ee`3q55+*!e~a{@E$-=^D6Dey>Ws^*aUDQ3>)bBerI$ zn+_s>0w@&W>V6pzU9wcKv(IYZ;6gja#0B5&-oEk$8H5kfIn4}0q(_j4*UU8M8Cs~O zq*B;K_#i?X!8!4QY3e%1XIyj-vtL66d*OZkMzuk^h-Re1q%kPsA64^x2#@M|JtOP2 zN^9qN@8N|#ZB5gUSj6ML6Q#rj!eFu{DF%d4RANz*O*i1*{z2k?`PgdWl-x5^>rbU3 z5rhAP%kmq?vemO<7**wn&O!pq52*-K8v*vs0O(}akh501x! z3jnY+bulFHu(h#s=JMbr`isj2{QdTro`~RY6BlbFk}%=@~gWIq4ag=$V*kfflsR zo^~#V9<+AO#BUJ)V2GGH8#`G#xLDfT5xij<8ri$L@DdRL?+N~6ezp#>vi}Kh=lm}g z06yqF3?1kh=@{s3ZR!8LhqH^Q8vydJ3H={?II95BJH3*rv%Ra6v8kw=shtb)ze9*i z$}0RP!kb9umbMOmg#yU?Z-bc_|7SY~S0|glZA^^mO>InV0Z?aPevJREy^E#Uf06ay z=JxjHuQ>lc5n#Cg#Q$%t|3mh_je%COvRoqe#;$LJN{a9jz0H@)#NOD_gzN903~WZM z>_$v%w9E|5?6fQ_?2NQVtj6rLY^H{W9IR}dCZ-&w{{|&#=j>u=XKeZg1%T680yykU zj7A)s9Bi}onF&i4QaIhLNv6?ac8-%=*C7_jtHvc}WHz*STij|X- z&6t_VgqDGYk%5-Q(1eNB(A3a`mdTKXf!&1Jkd4jA@GsQcI&cXpNb(Xf(J}nj69pSX z7c+Y&TV5g=OFLJO|9YWfX=|$NV)#ZHBO4P38#5;x11CE(6Fb8{Q~QgjX6ob&DBK$+ zBLf{1%ir!M##~|mq9LF-mbQlGrt}VW=6_$jEejVQ3_z^mo1Oy5f1d-ga0xq^8oJm! zso2}w@DjaY6TCtGRc`{Ge-=f;(iv#s`KIyz(s^Z5$A3QkvjuD{|Gpw1_^Y;DhQ|L4 z;%w+WijPop*1vP z=cF~|U}k1zH)Jtm{1?OjiSBG~=HhPXWGZM5ND4>;D9~SN2q^w?O!?pE;%;I3Mj!(d zBP|05EhD1}0}~f3GZzylH3Ksj0|OELzXYa#+tvReF%SL!ixZx|4gSpx0R8@X2ACJX zTG9Wfx%wApZ#4d2{QB2g{9haafd1b>{zv@&FJ1pj*Z+ut|54-r)vo`g>wm<+|ETf* zYS;f~biw^sz+-9$ctP$!I0LR7zX^mwP)5??B4Dp?-?^Q|iNF(B2MJAQFfe$uw;yn@ zjIS8LLueOCSyAX+7`V@@xCrBMRbXHQV3Hz&D!~2Ss-+9|ZTjA$(6^cdNWnOoQ+SDp zOo<3RV|Y~C#o93rxv!^)@?O8kU5Ya$Np`!^X0lXgf3^=Twmq&mPjsfFQe+jF|6Yrk zP4tkYk!4E6(Te$jOYP^TcKg5M^E|20npNrq zfB}2A_l~f#KoxGR8@!0l` zOEf)qCE14$P@pZ+TO=4%WCAcIx49e1cmtJFkFo*9ONqst@u;yzOy>{rIOU7QXs&du zaX3JZ3DYSjJsrkN7+jLRG(k^EAGiQDeD@CWSIws3S>o1a%gT*PeZG~ozJ#sZr=yD}=Qr&2E*m56Mycyv=pw{ghm$cD zj?R=VsFCivUc@2KA+}8XZ21w>-szl==gw66@PSNti~JNHm4raR|Jtk=Bu~cErj5(G zJnHquUdhuZE>o41t8zS9LjiiF*gRCn+?*^hTR~vjQngdFxQjzh6_7^b^Ck+yj~!b1 zMvgKZ($VC>ypA2^!q|t2HceF}B~_M>xAX`)zVeQ((B_?b%@bKNWDs6KdUJ;jhc8p0 zw^bxqKCU~9Hv(uq2WY+6lt;%qgGUQWn+_8anuOs~F72_c!|dREZqY!hqWw`cXPkmGZQ~vII}>S-*&E3z1(~%AfQDVQ*1cYBV?7$M$@9oEja zb5yaXKEcGp=(J596o*axDm5b_m~1*^!@vnL{`Rd^Iy-#Qh=agNbk1O!xu>zmq80M{ zQq#;Dx#*Lkr?fj64_(J~&y1S;2B|W2!FydVO4}Ik)Cl4F__8#t>gM@9wFQ0^+a~nA z-QpCblra7bn;DQ4sHTS6m1;xgGBy7lc+E(%I16$rcUvZIa!f*YWOMD_Ic#}C@H~m$ zNwUUR6;8hAcWx{UB{6iez{qd@a`dHKopK<P z!ohR5Up%}~A#K7*)ilS^XxYcUkh!Zmc3a3K0hAEYg+u^sHjBzuXmB8GA0t7x>NE3Zw< zV|9~1&VBmuDR~LXCsA-=_x5*30x&yX9;?R!4GOwucXm@m zF&%G&OK!E~9e_U_LfZYr_#{RK)Fzsc*_F0XS35~^gh66yK0#!S5v@x<5wLQj z)K2*bx=``!rn=qwN;VOXj#thk)T`3MB)#a;B^NGQ3zmv1V3F+fJZDc^op>aF8!H?& z?KzH46yV1m3^ffauMyl8=Bg za(YaRjwuUe&V<|>_b^TV1NI5VAE}I|x2t63#UwG`OIvedU^~6OQU!k#{2k@>-yVDe5W&fZc&{pLiF<(aU)F1G<6I zo9`C;@kV@?cC|9*F!_%`DCaz*oy`W@FVl5mQ6b0s?1=_FUe#3Dz&FHzO~nQBfnM0w z?eO2b+mdQ2l^ApHKf%n$uU>l(h>#GLN=x=6Su5zL-SMsK+(CAkt=D(-bqp&WP_%N{ zitYk)t@x~Oe-~?HKhPW<5R&^)sa61%GB7IGy@G$1i99^!ai# zeU9+Ri)5qVGwlX(XEo=-=TCFL8th-TvR>#%*RRqpKZNgz z-=dJnr~7TSs~G_aJs=^UDCQ_T_Pr`5=^T zY+KC4>^*sJ%8(BWJ5Kn=px?Ax(^Qoby{)9z8o_rz{Xj|Cnabj={I z#Qc$39nZT=fGTSPBx#q1o{Xo1KZ<%KAn>Pih(ow66 z(a&#RH4F9x{cSW>?vB2zk95Yl#5U4UZ<_~*plz*E z3#ll%!RUHIc}uGFrKbCMvD)^!(Tm>!?&Eah4})$CXV<6rtIglmA>9`r3u^eO+L-H!fNAuOh;durgq=J`fu9E|V^|9IJd{Rz7dQxEz!P_fwevEaCPTl$e zC+tL?71(0BGnWQ{$v1|LgoAV+U$E+;rW;V{9M7$9I{l@xd{@%RYAeIFLfow9=o3e( zf6+!-InQ6({BhYfqlf)VR_CX6CBTpK5Pr^e2bSJ~gRGf%YQJPr?MF`-7Y%%* zVsRszeYL&Cy$eWNs+enKyP2G$s$9fQW7=x9OHx@wI~VhAqWGa(=cyU5exQL+4Aiam zs7r|zHe^dZn23z`{jnxEnRE#O>9A~>8td%&a-P1GoSxtNo8MDUX(B$T^e`oeBpdxr zV{l?Wsx^$JkcoGiIZl&P(b+$3PU9YV&AO|f;8Eg)joZ0jsEg=alWc;lkK3L8;HiGc#|AR=l&fZLjw<+g4XF;MLu>ToMkF;=s~IiVo2`!9 zZ(F!ii7(fmiP{gD5H10Kh^wqQ^+tzhoDb<8q~8br2%CFbOBNxjbkx+XGCmZYX>#G= zcGMU4mM(o#X+V4V+reP$|*>+#~K*ueeUsF3bEUGV$3j`Q^)?2_tDX{{33US>$oqSt8L($;#B~ zPRW{{*O<9QDGwMG^2(xBe@;>ov!3Vvm^7kuNY~!M8PAgLlEMn+x%h&QzDY4~K;Gp! zEu+bfiq}P{KRyo_Ky zFKx;_N=+DZ^2`s$A5#hv_cxd+GOA-tV3|J0iB+GY5Va&y%sFBU?R-&OCqGHavnuy^ zN)39}rvoOQWG``y?`bE?Gvu~(D**u7dFKr)UJkW!E=zri&SP(0VoA|YVQ=u@bC_1M zZlue2@4vW==b!%}Dv{>^eR}Js%r{${Cz=)@D3j)1{cHgry{#^ID zYsp##9Xr3eMa5;;llbFBT)ZV5MM}SxJBvOLD>P3rh<-xn>uaTsvd53O>f(3c;DIz{ zVpW*e*MmNtx3BF@Ylk-%RU1YcFIp$rs@@7`Wuq)VnR#QUv*D?^f7U-rxT$6mQ<)-t zSAIY{upW1rqi8q1LCn1__v&sH(dGs7?4RQE-LY1R_Q-SEW^r)8_eqVG^zpTo(- zWf$7^J#`M;cRuZYMTi!S{TcJ~7F)(^mvjM1MG!f-o9>y6o!}HMrN$w&JiegdgP9me zHu+2Tgzw|jX`Spq)|5bpMe6f-%)@EJSv=7Ncyx-RCqtd(z&M= z@L4(^#rYSPujIUQK3;_E-jHWjFOsA+4knruRp8N_(o<4%G5MH09X|!T|NLrx)y43F zvl%ewm*N1+rswgIW$zvfuM*Gd$>l^r&^cS4CEVS0#d#Mdspr+VYxMKw?b>VVNoQl$ zC*3Ill{L%PyZo;9V-OH|$1mqtbbZ^4AJ{w>h@UYU;l3O9xUSm> z0=&jV0NY8$J(<=|l7U*>wHkAZcK@@_*0&k^ukLVIg7=G0{3X3Sw+t}I6>9JE(3D%> zo8_4I`nml{z62kvdOVE4s@$zNls{PY{Z&O{IYvWo*=Vy|Kv~gbwf0b5{PV<%WnO6#g2_&#cAgk{=%DT8l z>SS^&>FAoJw5L>XxnENC)X-i2oUZ!Y>+HF?vNL-5MAy(yfgddom62S2(bjGI@LZ0M2Yakyq)7f9EyFr1?SUy&KVY)KUeEW{s+ zGjSSYQ}nZ%MykHtyArpdsBaAoxYOSpMSJby)4yg>{dCL;1nbdCmV+NQQDW7OiWuB= z&GwT;&d8~S4&Ys3Cf;kx|SEd1M;^h=qj{Xj55wj@HV&HKo8Y52h0)2iiinikOb z=E7h|%EV$Sb^P4p(DX=X+3ekY)kxFy2=q(c$#LPjEMB_D0*EI|3LaOUjbEj;@+vYt zTYMh$;qZ{M?Z=96v7cubKUSEhjOUO3ms-%*T=;j8i>9x?_*~te^-Oy@_i?;vX>EL) z_|S;TImTSJPp^w6=Cu$!y*L5LPujbKbh!B595a_g8Gl;rMA$niaIk!~JCyT3B?C() z_vz!QFfzf=JTm5Lv2Q1#a`@NB>ypVfRHE{`FMcNpYD8_bsw*btXw!iVEBsmqxQM^% zO7iEg|#`Gq90yH0fBGyExpLy3Av6G9ep(Yg=E-W;hN%%n{VjC`vDDHJG_bKp;x4LvJw2~(FE#6ET()%>yur{V0yT6e z_+wWh=&Qba_Y3o4#=N6CxKouiU!z-$#DAXJ>G>}G9Uxz9|o6_UsLCB6gFI3DW`MpBNOsAR-J5G^`;34P`@kNLMxk$>hjrP~|NyAv{^M*yMi{rgMc@1-oi0`55M8uD? zs|eo7_mb6@E7js5WBMA;2NkUQBVko5c1NGzWeAh&^B*OVR9@7#cAF2wsSy17MVMgC zN)4~9w>L?>z%qYHx>m;gj2LUGJbsW6lh?O-zTYD)PW}}tQI3{NFr@7YRq9!GK-gSVCs}jhXa5b%OIL z^SqolKKe7!LiGM&>J_y7>*$}&KSnzZgzEC$5ZLdI7Va9^ znsY~-*my9xoi=wwx+xcOJ9x&DK9vagBO%0p^+{yn_Y{^ld6qZV#hn7>-uT}}y?);r zKFH_1H%qAy@CR$gdE;c|T|E>3+g=2fm zDiImZ2N~n%>so89qa&mK+mSH4gOt3!Z?(UAr0wOnNb?Jxc9@LT$=Te z4V#ZCsYsn~|LtLzo%I0t?(9~;Vth#cZyz-A8o)5xS(7rg$+PZdCf&ovzO5uu%CdA! z@|re_bs0myNMf3-{!%+vp11zrgZb{1J`@p}r)Q@1{%an5MJ{yUG9FPoc1pL+-J!-q zHa#nJgtaYh;+dYEMh9|(Sr6keWwhS*XeC?pud>Stk>V|JF{ssNEy*1TRDU4;;SmwL zDK(3f)a*F+yZi}6B%bkOH{};hM7?IqmD2-ZN?W>WDSn zZ+>^G-nMdS0ipVtvwm79kEatEg%#^!eQ+|mlJglYWHJ4iF5AvND6d5F;`4jp$gjkf zp0yzEve-;HO?ljPJBnG1%pNH;K##gEdQZugQ^KNl=+?kD@8Cz&rqc3Jd-|VV@8697 zhLMQf;?zdT3DxV?uZ`KhHF#g`6rV3@G6PC%6P)XPSk@1b+Fg?!veuKyFOPZMjHhO^`^taAGM*nGMy_DqQsONW+vx}5n%b{e3q)!wrizr z-j7eaq`EM;0W09Y(G)6foAVJt)#2jH9^;-aG~poC$4fiI;^bV^c8P6l zZmX}LMhzR*uY8~*d%7j)< z)7m^aO=gcu|5APavQ}sBd1VGNdfo5(=m!FFKlsfTB}a*Q-&$54EQ0cX$Jb>`lmDo9 zTs(|@6`KxJL?DwkUq82z#z5uOeyJ$rF8;oPiSQ!=h^}`@KS09#sqO9S5|6keavCLG z_%gWV^+Y$6Oj=pGIodgJ`|)bzIz)F(aM?cRh_bCn{zHCK37#Tl-wLrG0{^K(cHT$&<1Nnu9y=m_B?9evG zzU>kF{WisQZ#ddY)9bAPKiso7FP4WaGG0+%A;2I={Y|Q0KwgWlb6BxG--nZjO=Mzw z-dCJDzl)rA8MVzrelMrdW$$AeSAKxT)G1U-gMhyQM5s8+UnZPp`LtSBE;W);eW;Lr zV3)=JOh_pnb$xNNKL`@-bP_gHr@=^dpZW|0I0&ErCZ(c=E4dGGS#@`LQ>%^{$a!8g z!gMgNdFv;$w9Su8y-P;o!$@|jReUq8p@8FpoToRSWaUbtGr!2%GjRixepIdbqFqaG zIs^O4ZsucwH`i-}XXaWi_4DW!unnq=XMwcMytBvbwWOh+h#jb+$I!1~>yS*acbiz1 zc-TQI+jDRmreBCROW*2%uA;&93&ht$z#TYZFF(g;g#j zGy{H3k(iB|%v={gxM_KppHUt~d@;HJGDE^)1nui_0Q+=2hroi-Q~mYWJPUkegG0xu zN}I?cn=4v>B}Wwr)hZCNZy>07he9;bSnhP&&$>Gwke&CQ{dn-E?%JKoyb6CNj(P}$ zgIvUUBMI1DnfTTYzZQnhN!olQleyuNXyu!5Dk~~HJdfQ^yWP3>^s4OWfOOJF3a)as zv5fU4*Zi*V>~Z==mrU9sAbZf0fLV^mpxmIIxjE3;kuH=(RwSEMcjJpUB>~gOSB=Qh_C$GDtR+!m7dR@T~MS zhl|a9|H^)x6Ubv?IJrm)PWJyE>>O08E}Evzss0QpsIfMi#+pB{Kx_G_`IE-QXgRC# zvz@v9VskPCGymJxGoTF(C4kAJ2*Zm0_(3FM8P8q|ZT)gmv$3p_a$S2-jmwNFZ9Mz= zdOto~`Sb-RQqt4$Vr04X;rdHw1XJsV%rh5l1L&LJP_NX^VQH6n$MOgs#k7lWt*G-& zW8|}+;uU+gPC4f}4+y2=J`)3*g?}1LaZBGL^whVKnty%N?Mkw> zKN~H6@WKhOsM&k*TVK;vF+KY5XnZ9K2xqH?f1o0T9X_~|f{UT~xmbvd>I#pP7#3B6rmD{YN>RZD6&GQT|% z22@LV)Wlq5iv$bQeogHrKI zeDbK~Li7XO!8R|h-}G#j@#q0SplJIMXB-M743Mj5pw#7K*FVwybIH;^1qO!v^i~VN z$9SIYePk69npCa28}rW8Sv{Ybt<&XCH2!mSUn)ISu``?#4}BExZ9M+d1Td^DI^c8F zZt%PwC1*1)@=y8J$0(C$|sYIzZN=K$Yi)!%AK3XA6xzLLx5Mm--|{^^jnc)UQ_m+NwS`9h$BE30uI#~1WuAPOq2H<1p=8yyFfzT_;| zJyV0=%H>6Jlr2k;>iKBe9?PBGp^P2|*(O+Np-gp`HXUU(@M|Ch`RiyagmTb~xN`;B zZs9Qg%6#bKOFXEIbE4#@yhm1Fb*w(_d85?g!@RHQEPEQv^~&X5W;^`IC3ikxzrcFh zx_VN?T}Dqe@uqn9`0pNHxta5<$JzZVd!i@Ek|-LdB_;!!55ESd?| z2+TxMAsE{F)AIY{YTfiS1o_LsO29XM9j**xMk@aFHgAND=X}7Y_NmX4@ygoM$K=&e z)NkupWU!`=FVF8P=2_lq^O#8Cw>=%N|LykU-8oUT+GNptL5bp-m0$vaxRC1M(c*nO z--4<1G+i!_yFqcJiRkg1aoV5f9W`*pV=vvr>&lmKG9$gSd6!St+vy-8ZJR|LqCkhS zg!$QlbiI3UZF|S8O6ud-5iG$t7A(QOtT1k0G$&Yx^?cgSqlD~ zS7_BV{mxhWiP&T1ZoO{x^c)=rxN3NzOLOb@gpYFPp!KucAByV_c~p)r-(9KjBr&Eb z^^gVq3E*{>&xRP&C$e7wvpJ=#{9L4ye^GY?ZM`M?dcT_;#1MYGe?(PN!+f(|p@Sn;7vfltiIE4y&)poZZiY+jDb}psXR}Fj zgN=SJIc@ER)lB@Gu5i_GLZkIZL?V!eo|4u#cfD>vH9)qKvXP9W3cRK7Hi1A5x<05{ zv(Cz^rONNzXG4GOWv|DVHU4TxOV;|v8~sr{MYw-=>{vs;RHW|6n~43Hw-|6R|Cr2D z!35Ue;HeM*5I@RdtmUU@fAV`D49&)0zIv7F+s{(+XFZ>1*vsj|#yeJDJ{{#vUbMDd zqY~xCpg4gn-Eu0&N+tKirsKpb0 zIl&>~ybdx$i^;dd{6&)kB>X>va8Z1#5;jXAhqaEf#s?rEb9 zS~Mq=w5z#isU{ni(oz9ox|9?pD{ax-l`Vgh5ODe%hx5@jFDCu2yp~%Jnf#Uy9rH@K z6B)CMo)-8ho+Di~c;wUT&9Y13M{}qis3$oGb%}j(vDG7D2ozOpg&ZNyz?6Lx*i(X# zEN)A3$%5m6wR;EI+$TH`TO=GApSG9hKCh<3pu4Ds)vU5hGSilH>INMS_*~jyHg2uRoBMwCFh3syJl%EJv&_;;(^zrgwJ>#^X{bx~T~s1S z7?`-@>zK2#tDvSTkAD1XnXL5m3wg*v8>b!>RdLM~CC|q|6ChfDKL2g}zV$s|c4yLw z(a2Yeqg%gJe64%&=@@ZIb z$L4)_;*2tU{!4A1((+@F$w5AJIB+&eH~mT)(~Ta#`#Jq>{h5E9pGM~<7RXF)0A)49 z2=1M!!Xz!o=MmCIlWpOS4(6mwD=hWM6T~Oj%2h+=Ls$+;3~Kg`sV6CeHCHn;s(rZVPal_ysI+!Hd|gjN>1=hE&nQYM zPVs^BX71M4uXf#njRLyJuOCTch-JPxg%=OOBT(-oAw>!(_5iPo3G7dWO$d!}7kQUG z`E<3oNcn1FQIR{ur8=kh(1jPCivk&~M!Zj>5fW@=9;>Vn?)O7`IDap){8t(ai3yY2&i z)q2)r4)L>Cy`HCMMA^35an(AtCTe@0LUOt5MV}i6mpH=#on1gTqYK;oWhHX z7o!(H*Lya7MV3~>Ukx8%SB|+D%#UOSx97@(ZQ`+=h%Bq^Z6Oy7Lngq6BE5yW=)H5M z6huZ{c+SMD8XZjL9B7t52M)unSLEOyr&@+ouXTOS^W@}xl)l=3i!bJM4}nYADSy<9 zA3Wy1=*=Pb!XgCzn9Jq60L3IRZp2nr5m-R3)XRwVRMv)W$a)o^cG zEb=|Yl_*zZUHKN} ze!8SEwQb<|+8!J17BLmCC<@5`6{i_EPOa)Nl3U|FfrMuMC}FQl3ZQ}|Xv%pMWq||* zEy{0ol<xzB4XoO z!Xjn~*epRQD;6xmEIH>O6X8G3u>Nz-M)#L3zNGunW8{H1p;YYsihuGXWiX|$&hyZZ zgn)mVrBiKA)o<9@Lm1CK$IHaa?xcVb+DTfMjHqzLq64pa=mOjrIB26f9rb;SXC2+x z$LXklYAScyIM;Q6(?vI1E!l}=PAMCW!aju@Fwt?yC{RUmV=ZFxa-PEQD5+}{o^NHI ziI#6`+6cHGA8$l=QN6$A?_Rp{&JfrCQ&MT_9`+XG*BqeEFY)M03V-7!Uq7BBVW}F@ zF)}z@9TjFK9ueV5g28b9P^Ly-Mjr*rd4UG_FjfUFx^-;mT^g!_CC~x?wG5%YK#QtM z4ZDn=lL2Hl&gyBk)XuT(4xhKdoOT_as>@Hp0<23;3u-BFN#2vDqouxM;kC5J%*%D8 z0QGs7w7c!M@D6D13+o_tVI$qThl7Ea0%ivGr3^`4xIa+mgCN$~=4XT717wq0ItlC4 z-)`t7b>s8zF};h(>%>y)?bK{PrhNPWtLSL(6uivpyRsX7XLQ;ScXNQy)*nfiQu0hyBQ+%;Ls$EmD}!HuVY{oPNodEc6M?bRRdjC)qDnb6lurL^ri4i9JF$AfPmOsG zfFXc<6WQ*Igb5?jsOvyX%0%Uh)BG5DX@&4XjoBMbRp)4S)qZ^Y=q!N~an=$YEOL#& zJT*FzOV_DG(EFS;gN`lkeE>(@Zj!p(y|&iZxY4jFt;0y^2u?o+QKpldn}z)_JxqKH zyi!jIK@4{e3jCb`ZHNSLbt{b(fkQhnyPBLmH0FgZTG;f>MFRuFdvw<+EBzYkxA3V8 z*X|6qYj|pLTESbT=OS|W8#5q)nfjYuDHBCC`%9XF>8d|2E(RAnSChwK z=0qsckS<=5Z&EZ$9lG# zY_^-XaCQxMC5n$%KAoTiU`Xm3P+{+hok}}@O+DPV;oT1X9JH(Gu5OMuzlfl$q~^*@ zFUV+R;YUFt2Pl{n~z>cNLEra zU}B~D+S^&&B$yLnML@ktmw6?l6aWT3?@Fq)PCg(6t64=4^wjkx6`7TgqJ{~~jb}Ny zl~qdqgjh(N5pW(rxv+C!X+MeW27izw&$N$9-|j2$CMKI)*m1H^Pm7L@xpM=L^6S8; zalLluHh3mrdn^{U2NA8*Ds)IehV&@Axg4KmSFd?iSFfd`OxTtgtRC|bRx%ibx7u#P=^Ax7+F;u` z+fQ@LFI#+(3nyrF9h`V+xQZ)N4n(>7r?w97=m5PwLyB+XbEM2pYDl0U+maUIN|!p2 n^|~hY!v6nZ3I3bNFD0)C(n|uEPegg%Z=WSa + + + + + + + + + + + diff --git a/docs/assets/websocket_icon.svg b/docs/assets/websocket_icon.svg new file mode 100644 index 000000000..83d54206a --- /dev/null +++ b/docs/assets/websocket_icon.svg @@ -0,0 +1,48 @@ + + + + + + + + + + diff --git a/docs/guides/compression.md b/docs/guides/compression.md index 89b8e80de..d614a3a9b 100644 --- a/docs/guides/compression.md +++ b/docs/guides/compression.md @@ -1,3 +1,4 @@ +**Introduced in: `v0.3`**

Crow supports Zlib compression using Gzip or Deflate algorithms. ## HTTP Compression diff --git a/docs/guides/multipart.md b/docs/guides/multipart.md index 61cc47183..b67c87975 100644 --- a/docs/guides/multipart.md +++ b/docs/guides/multipart.md @@ -1,3 +1,4 @@ +**Introduced in: `v0.2`**

Multipart is a way of forming HTTP requests or responses to contain multiple distinct parts.
Such an approach allows a request to contain multiple different pieces of data with potentially conflicting data types in a single response payload.
It is typically used either in html forms, or when uploading multiple files.

diff --git a/docs/guides/query-string.md b/docs/guides/query-string.md index 34e29be82..dce718b92 100644 --- a/docs/guides/query-string.md +++ b/docs/guides/query-string.md @@ -5,6 +5,7 @@ Crow supports query strings through `crow::request::url_params`. The object is o ##get(name) Returns the value (as char*) based on the given key (or name). Returns `nullptr` if the key is not found. ##pop(name) +**Introduced in: `v0.3`**

Works the same as `get`, but removes the returned value. !!! note @@ -15,11 +16,13 @@ A url can be `http://example.com?key[]=value1&key[]=value2&key[]=value3`. Using `#!cpp get_list("key", false)` can be used to parse `http://example.com?key=value1&key=value2&key=value3` ##pop_list(name) +**Introduced in: `v0.3`**

Works the same as `get_list` but removes all instances of values having the given key (`use_brackets` is also available here). ##get_dict(name) Returns an `std::unordered_map` from a query string such as `?key[sub_key1]=value1&key[sub_key2]=value2&key[sub_key3]=value3`.
The key in the map is what's in the brackets (`sub_key1` for example), and the value being what's after the `=` sign (`value1`). The name passed to the function is not part of the returned value. ##pop_dict(name) +**Introduced in: `v0.3`**

Works the same as `get_dict` but removing the values from the query string. !!!warning diff --git a/docs/guides/routes.md b/docs/guides/routes.md index 977df25e1..e7fe72435 100644 --- a/docs/guides/routes.md +++ b/docs/guides/routes.md @@ -52,6 +52,7 @@ The main return type is `std::string`. although you could also return a `crow::j For more information on the specific constructors for a `crow::response` go [here](../../reference/structcrow_1_1response.html). ##Returning custom classes +**Introduced in: `v0.3`**

If you have your own class you want to return (without converting it to string and returning that), you can use the `crow::returnable` class.
to use the returnable class, you only need your class to publicly extend `crow::returnable`, add a `dump()` method that returns your class as an `std::string`, and add a constructor that has a `Content-Type` header as a string argument.

@@ -73,4 +74,5 @@ class a : public crow::returnable ``` ##Catchall routes +**Introduced in: `v0.3`**

By default, any request that Crow can't find a route for will return a simple 404 response. You can change that to return a default route using the `CROW_CATCHALL_ROUTE(app)` macro. Defining it is identical to a normal route, even when it comes to the `const crow::request&` and `crow::response&` parameters being optional. diff --git a/docs/guides/static.md b/docs/guides/static.md index 9be03dbbf..7659d2dbf 100644 --- a/docs/guides/static.md +++ b/docs/guides/static.md @@ -1,3 +1,4 @@ +**Introduced in: `v0.2`**

A static file is any file that resides in the server's storage. Crow supports returning Static files as responses in 2 ways. diff --git a/docs/index.md b/docs/index.md index 587f35f7f..a572d90d6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,105 +1,3 @@ -# -

- -

A Fast and Easy to use microframework for the web.

-

-Build Status -Coverage Status -Documentation -Gitter -

- - -## Description - -Crow is a C++ microframework for running web services. It uses routing similar to Python's Flask which makes it easy to use. It is also extremely fast, beating multiple existing C++ frameworks as well as non C++ frameworks. - -### Features - - Easy Routing (similar to flask). - - Type-safe Handlers. - - Blazingly fast (see [this benchmark](https://github.com/ipkn/crow-benchmark) and [this benchmark](https://github.com/guteksan/REST-CPP-benchmark)). - - Built in JSON support. - - [Mustache](http://mustache.github.io/) based templating library (`crow::mustache`). - - Header only library (single header file available). - - Middleware support for extensions. - - HTTP/1.1 and Websocket support. - - Multi-part request and response support. - - Uses modern C++ (11/14) - -### Still in development - - [HTTP/2 support](https://github.com/crowcpp/crow/issues/8) - -## Documentation -Available [here](https://crowcpp.org). - -## Examples - -#### Hello World -```cpp -#define CROW_MAIN -#include "crow.h" - -int main() -{ - crow::SimpleApp app; - - CROW_ROUTE(app, "/")([](){ - return "Hello world"; - }); - - app.port(18080).multithreaded().run(); -} -``` - -#### JSON Response -```cpp -CROW_ROUTE(app, "/json") -([]{ - crow::json::wvalue x; - x["message"] = "Hello, World!"; - return x; -}); -``` - -#### Arguments -```cpp -CROW_ROUTE(app,"/hello/") -([](int count){ - if (count > 100) - return crow::response(400); - std::ostringstream os; - os << count << " bottles of beer!"; - return crow::response(os.str()); -}); -``` -Handler arguments type check at compile time -```cpp -// Compile error with message "Handler type is mismatched with URL paramters" -CROW_ROUTE(app,"/another/") -([](int a, int b){ - return crow::response(500); -}); -``` - -#### Handling JSON Requests -```cpp -CROW_ROUTE(app, "/add_json") -.methods("POST"_method) -([](const crow::request& req){ - auto x = crow::json::load(req.body); - if (!x) - return crow::response(400); - int sum = x["a"].i()+x["b"].i(); - std::ostringstream os; - os << sum; - return crow::response{os.str()}; -}); -``` - -More examples can be found [here](https://github.com/crowcpp/crow/tree/master/examples). - -## Setting Up / Building -Available [here](https://crowcpp.org/getting_started/setup). - -## Disclaimer -CrowCpp/Crow is a project based on ipkn/crow. Neither CrowCpp, it's members, or this project have been associated with, or endorsed or supported by ipkn (Jaeseung Ha) in any way. We do use ipkn/crow's source code under the BSD-3 clause license and sometimes refer to the public comments available on the github repository. But we do not in any way claim to be associated with or in contact with ipkn (Jaeseung Ha) regarding CrowCpp or CrowCpp/Crow +--- +template: home.html +--- diff --git a/docs/overrides/home.html b/docs/overrides/home.html new file mode 100644 index 000000000..e15ac171c --- /dev/null +++ b/docs/overrides/home.html @@ -0,0 +1,300 @@ +{% extends "main.html" %} + + + + +{% block content %} + + + +

A Fast and Easy to use microframework for the web.

+ +
+ +
+
+ +

Blazingly Fast

+
+
+ +

Header Only

+
+
+ +

Typesafe handlers

+
+
+ +

Websocket Support

+
+
+ + +
+ +
+
+

Easy to get started

+
+
+
#define CROW_MAIN
+#include "crow.h"
+
+int main()
+{
+    crow::SimpleApp app;
+
+    CROW_ROUTE(app, "/")([](){
+        return "Hello world";
+    });
+
+    app.port(18080).run();
+}
+
+
+
+ +
+
+
CROW_ROUTE(app, "/json")
+([]{
+    crow::json::wvalue x;
+    x["message"] = "Hello, World!";
+    return x;
+});
+
+
+
+

JSON Support Built-in

+
+ +
+ +
+
+

URL parameter support as well!

+
+
+
CROW_ROUTE(app,"/hello/<int>")
+([](int count){
+    return crow::response(std::to_string(count));
+});
+
+
+
+ +
+ +

Support Crow

+

Crow is provided free of charge courtesy of everyone who is donating their money, time, and expertise to keep it going.

+

Help us make something great!

+ + + Fund Crow + Develop Crow + Chat with us + + +
+

Get Crow

+

Crow is everywhere, you just need to grab it!

+ +
+ + + + + + + + + + + +
+ +
+

Learn Crow

+

The 1000 mile journey begins with a single step. Get started by installing Crow and building you first application. Or go through the guides if you're stuck somewhere.

+ + + Get Started + Guides + API Reference + + + + + +{% endblock %} + +{% block site_nav %}{% endblock %} +{% block footer %} + +
+ + +
+{% endblock %} diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 000000000..e3dfe8716 --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block extrahead %} + + + + + +{% endblock %} diff --git a/docs/overrides/partials/header.html b/docs/overrides/partials/header.html new file mode 100644 index 000000000..38ad4a17a --- /dev/null +++ b/docs/overrides/partials/header.html @@ -0,0 +1,150 @@ + + + +
+ +
diff --git a/docs/stylesheets/colors.css b/docs/stylesheets/colors.css index aa0a82f38..25a055a1c 100644 --- a/docs/stylesheets/colors.css +++ b/docs/stylesheets/colors.css @@ -1,6 +1,31 @@ :root { - --md-primary-fg-color: #161616; - --md-accent-fg-color: #396A97; - --md-typeset-a-color: var(--md-accent-fg-color); + --md-primary-fg-color: #24404f; + --md-accent-fg-color: #122027; + --md-typeset-a-color: var(--md-accent-fg-color) !important; + --md-default-bg-color: #e5f2f8; + --md-code-bg-color: #2e3639 !important; + --md-code-hl-punctuation-color: #fff !important; +} + +.md-typeset code { + background-color: #2e3639; + color: #afafaf; +} + +.linenos { + background-color: #2e3639 !important; + color: #afafaf !important; +} + +.highlight .p { + color: #bbb; +} + +.highlight .o { + color: #afafaf; +} + +.highlight .n { + color: #afafaf; } diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 000000000..bb9c440a6 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,8 @@ +.md-header__source { + margin-left: 0px; + width: autho; + min-width: 9.6rem; +} +.code { + border-radius: 5px; +} From c69342ed6928cf3bcf046c3f6805d7b778398018 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Fri, 13 Aug 2021 04:00:28 +0300 Subject: [PATCH 44/51] added missing changes to README and mkdocs.yml --- README.md | 1 + mkdocs.yml | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9147b14eb..28b1f1e26 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Coverage Status Documentation Gitter +Open Collective

diff --git a/mkdocs.yml b/mkdocs.yml index adac457e4..968324c90 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,6 +16,7 @@ theme: logo: 'assets/favicon.svg' icon: repo: fontawesome/brands/github-square + custom_dir: docs/overrides markdown_extensions: - admonition @@ -61,5 +62,6 @@ extra: extra_css: - 'stylesheets/colors.css' - 'stylesheets/latofonts.css' + - 'stylesheets/extra.css' -copyright: 'Copyright © 2021 CrowCpp' +copyright: 'Copyright © 2020-2021 CrowCpp' From 6812d8073a7d7bcf48e5cd4b265478f93de1c2ca Mon Sep 17 00:00:00 2001 From: The-EDev Date: Fri, 13 Aug 2021 20:17:48 +0300 Subject: [PATCH 45/51] this would theoratically fix the bug in #184, but I'm not 100% sure it will.. --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index a649d5057..fa19175ed 100644 --- a/.drone.yml +++ b/.drone.yml @@ -15,7 +15,7 @@ steps: commands: - export DEBIAN_FRONTEND=noninteractive - - export TRAVIS_BRANCH=$DRONE_SOURCE_BRANCH + - export TRAVIS_BRANCH=$DRONE_BRANCH - export TRAVIS_JOB_ID=$DRONE_BUILD_NUMBER - apt-get -y update - apt-get -y install libboost-all-dev doxygen mkdocs graphviz zlib1g-dev gcc clang make cmake python3 python3-pip git From 239e21e3c6bf76f14864a3f234c33422ba1ae853 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Sat, 14 Aug 2021 01:54:10 +0300 Subject: [PATCH 46/51] fixed header icon white background --- docs/assets/header_icon.svg | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/docs/assets/header_icon.svg b/docs/assets/header_icon.svg index 0da85be15..f82df10fd 100644 --- a/docs/assets/header_icon.svg +++ b/docs/assets/header_icon.svg @@ -54,21 +54,14 @@ id="layer1" transform="translate(-55.42222,-82.637121)"> + id="path1009" + style="fill:#122027;fill-opacity:1;stroke-width:8.47412" + d="M 62 0 L 62 244.93359 L 62 489.86719 L 249.05273 489.86719 L 436.10547 489.86719 L 436.10547 302.15625 L 436.10547 114.44531 L 378.94141 57.222656 L 321.7793 0 L 191.88867 0 L 62 0 z M 228.81055 227.10352 L 246.87695 227.10352 L 246.87695 286.67383 C 251.17383 280.09831 256.2194 275.18294 262.01367 271.92773 C 267.87305 268.67253 274.61133 267.04492 282.22852 267.04492 C 294.79362 267.04492 304.29883 270.95117 310.74414 278.76367 C 317.18945 286.51107 320.41211 297.93685 320.41211 313.04102 L 320.41211 379.05664 L 302.44336 379.05664 L 302.44336 313.62695 C 302.44336 303.27539 300.42513 295.52799 296.38867 290.38477 C 292.35221 285.24154 286.29753 282.66992 278.22461 282.66992 C 268.52409 282.66992 260.87435 285.76237 255.27539 291.94727 C 249.67643 298.13216 246.87695 306.56315 246.87695 317.24023 L 246.87695 379.05664 L 228.81055 379.05664 L 228.81055 227.10352 z M 168.45898 354.25195 L 189.06445 354.25195 L 189.06445 379.05664 L 168.45898 379.05664 L 168.45898 354.25195 z " + transform="matrix(0.26458333,0,0,0.26458333,55.42222,82.637121)" /> - .h From 0f2b231448514ee5033bfa99d0c1dc22cac39d76 Mon Sep 17 00:00:00 2001 From: Himanshu Date: Sat, 14 Aug 2021 18:01:19 +0530 Subject: [PATCH 47/51] Update http_request.h CamelCase changed to snake_case --- include/crow/http_request.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/crow/http_request.h b/include/crow/http_request.h index eb7e902ba..fbd002669 100644 --- a/include/crow/http_request.h +++ b/include/crow/http_request.h @@ -31,7 +31,7 @@ namespace crow query_string url_params; ///< The parameters associated with the request. (everything after the `?`) ci_map headers; std::string body; - std::string remoteIpAddress; ///< The IP address from which the request was sent. + std::string remote_ip_address; ///< The IP address from which the request was sent. void* middleware_context{}; boost::asio::io_service* io_service{}; From 6ebea5ca776597c061dcefe3b2f3af92e1c650ff Mon Sep 17 00:00:00 2001 From: himanshu007-creator Date: Sat, 14 Aug 2021 18:58:23 +0530 Subject: [PATCH 48/51] remoteIpAddress --- include/crow/http_connection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/crow/http_connection.h b/include/crow/http_connection.h index 156b565e3..2300757fe 100644 --- a/include/crow/http_connection.h +++ b/include/crow/http_connection.h @@ -262,7 +262,7 @@ namespace crow req_ = std::move(parser_.to_request()); request& req = req_; - req.remoteIpAddress = adaptor_.remote_endpoint().address().to_string(); + req.remote_ip_address = adaptor_.remote_endpoint().address().to_string(); if (parser_.check_version(1, 0)) { From b21f3600c08ecbb13057cb2a4abeb6feca0726de Mon Sep 17 00:00:00 2001 From: The-EDev Date: Sun, 15 Aug 2021 03:04:05 +0300 Subject: [PATCH 49/51] replaced outline with border because chrome doesn't round outline --- docs/overrides/home.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/overrides/home.html b/docs/overrides/home.html index e15ac171c..0fabf55f1 100644 --- a/docs/overrides/home.html +++ b/docs/overrides/home.html @@ -12,9 +12,9 @@ } .ccard{ - outline-style: solid; - outline-width: .1rem; - outline-color: #00000080; + border-style: solid; + border-width: .1rem; + border-color: #00000080; border-radius: 0.5rem; width: 10rem; height: 12rem; From 17819e65719b5df6c75021354f7640a62fa3d665 Mon Sep 17 00:00:00 2001 From: The-EDev Date: Sun, 15 Aug 2021 15:28:26 +0300 Subject: [PATCH 50/51] Added middleware to automatically use utf-8 if no content-type is in the response --- include/crow/middlewares/utf-8.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 include/crow/middlewares/utf-8.h diff --git a/include/crow/middlewares/utf-8.h b/include/crow/middlewares/utf-8.h new file mode 100644 index 000000000..909c9a2de --- /dev/null +++ b/include/crow/middlewares/utf-8.h @@ -0,0 +1,27 @@ +#pragma once +#include "crow/http_request.h" +#include "crow/http_response.h" + +namespace crow +{ + + struct UTF8 + { + struct context + { + }; + + void before_handle(request& /*req*/, response& /*res*/, context& /*ctx*/) + { + } + + void after_handle(request& /*req*/, response& res, context& ctx) + { + if (get_header_value(res.headers, "Content-Type").empty()) + { + res.set_header("Content-Type", "text/plain; charset=utf-8"); + } + } + }; + +} From 80e4d3f88fb57eb50aebf21e121ba944afdc177a Mon Sep 17 00:00:00 2001 From: Lucas David Date: Mon, 16 Aug 2021 14:22:23 +0200 Subject: [PATCH 51/51] - Removed duplicated in example. --- examples/example_json_map.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/examples/example_json_map.cpp b/examples/example_json_map.cpp index 8bf5257f2..043035146 100644 --- a/examples/example_json_map.cpp +++ b/examples/example_json_map.cpp @@ -33,25 +33,6 @@ CROW_ROUTE(app, "/json-initializer-list-constructor") }); }); -CROW_ROUTE(app, "/json-map-constructor") -([] { - crow::json::wvalue::object_type map({ - {"first", "Hello world!"}, /* stores a char const* hence a type::String */ - {"second", "How are you today?"}, /* stores a char const* hence a std::int64_t. */ - {"third", 54}, /* stores an int (as 54 is an int literal) hence a std::int64_t. */ - {"fourth", 54l}, /* stores a long (as 54l is a long literal) hence a std::int64_t. */ - {"fifth", 54u}, /* stores an unsigned int (as 54u is a unsigned int literal) hence a std::uint64_t. */ - {"sixth", 54ul}, /* stores an unsigned long (as 54ul is an unsigned long literal) hence a std::uint64_t. */ - {"seventh", 2.f}, /* stores a float (as 2.f is a float literal) hence a double. */ - {"eighth", 2.}, /* stores a double (as 2. is a double literal) hence a double. */ - {"ninth", nullptr}, /* stores a std::nullptr hence type::Null . */ - {"tenth", true} /* stores a bool hence type::True . */ - }); - - return crow::json::wvalue(map); -}); - - // enables all log app.loglevel(crow::LogLevel::Debug);