From 70760d077b82301fda97bb4a86de097ed6bdcd0c Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Fri, 8 May 2026 18:46:14 +0500 Subject: [PATCH 01/38] Add baseline11 --- frameworks/web-framework-cpp/Dockerfile | 18 ++++++ frameworks/web-framework-cpp/meta.json | 11 ++++ .../web-framework-benchmark/.gitignore | 3 + .../web-framework-benchmark/CMakeLists.txt | 27 ++++++++ .../executors/CMakeLists.txt | 21 +++++++ .../executors/include/Baseline11.hpp | 17 ++++++ .../executors/src/Baseline11.cpp | 61 +++++++++++++++++++ .../executors/web.json | 7 +++ .../server/CMakeLists.txt | 16 +++++ .../server/config.json | 22 +++++++ .../web-framework-benchmark/server/server.cpp | 22 +++++++ 11 files changed, 225 insertions(+) create mode 100644 frameworks/web-framework-cpp/Dockerfile create mode 100644 frameworks/web-framework-cpp/meta.json create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/.gitignore create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Baseline11.hpp create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/server/CMakeLists.txt create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/server/config.json create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/server/server.cpp diff --git a/frameworks/web-framework-cpp/Dockerfile b/frameworks/web-framework-cpp/Dockerfile new file mode 100644 index 00000000..f9d4644a --- /dev/null +++ b/frameworks/web-framework-cpp/Dockerfile @@ -0,0 +1,18 @@ +FROM ubuntu:26.04 AS build + +RUN apt update +RUN apt install -y uuid-dev cmake gcc g++ git unzip zip wget ninja-build + +WORKDIR /app + +COPY . . + +RUN mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=bin -DCMAKE_CXX_FLAGS="-march=native" -DCMAKE_C_FLAGS="-march=native" -G "Ninja" .. && cmake --build . -j && cmake --install . + +FROM ubuntu:26.04 + +ENV LD_LIBRARY_PATH=/app + +COPY --from=build /app/build/bin /app + +CMD ["/app/server"] diff --git a/frameworks/web-framework-cpp/meta.json b/frameworks/web-framework-cpp/meta.json new file mode 100644 index 00000000..9489f606 --- /dev/null +++ b/frameworks/web-framework-cpp/meta.json @@ -0,0 +1,11 @@ +{ + "display_name": "WebFramework C++", + "language": "C++", + "engine": "WebFramework", + "type": "production", + "description": "Web framework in C++ with different language APIs(Python, C, C++, C#)", + "repo": "https://github.com/LazyPanda07/WebFramework", + "enabled": true, + "tests": [ "baseline" ], + "maintainers": "LazyPanda07" +} \ No newline at end of file diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/.gitignore b/frameworks/web-framework-cpp/web-framework-benchmark/.gitignore new file mode 100644 index 00000000..7ddb7100 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/.gitignore @@ -0,0 +1,3 @@ +# Binaries +out/ +build/ diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt new file mode 100644 index 00000000..41dac56c --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 4.0.0) + +set(CMAKE_CXX_STANDARD 23) + +set(AS_DEPENDENCY ON) +set(WITH_PYTHON_EXECUTORS OFF) +set(WITH_DOTNET_EXECUTORS OFF) +set(BUILD_CC_API OFF) +set(BUILD_PYTHON_API OFF) +set(BUILD_CSHARP_API OFF) + +set(WEB_FRAMEWORK_VERSION 3.4.0) + +project(web_framework_benchmark) + +include(FetchContent) + +FetchContent_Declare( + WebFramework + GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework + GIT_TAG v${WEB_FRAMEWORK_VERSION} +) + +FetchContent_MakeAvailable(WebFramework) + +add_subdirectory(server) +add_subdirectory(executors) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt new file mode 100644 index 00000000..d8830580 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 4.0.0) + +project(executors) + +add_library( + ${PROJECT_NAME} SHARED + src/Baseline11.cpp +) + +target_include_directories( + ${PROJECT_NAME} PRIVATE + include +) + +target_link_libraries( + ${PROJECT_NAME} PRIVATE + CXX_API +) + +install(TARGETS ${PROJECT_NAME} DESTINATION .) +install(FILES web.json DESTINATION .) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Baseline11.hpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Baseline11.hpp new file mode 100644 index 00000000..d5cdb795 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Baseline11.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace executor +{ + class Baseline11 : public framework::StatelessExecutor + { + private: + static void parseValues(framework::HttpRequest& request, int& a, int& b); + + public: + void doGet(framework::HttpRequest& request, framework::HttpResponse& response) override; + + void doPost(framework::HttpRequest& request, framework::HttpResponse& response) override; + }; +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp new file mode 100644 index 00000000..7a8454d7 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp @@ -0,0 +1,61 @@ +#include "Baseline11.hpp" + +#include + +namespace executor +{ + void Baseline11::parseValues(framework::HttpRequest& request, int& a, int& b) + { + const std::unordered_map& queryParameters = request.getQueryParameters(); + + { + const std::string& temp = queryParameters.at("a"); + + std::from_chars(temp.data(), temp.data() + temp.size(), a); + } + + { + const std::string& temp = queryParameters.at("b"); + + std::from_chars(temp.data(), temp.data() + temp.size(), b); + } + } + + void Baseline11::doGet(framework::HttpRequest& request, framework::HttpResponse& response) + { + int a; + int b; + + Baseline11::parseValues(request, a, b); + + response.setBody(std::to_string(a + b)); + } + + void Baseline11::doPost(framework::HttpRequest& request, framework::HttpResponse& response) + { + const framework::HttpRequest::HeadersMap& headers = request.getHeaders(); + + int a; + int b; + int c; + + Baseline11::parseValues(request, a, b); + + if (headers.contains("Transfer-Encoding")) + { + std::string_view chunk = request.getChunks()[0]; + + std::from_chars(chunk.data(), chunk.data() + chunk.size(), c); + } + else + { + std::string_view body = request.getBody(); + + std::from_chars(body.data(), body.data() + body.size(), c); + } + + response.setBody(std::to_string(a + b + c)); + } + + DEFINE_EXECUTOR(Baseline11); +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json b/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json new file mode 100644 index 00000000..ac486133 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json @@ -0,0 +1,7 @@ +{ + "Baseline11": { + "api": "cxx", + "loadType": "initialization", + "route": "baseline11" + } +} \ No newline at end of file diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/server/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/server/CMakeLists.txt new file mode 100644 index 00000000..2a8c55d0 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/server/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 4.0.0) + +project(server) + +add_executable( + ${PROJECT_NAME} + server.cpp +) + +target_link_libraries( + ${PROJECT_NAME} PRIVATE + CXX_API +) + +install(TARGETS ${PROJECT_NAME} DESTINATION .) +install(FILES config.json DESTINATION .) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json b/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json new file mode 100644 index 00000000..3d8939b0 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json @@ -0,0 +1,22 @@ +{ + "WebServer": { + "ip": "127.0.0.1", + "port": 8080, + "timeout": 30000 + }, + "WebFramework": { + "assetsPath": "assets", + "templatesPath": "templates", + "webServerType": "threadPool", + "settingsPaths": [ "web.json" ], + "loadSources": [ "executors" ], + "HTTPS": { + "pathToCertificate": "certs/server.crt", + "pathToKey": "/certs/server.key", + "useHTTPS": false + } + }, + "ThreadPoolServer": { + "threadCount": 8 + } +} \ No newline at end of file diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/server/server.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/server/server.cpp new file mode 100644 index 00000000..88387798 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/server/server.cpp @@ -0,0 +1,22 @@ +#include + +#include + +int main(int argc, char** argv) try +{ + framework::utility::initializeWebFramework(); + + framework::utility::Config config("config.json"); + + framework::WebFramework server(config); + + server.start(true, []() { std::cout << "Server is running..." << std::endl; }); + + return 0; +} +catch (const std::exception& e) +{ + std::cerr << e.what() << std::endl; + + return 1; +} From ff349ce70da205b6b91b3865cc4f2a8f49c695ce Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Fri, 8 May 2026 19:32:54 +0500 Subject: [PATCH 02/38] Fix Dockerfile --- frameworks/web-framework-cpp/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/web-framework-cpp/Dockerfile b/frameworks/web-framework-cpp/Dockerfile index f9d4644a..3bed0a35 100644 --- a/frameworks/web-framework-cpp/Dockerfile +++ b/frameworks/web-framework-cpp/Dockerfile @@ -3,9 +3,9 @@ FROM ubuntu:26.04 AS build RUN apt update RUN apt install -y uuid-dev cmake gcc g++ git unzip zip wget ninja-build -WORKDIR /app +COPY web-framework-benchmark/ /app -COPY . . +WORKDIR /app RUN mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=bin -DCMAKE_CXX_FLAGS="-march=native" -DCMAKE_C_FLAGS="-march=native" -G "Ninja" .. && cmake --build . -j && cmake --install . From 8f619f2d87ee4b5d1cddcba498c0d0a3c3763784 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Fri, 8 May 2026 20:12:35 +0500 Subject: [PATCH 03/38] Fixes --- frameworks/web-framework-cpp/Dockerfile | 2 ++ .../web-framework-benchmark/executors/src/Baseline11.cpp | 2 ++ .../web-framework-benchmark/server/config.json | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/frameworks/web-framework-cpp/Dockerfile b/frameworks/web-framework-cpp/Dockerfile index 3bed0a35..195bb98d 100644 --- a/frameworks/web-framework-cpp/Dockerfile +++ b/frameworks/web-framework-cpp/Dockerfile @@ -15,4 +15,6 @@ ENV LD_LIBRARY_PATH=/app COPY --from=build /app/build/bin /app +WORKDIR /app + CMD ["/app/server"] diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp index 7a8454d7..99958c68 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp @@ -28,6 +28,7 @@ namespace executor Baseline11::parseValues(request, a, b); + response.addHeader("Content-Type", "text/plain"); response.setBody(std::to_string(a + b)); } @@ -54,6 +55,7 @@ namespace executor std::from_chars(body.data(), body.data() + body.size(), c); } + response.addHeader("Content-Type", "text/plain"); response.setBody(std::to_string(a + b + c)); } diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json b/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json index 3d8939b0..31680e5b 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json +++ b/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json @@ -1,6 +1,6 @@ { "WebServer": { - "ip": "127.0.0.1", + "ip": "0.0.0.0", "port": 8080, "timeout": 30000 }, @@ -11,7 +11,7 @@ "settingsPaths": [ "web.json" ], "loadSources": [ "executors" ], "HTTPS": { - "pathToCertificate": "certs/server.crt", + "pathToCertificate": "/certs/server.crt", "pathToKey": "/certs/server.key", "useHTTPS": false } From 146eb4bb6d8253ccae2390e911c246dab80bb94c Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 00:20:33 +0500 Subject: [PATCH 04/38] Add json test profile --- frameworks/web-framework-cpp/meta.json | 2 +- .../executors/CMakeLists.txt | 1 + .../executors/include/JsonExecutor.hpp | 18 ++++++++ .../executors/src/JsonExecutor.cpp | 41 +++++++++++++++++++ .../executors/web.json | 5 +++ .../server/config.json | 2 +- 6 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/include/JsonExecutor.hpp create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/src/JsonExecutor.cpp diff --git a/frameworks/web-framework-cpp/meta.json b/frameworks/web-framework-cpp/meta.json index 9489f606..5fdd59ae 100644 --- a/frameworks/web-framework-cpp/meta.json +++ b/frameworks/web-framework-cpp/meta.json @@ -6,6 +6,6 @@ "description": "Web framework in C++ with different language APIs(Python, C, C++, C#)", "repo": "https://github.com/LazyPanda07/WebFramework", "enabled": true, - "tests": [ "baseline" ], + "tests": [ "baseline", "json" ], "maintainers": "LazyPanda07" } \ No newline at end of file diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt index d8830580..b856089f 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt @@ -5,6 +5,7 @@ project(executors) add_library( ${PROJECT_NAME} SHARED src/Baseline11.cpp + src/JsonExecutor.cpp ) target_include_directories( diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/JsonExecutor.hpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/JsonExecutor.hpp new file mode 100644 index 00000000..65e017f3 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/JsonExecutor.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include + +namespace executor +{ + class JsonExecutor : public framework::StatelessExecutor + { + private: + framework::JsonObject dataset; + std::vector items; + + public: + void init(const framework::utility::ExecutorSettings& settings) override; + + void doGet(framework::HttpRequest& request, framework::HttpResponse& response) override; + }; +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/JsonExecutor.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/JsonExecutor.cpp new file mode 100644 index 00000000..aad0232d --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/JsonExecutor.cpp @@ -0,0 +1,41 @@ +#include "JsonExecutor.hpp" + +#include + +namespace executor +{ + void JsonExecutor::init(const framework::utility::ExecutorSettings& settings) + { + dataset = framework::JsonParser(settings.getFile("dataset.json")).getParsedData(true); + items = dataset.get>(); + } + + void JsonExecutor::doGet(framework::HttpRequest& request, framework::HttpResponse& response) + { + const std::string& queryParameter = request.getQueryParameters().at("m"); + int count = request.getRouteParameter("count"); + int multiplier; + framework::JsonBuilder result; + std::vector resultItems; + + resultItems.reserve(count); + + std::from_chars(queryParameter.data(), queryParameter.data() + queryParameter.size(), multiplier); + + for (int i = 0; i < count; i++) + { + framework::JsonObject temp(items[i]); + + temp["total"] = temp["price"].get() * temp["quantity"].get() * multiplier; + + resultItems.emplace_back(std::move(temp)); + } + + result["count"] = count; + result["items"] = std::move(resultItems); + + response.setBody(result); + } + + DEFINE_EXECUTOR(JsonExecutor) +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json b/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json index ac486133..7ea4c08f 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json @@ -3,5 +3,10 @@ "api": "cxx", "loadType": "initialization", "route": "baseline11" + }, + "JsonExecutor": { + "api": "cxx", + "loadType": "initialization", + "route": "json/{int:count}" } } \ No newline at end of file diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json b/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json index 31680e5b..76c231fe 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json +++ b/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json @@ -5,7 +5,7 @@ "timeout": 30000 }, "WebFramework": { - "assetsPath": "assets", + "assetsPath": "/data", "templatesPath": "templates", "webServerType": "threadPool", "settingsPaths": [ "web.json" ], From 8c3c0b6a5385d02b4b5ba75029906a33cfc5305c Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 01:06:19 +0500 Subject: [PATCH 05/38] Refactor --- frameworks/web-framework-cpp/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/web-framework-cpp/Dockerfile b/frameworks/web-framework-cpp/Dockerfile index 195bb98d..601aaa5e 100644 --- a/frameworks/web-framework-cpp/Dockerfile +++ b/frameworks/web-framework-cpp/Dockerfile @@ -17,4 +17,4 @@ COPY --from=build /app/build/bin /app WORKDIR /app -CMD ["/app/server"] +CMD ["./server"] From 31cc08dc03d447eae5b59beabed8d01daa3d0b85 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 02:44:15 +0500 Subject: [PATCH 06/38] Add pipelined, limited-conn, upload, static test profiles --- frameworks/web-framework-cpp/meta.json | 2 +- .../executors/CMakeLists.txt | 3 ++ .../executors/include/Pipeline.hpp | 12 +++++ .../executors/include/Static.hpp | 12 +++++ .../executors/include/Upload.hpp | 19 ++++++++ .../executors/src/JsonExecutor.cpp | 2 +- .../executors/src/Pipeline.cpp | 14 ++++++ .../executors/src/Static.cpp | 30 +++++++++++++ .../executors/src/Upload.cpp | 45 +++++++++++++++++++ .../executors/web.json | 15 +++++++ .../server/config.json | 5 ++- .../web-framework-benchmark/server/server.cpp | 14 ++++++ 12 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Pipeline.hpp create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Static.hpp create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Upload.hpp create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Pipeline.cpp create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Upload.cpp diff --git a/frameworks/web-framework-cpp/meta.json b/frameworks/web-framework-cpp/meta.json index 5fdd59ae..4f63457f 100644 --- a/frameworks/web-framework-cpp/meta.json +++ b/frameworks/web-framework-cpp/meta.json @@ -6,6 +6,6 @@ "description": "Web framework in C++ with different language APIs(Python, C, C++, C#)", "repo": "https://github.com/LazyPanda07/WebFramework", "enabled": true, - "tests": [ "baseline", "json" ], + "tests": [ "baseline", "limited-conn", "pipelined", "json", "upload", "static" ], "maintainers": "LazyPanda07" } \ No newline at end of file diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt index b856089f..38d0d34d 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt @@ -6,6 +6,9 @@ add_library( ${PROJECT_NAME} SHARED src/Baseline11.cpp src/JsonExecutor.cpp + src/Pipeline.cpp + src/Upload.cpp + src/Static.cpp ) target_include_directories( diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Pipeline.hpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Pipeline.hpp new file mode 100644 index 00000000..d0ef61b4 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Pipeline.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace executor +{ + class Pipeline : public framework::StatelessExecutor + { + public: + void doGet(framework::HttpRequest& request, framework::HttpResponse& response) override; + }; +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Static.hpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Static.hpp new file mode 100644 index 00000000..b77be01c --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Static.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace executor +{ + class Static : public framework::HeavyOperationStatelessExecutor + { + public: + void doGet(framework::HttpRequest& request, framework::HttpResponse& response) override; + }; +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Upload.hpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Upload.hpp new file mode 100644 index 00000000..ec22f1fd --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Upload.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace executor +{ + class Upload : public framework::HeavyOperationStatelessExecutor + { + private: + size_t currentSize; + + public: + Upload(); + + void doPost(framework::HttpRequest& request, framework::HttpResponse& response) override; + + ~Upload() = default; + }; +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/JsonExecutor.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/JsonExecutor.cpp index aad0232d..2ee6db77 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/JsonExecutor.cpp +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/JsonExecutor.cpp @@ -37,5 +37,5 @@ namespace executor response.setBody(result); } - DEFINE_EXECUTOR(JsonExecutor) + DEFINE_EXECUTOR(JsonExecutor); } diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Pipeline.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Pipeline.cpp new file mode 100644 index 00000000..a996a86c --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Pipeline.cpp @@ -0,0 +1,14 @@ +#include "Pipeline.hpp" + +namespace executor +{ + void Pipeline::doGet(framework::HttpRequest& request, framework::HttpResponse& response) + { + constexpr std::string_view okResponse = "ok"; + + response.addHeader("Content-Type", "text/plain"); + response.setBody(okResponse); + } + + DEFINE_EXECUTOR(Pipeline); +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp new file mode 100644 index 00000000..c1d459c1 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp @@ -0,0 +1,30 @@ +#include "Static.hpp" + +#include +#include + +namespace executor +{ + void Static::doGet(framework::HttpRequest& request, framework::HttpResponse& response) + { + constexpr std::array, 7> contentTypes = + { + std::make_pair(".css", "text/css"), + std::make_pair(".js", "application/javascript"), + std::make_pair(".html", "text/html"), + std::make_pair(".woff2", "font/woff2"), + std::make_pair(".svg", "image/svg+xml"), + std::make_pair(".webp", "image/webp"), + std::make_pair(".json", "application/json") + }; + + std::filesystem::path filePath = "static/" + request.getRouteParameter("filePath"); + std::string extension = filePath.extension().string(); + std::string_view contentType = std::ranges::find_if(contentTypes, [&extension](const std::pair& contentType) { return contentType.first == extension; })->second; + + response.addHeader("Content-Type", contentType); + request.sendAssetFile(filePath.string(), response); + } + + DEFINE_EXECUTOR(Static); +}; diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Upload.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Upload.cpp new file mode 100644 index 00000000..880809b5 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Upload.cpp @@ -0,0 +1,45 @@ +#include "Upload.hpp" + +#include + +namespace executor +{ + Upload::Upload() : + currentSize(0) + { + + } + + void Upload::doPost(framework::HttpRequest& request, framework::HttpResponse& response) + { + constexpr size_t thresholdSize = 5242880; + + const framework::HttpRequest::HeadersMap& headers = request.getHeaders(); + const std::string& temp = headers.at("Content-Length"); + size_t contentLength; + + std::from_chars(temp.data(), temp.data() + temp.size(), contentLength); + + if (contentLength >= thresholdSize) + { + const auto& [dataPart, isLastPacket] = request.getLargeData(); + + currentSize += dataPart.size(); + + if (isLastPacket) + { + response.addHeader("Content-Type", "text/plain"); + response.setBody(std::to_string(currentSize)); + } + } + else + { + currentSize = request.getBody().size(); + + response.addHeader("Content-Type", "text/plain"); + response.setBody(std::to_string(currentSize)); + } + } + + DEFINE_EXECUTOR(Upload); +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json b/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json index 7ea4c08f..4d6b1f31 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json @@ -8,5 +8,20 @@ "api": "cxx", "loadType": "initialization", "route": "json/{int:count}" + }, + "Pipeline": { + "api": "cxx", + "loadType": "initialization", + "route": "pipeline" + }, + "Upload": { + "api": "cxx", + "loadType": "dynamic", + "route": "upload" + }, + "Static": { + "api": "cxx", + "loadType": "initialization", + "route": "static/{string:filePath}" } } \ No newline at end of file diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json b/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json index 76c231fe..da629be7 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json +++ b/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json @@ -14,7 +14,10 @@ "pathToCertificate": "/certs/server.crt", "pathToKey": "/certs/server.key", "useHTTPS": false - } + }, + "resourcesThreads": 8, + "largeBodySizeThreshold": 5242880, + "largeBodyPacketSize": 1048576 }, "ThreadPoolServer": { "threadCount": 8 diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/server/server.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/server/server.cpp index 88387798..7b280128 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/server/server.cpp +++ b/frameworks/web-framework-cpp/web-framework-benchmark/server/server.cpp @@ -1,4 +1,5 @@ #include +#include #include @@ -8,6 +9,19 @@ int main(int argc, char** argv) try framework::utility::Config config("config.json"); + if (const char* ptr = std::getenv("THREADS")) + { + if (int value = std::stoi(ptr); value > 8) + { + config.overrideConfiguration("threadCount", value - 8); + } + } + + if (const char* ptr = std::getenv("H2THREADS")) + { + // TODO: HTTP/2.0 + } + framework::WebFramework server(config); server.start(true, []() { std::cout << "Server is running..." << std::endl; }); From f483806b62c3dacf5af123ac1b3ca065dd4c5383 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 02:54:14 +0500 Subject: [PATCH 07/38] Fixes --- .../web-framework-benchmark/executors/include/Upload.hpp | 4 ++-- .../web-framework-benchmark/executors/src/Static.cpp | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Upload.hpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Upload.hpp index ec22f1fd..fe33ec62 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Upload.hpp +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Upload.hpp @@ -1,10 +1,10 @@ #pragma once -#include +#include namespace executor { - class Upload : public framework::HeavyOperationStatelessExecutor + class Upload : public framework::HeavyOperationStatefulExecutor { private: size_t currentSize; diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp index c1d459c1..0cb9dba5 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp @@ -7,7 +7,7 @@ namespace executor { void Static::doGet(framework::HttpRequest& request, framework::HttpResponse& response) { - constexpr std::array, 7> contentTypes = + constexpr std::array, 8> contentTypes = { std::make_pair(".css", "text/css"), std::make_pair(".js", "application/javascript"), @@ -15,7 +15,8 @@ namespace executor std::make_pair(".woff2", "font/woff2"), std::make_pair(".svg", "image/svg+xml"), std::make_pair(".webp", "image/webp"), - std::make_pair(".json", "application/json") + std::make_pair(".json", "application/json"), + std::make_pair(".txt", "text/plain") }; std::filesystem::path filePath = "static/" + request.getRouteParameter("filePath"); From 87cf255b5ed7fca49cd89f59a9f9d60d5a93f495 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 04:21:19 +0500 Subject: [PATCH 08/38] Add echo-ws test profile --- frameworks/web-framework-cpp/meta.json | 2 +- .../web-framework-benchmark/CMakeLists.txt | 3 +- .../executors/CMakeLists.txt | 1 + .../executors/include/Ws.hpp | 19 ++++++++++ .../executors/src/Ws.cpp | 38 +++++++++++++++++++ .../executors/web.json | 6 +++ 6 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Ws.hpp create mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Ws.cpp diff --git a/frameworks/web-framework-cpp/meta.json b/frameworks/web-framework-cpp/meta.json index 4f63457f..70a02cbc 100644 --- a/frameworks/web-framework-cpp/meta.json +++ b/frameworks/web-framework-cpp/meta.json @@ -6,6 +6,6 @@ "description": "Web framework in C++ with different language APIs(Python, C, C++, C#)", "repo": "https://github.com/LazyPanda07/WebFramework", "enabled": true, - "tests": [ "baseline", "limited-conn", "pipelined", "json", "upload", "static" ], + "tests": [ "baseline", "limited-conn", "pipelined", "json", "upload", "static", "echo-ws" ], "maintainers": "LazyPanda07" } \ No newline at end of file diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt index 41dac56c..96043ff0 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt @@ -18,7 +18,8 @@ include(FetchContent) FetchContent_Declare( WebFramework GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework - GIT_TAG v${WEB_FRAMEWORK_VERSION} + # GIT_TAG v${WEB_FRAMEWORK_VERSION} + GIT_TAG dev ) FetchContent_MakeAvailable(WebFramework) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt index 38d0d34d..8f5a6449 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt @@ -9,6 +9,7 @@ add_library( src/Pipeline.cpp src/Upload.cpp src/Static.cpp + src/Ws.cpp ) target_include_directories( diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Ws.hpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Ws.hpp new file mode 100644 index 00000000..7ca522e8 --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Ws.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +namespace executor +{ + class Ws : public framework::StatelessExecutor + { + public: + void doGet(framework::HttpRequest& request, framework::HttpResponse& response) override; + }; + + class WebSocketEcho : public framework::WebSocketExecutor + { + public: + std::optional>> onReceive(const framework::WebSocketExecutor::Frame& frame, std::optional& close) override; + }; +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Ws.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Ws.cpp new file mode 100644 index 00000000..686e6eab --- /dev/null +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Ws.cpp @@ -0,0 +1,38 @@ +#include "Ws.hpp" + +namespace executor +{ + void Ws::doGet(framework::HttpRequest& request, framework::HttpResponse& response) + { + response.setResponseCode(framework::ResponseCodes::badRequest); + } + + std::optional>> WebSocketEcho::onReceive(const framework::WebSocketExecutor::Frame& frame, std::optional& close) + { + switch (frame.getType()) + { + case framework::WebSocketExecutor::Frame::Type::text: + return std::string(frame.getPayload()); + + case framework::WebSocketExecutor::Frame::Type::binary: + { + std::span payload = frame.getPayload>(); + + return std::vector(payload.begin(), payload.end()); + } + + case framework::WebSocketExecutor::Frame::Type::close: + close.emplace(framework::WebSocketExecutor::Frame::Close::Code::normalClosure, "validate done"); + + return std::nullopt; + + default: + break; + } + + return std::nullopt; + } + + DEFINE_EXECUTOR(Ws); + DEFINE_WEB_SOCKET_EXECUTOR(WebSocketEcho); +} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json b/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json index 4d6b1f31..78151d55 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json @@ -23,5 +23,11 @@ "api": "cxx", "loadType": "initialization", "route": "static/{string:filePath}" + }, + "Ws": { + "api": "cxx", + "loadType": "initialization", + "route": "ws", + "webSocketExecutorName": "WebSocketEcho" } } \ No newline at end of file From f07f9bff6f247661825f8f5a424c748e7328cd61 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 20:41:13 +0500 Subject: [PATCH 09/38] Add web-framework-python --- frameworks/web-framework-cpp/Dockerfile | 4 +- .../web-framework-benchmark/CMakeLists.txt | 5 +- frameworks/web-framework-python/Dockerfile | 24 ++++++++ frameworks/web-framework-python/meta.json | 11 ++++ .../web-framework-benchmark/.gitignore | 3 + .../web-framework-benchmark/CMakeLists.txt | 33 ++++++++++ .../executors/CMakeLists.txt | 6 ++ .../executors/app/Baseline11.py | 27 +++++++++ .../executors/app/JsonExecutor.py | 31 ++++++++++ .../executors/app/Pipeline.py | 6 ++ .../executors/app/Upload.py | 22 +++++++ .../executors/app/Ws.py | 60 +++++++++++++++++++ .../executors/web.json | 28 +++++++++ .../server/CMakeLists.txt | 6 ++ .../server/config.json | 33 ++++++++++ .../web-framework-benchmark/server/server.py | 31 ++++++++++ 16 files changed, 326 insertions(+), 4 deletions(-) create mode 100644 frameworks/web-framework-python/Dockerfile create mode 100644 frameworks/web-framework-python/meta.json create mode 100644 frameworks/web-framework-python/web-framework-benchmark/.gitignore create mode 100644 frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt create mode 100644 frameworks/web-framework-python/web-framework-benchmark/executors/CMakeLists.txt create mode 100644 frameworks/web-framework-python/web-framework-benchmark/executors/app/Baseline11.py create mode 100644 frameworks/web-framework-python/web-framework-benchmark/executors/app/JsonExecutor.py create mode 100644 frameworks/web-framework-python/web-framework-benchmark/executors/app/Pipeline.py create mode 100644 frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py create mode 100644 frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py create mode 100644 frameworks/web-framework-python/web-framework-benchmark/executors/web.json create mode 100644 frameworks/web-framework-python/web-framework-benchmark/server/CMakeLists.txt create mode 100644 frameworks/web-framework-python/web-framework-benchmark/server/config.json create mode 100644 frameworks/web-framework-python/web-framework-benchmark/server/server.py diff --git a/frameworks/web-framework-cpp/Dockerfile b/frameworks/web-framework-cpp/Dockerfile index 601aaa5e..9139d80c 100644 --- a/frameworks/web-framework-cpp/Dockerfile +++ b/frameworks/web-framework-cpp/Dockerfile @@ -17,4 +17,6 @@ COPY --from=build /app/build/bin /app WORKDIR /app -CMD ["./server"] +RUN python3 -m pip install WebFramework/api/python/dist/*.whl + +CMD ["python3 -u server"] diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt index 96043ff0..ceb7eeaa 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt @@ -9,7 +9,7 @@ set(BUILD_CC_API OFF) set(BUILD_PYTHON_API OFF) set(BUILD_CSHARP_API OFF) -set(WEB_FRAMEWORK_VERSION 3.4.0) +set(WEB_FRAMEWORK_VERSION 3.4.1) project(web_framework_benchmark) @@ -18,8 +18,7 @@ include(FetchContent) FetchContent_Declare( WebFramework GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework - # GIT_TAG v${WEB_FRAMEWORK_VERSION} - GIT_TAG dev + GIT_TAG v${WEB_FRAMEWORK_VERSION} ) FetchContent_MakeAvailable(WebFramework) diff --git a/frameworks/web-framework-python/Dockerfile b/frameworks/web-framework-python/Dockerfile new file mode 100644 index 00000000..da7b1160 --- /dev/null +++ b/frameworks/web-framework-python/Dockerfile @@ -0,0 +1,24 @@ +FROM ubuntu:26.04 AS build + +RUN apt update +RUN apt install -y uuid-dev cmake gcc g++ git unzip zip wget ninja-build python3 python3-venv python3-pip +RUN python3 -m pip install build + +COPY web-framework-benchmark/ /app + +WORKDIR /app + +RUN mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=bin -DCMAKE_CXX_FLAGS="-march=native" -DCMAKE_C_FLAGS="-march=native" -G "Ninja" .. && cmake --build . -j && cmake --install . + +FROM ubuntu:26.04 + +ENV LD_LIBRARY_PATH=/app + +RUN apt update +RUN apt install -y python3 python3-pip + +COPY --from=build /app/build/bin /app + +WORKDIR /app + +CMD ["./server"] diff --git a/frameworks/web-framework-python/meta.json b/frameworks/web-framework-python/meta.json new file mode 100644 index 00000000..70a02cbc --- /dev/null +++ b/frameworks/web-framework-python/meta.json @@ -0,0 +1,11 @@ +{ + "display_name": "WebFramework C++", + "language": "C++", + "engine": "WebFramework", + "type": "production", + "description": "Web framework in C++ with different language APIs(Python, C, C++, C#)", + "repo": "https://github.com/LazyPanda07/WebFramework", + "enabled": true, + "tests": [ "baseline", "limited-conn", "pipelined", "json", "upload", "static", "echo-ws" ], + "maintainers": "LazyPanda07" +} \ No newline at end of file diff --git a/frameworks/web-framework-python/web-framework-benchmark/.gitignore b/frameworks/web-framework-python/web-framework-benchmark/.gitignore new file mode 100644 index 00000000..7ddb7100 --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/.gitignore @@ -0,0 +1,3 @@ +# Binaries +out/ +build/ diff --git a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt new file mode 100644 index 00000000..3b98b879 --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 4.0.0) + +set(WEB_FRAMEWORK_VERSION 3.4.1) + +project(web_framework_benchmark) + +include(FetchContent) + +FetchContent_Declare( + WebFramework + GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework + GIT_TAG dev +) + +FetchContent_MakeAvailable(WebFramework) + +execute_process( + COMMAND cmake -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DWITH_PYTHON_EXECUTORS=ON -DWITH_DOTNET_EXECUTORS=OFF -DBUILD_PYTHON_API=ON -DBUILD_CC_API=OFF -DBUILD_CXX_API=OFF -DBUILD_CSHARP_API=OFF -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}/WebFramework -G "Ninja" . + WORKING_DIRECTORY ${webframework_SOURCE_DIR} +) + +execute_process( + COMMAND cmake --build . -j + WORKING_DIRECTORY ${webframework_SOURCE_DIR} +) + +execute_process( + COMMAND cmake --install . + WORKING_DIRECTORY ${webframework_SOURCE_DIR} +) + +add_subdirectory(server) +add_subdirectory(executors) diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/CMakeLists.txt b/frameworks/web-framework-python/web-framework-benchmark/executors/CMakeLists.txt new file mode 100644 index 00000000..ae6d9a15 --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 4.0.0) + +project(executors) + +install(DIRECTORY app DESTINATION .) +install(FILES web.json DESTINATION .) diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Baseline11.py b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Baseline11.py new file mode 100644 index 00000000..3688f18f --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Baseline11.py @@ -0,0 +1,27 @@ +from typing import Tuple + +from web_framework_api import StatelessExecutor, HttpRequest + + +class Baseline11(StatelessExecutor): + @staticmethod + def _parse_values(request: HttpRequest) -> Tuple[int, int]: + query_parameters = request.get_query_parameters() + + return int(query_parameters["a"]), int(query_parameters["b"]) + + def do_get(self, request, response): + a, b = Baseline11._parse_values(request) + + response.set_body(f"{a + b}") + + def do_post(self, request, response): + a, b = Baseline11._parse_values(request) + headers = request.get_headers() + + if "Transfer-Encoding" in headers: + c = int(request.get_chunks()[0]) + else: + c = int(request.get_body()) + + response.set_body(f"{a + b + c}") diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/JsonExecutor.py b/frameworks/web-framework-python/web-framework-benchmark/executors/app/JsonExecutor.py new file mode 100644 index 00000000..52abc2ed --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/app/JsonExecutor.py @@ -0,0 +1,31 @@ +import json +import copy + +from typing import Any, Dict + +from web_framework_api.web_framework_api import StatelessExecutor + + +class JsonExecutor(StatelessExecutor): + def __init__(self): + super().__init__() + + self._items = None + + def init(self, settings): + self._items = json.loads(settings.get_file("dataset.json")) + + def do_get(self, request, response): + multiplier = int(request.get_query_parameters()["m"]) + count = request.get_int_route_parameter("count") + result: Dict[str, Any] = dict() + + for i in range(count): + item: Dict[str, Any] = self._items[i] + temp: Dict[str, Any] = copy.deepcopy(item) + + temp["total"] = int(temp["price"]) * int(temp["quantity"]) * multiplier + + result["items"] = temp + + response.set_body(result) diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Pipeline.py b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Pipeline.py new file mode 100644 index 00000000..f92cecea --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Pipeline.py @@ -0,0 +1,6 @@ +from web_framework_api import StatelessExecutor + + +class Pipeline(StatelessExecutor): + def do_get(self, request, response): + response.set_body("ok") diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py new file mode 100644 index 00000000..cca61eb3 --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py @@ -0,0 +1,22 @@ +from web_framework_api import HeavyOperationStatefulExecutor + + +class Upload(HeavyOperationStatefulExecutor): + def __init__(self): + super().__init__() + + self._threshold_size = 5242880 + self._current_size = 0 + + def do_post(self, request, response): + if int(request.get_headers()["Content-Length"]) >= self._threshold_size: + (dart_part, is_last_packet) = request.get_large_data() + + self._current_size += len(dart_part) + + if is_last_packet: + response.set_body(f"{self._current_size}") + else: + self._current_size = len(request.get_body()) + + response.set_body(f"{self._current_size}") diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py new file mode 100644 index 00000000..9e19ce85 --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py @@ -0,0 +1,60 @@ +# #include "Ws.hpp" +# +# namespace executor +# { +# void Ws::doGet(framework::HttpRequest& request, framework::HttpResponse& response) +# { +# response.setResponseCode(framework::ResponseCodes::badRequest); +# } +# +# std::optional>> WebSocketEcho::onReceive(const framework::WebSocketExecutor::Frame& frame, std::optional& close) +# { +# switch (frame.getType()) +# { +# case framework::WebSocketExecutor::Frame::Type::text: +# return std::string(frame.getPayload()); +# +# case framework::WebSocketExecutor::Frame::Type::binary: +# { +# std::span payload = frame.getPayload>(); +# +# return std::vector(payload.begin(), payload.end()); +# } +# +# case framework::WebSocketExecutor::Frame::Type::close: +# close.emplace(framework::WebSocketExecutor::Frame::Close::Code::normalClosure, "validate done"); +# +# return std::nullopt; +# +# default: +# break; +# } +# +# return std::nullopt; +# } +# +# DEFINE_EXECUTOR(Ws); +# DEFINE_WEB_SOCKET_EXECUTOR(WebSocketEcho); +# } + +from web_framework_api import StatelessExecutor, WebSocketExecutor, ResponseCodes, Frame + + +class Ws(StatelessExecutor): + def do_get(self, request, response): + response.set_response_code(ResponseCodes.BAD_REQUEST) + + +class WebSocketEcho(WebSocketExecutor): + def on_receive(self, frame): + frame_type = frame.get_type() + + match frame_type: + case Frame.FrameType.TEXT: + return frame.get_payload_as_str() + case Frame.FrameType.BINARY: + return frame.get_payload_as_bytes() + case Frame.FrameType.CLOSE: + return Frame.Close(Frame.Close.NORMAL_CLOSURE, "validate done") + case _: + raise Exception(f"Wrong frame type: {frame_type.name}") diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/web.json b/frameworks/web-framework-python/web-framework-benchmark/executors/web.json new file mode 100644 index 00000000..35f8d6cb --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/web.json @@ -0,0 +1,28 @@ +{ + "Baseline11": { + "api": "python", + "loadType": "initialization", + "route": "baseline11" + }, + "JsonExecutor": { + "api": "python", + "loadType": "initialization", + "route": "json/{int:count}" + }, + "Pipeline": { + "api": "python", + "loadType": "initialization", + "route": "pipeline" + }, + "Upload": { + "api": "python", + "loadType": "dynamic", + "route": "upload" + }, + "Ws": { + "api": "python", + "loadType": "initialization", + "route": "ws", + "webSocketExecutorName": "WebSocketEcho" + } +} \ No newline at end of file diff --git a/frameworks/web-framework-python/web-framework-benchmark/server/CMakeLists.txt b/frameworks/web-framework-python/web-framework-benchmark/server/CMakeLists.txt new file mode 100644 index 00000000..e3fc656e --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/server/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 4.0.0) + +project(server) + +install(FILES server.py DESTINATION .) +install(FILES config.json DESTINATION .) diff --git a/frameworks/web-framework-python/web-framework-benchmark/server/config.json b/frameworks/web-framework-python/web-framework-benchmark/server/config.json new file mode 100644 index 00000000..2e2225c4 --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/server/config.json @@ -0,0 +1,33 @@ +{ + "WebServer": { + "ip": "0.0.0.0", + "port": 8080, + "timeout": 30000 + }, + "WebFramework": { + "assetsPath": "/data", + "templatesPath": "templates", + "webServerType": "threadPool", + "settingsPaths": [ + "web.json" + ], + "loadSources": [ + "app/Baseline11", + "app/JsonExecutor", + "app/Pipeline", + "app/Upload", + "app/Ws" + ], + "HTTPS": { + "pathToCertificate": "/certs/server.crt", + "pathToKey": "/certs/server.key", + "useHTTPS": false + }, + "resourcesThreads": 8, + "largeBodySizeThreshold": 5242880, + "largeBodyPacketSize": 1048576 + }, + "ThreadPoolServer": { + "threadCount": 8 + } +} \ No newline at end of file diff --git a/frameworks/web-framework-python/web-framework-benchmark/server/server.py b/frameworks/web-framework-python/web-framework-benchmark/server/server.py new file mode 100644 index 00000000..5a56d8ca --- /dev/null +++ b/frameworks/web-framework-python/web-framework-benchmark/server/server.py @@ -0,0 +1,31 @@ +from web_framework_api import * + + +def on_start(): + print("Server is running...") + + +if __name__ == '__main__': + try: + initialize_web_framework() + + config = Config("config.json") + + threads = os.getenv("THREADS") + + if threads is not None: + config.override_configuration("threadCount", int(threads) - 8) + + threads = os.getenv("H2THREADS") + + if threads is not None: + # TODO: HTTP/2.0 + pass + + server = WebFramework(config) + + server.start(True, on_start) + except WebFrameworkException as e: + print(e) + + exit(1) From 7f1344bb3a0179b83f1422985e06f7e12d7acb84 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 20:41:46 +0500 Subject: [PATCH 10/38] Change meta.json --- frameworks/web-framework-python/meta.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/web-framework-python/meta.json b/frameworks/web-framework-python/meta.json index 70a02cbc..9e7221d7 100644 --- a/frameworks/web-framework-python/meta.json +++ b/frameworks/web-framework-python/meta.json @@ -1,6 +1,6 @@ { - "display_name": "WebFramework C++", - "language": "C++", + "display_name": "WebFramework Python", + "language": "Pyton", "engine": "WebFramework", "type": "production", "description": "Web framework in C++ with different language APIs(Python, C, C++, C#)", From c61380b28270d050e832b3fb7501fc493d2043f6 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 20:44:25 +0500 Subject: [PATCH 11/38] Fixes --- frameworks/web-framework-cpp/Dockerfile | 4 +--- frameworks/web-framework-python/Dockerfile | 13 ++++++------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/frameworks/web-framework-cpp/Dockerfile b/frameworks/web-framework-cpp/Dockerfile index 9139d80c..601aaa5e 100644 --- a/frameworks/web-framework-cpp/Dockerfile +++ b/frameworks/web-framework-cpp/Dockerfile @@ -17,6 +17,4 @@ COPY --from=build /app/build/bin /app WORKDIR /app -RUN python3 -m pip install WebFramework/api/python/dist/*.whl - -CMD ["python3 -u server"] +CMD ["./server"] diff --git a/frameworks/web-framework-python/Dockerfile b/frameworks/web-framework-python/Dockerfile index da7b1160..459ab1eb 100644 --- a/frameworks/web-framework-python/Dockerfile +++ b/frameworks/web-framework-python/Dockerfile @@ -1,24 +1,23 @@ FROM ubuntu:26.04 AS build RUN apt update -RUN apt install -y uuid-dev cmake gcc g++ git unzip zip wget ninja-build python3 python3-venv python3-pip -RUN python3 -m pip install build +RUN apt install -y uuid-dev cmake gcc g++ git unzip zip wget ninja-build +RUN python3 -m pip install build --break-system-packages COPY web-framework-benchmark/ /app WORKDIR /app -RUN mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=bin -DCMAKE_CXX_FLAGS="-march=native" -DCMAKE_C_FLAGS="-march=native" -G "Ninja" .. && cmake --build . -j && cmake --install . +RUN mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=bin -DCMAKE_CXX_FLAGS="-march=native" -DCMAKE_C_FLAGS="-march=native" -G "Ninja" .. && cmake --build . -j && cmake --install . FROM ubuntu:26.04 ENV LD_LIBRARY_PATH=/app -RUN apt update -RUN apt install -y python3 python3-pip - COPY --from=build /app/build/bin /app WORKDIR /app -CMD ["./server"] +RUN python3 -m pip install WebFramework/api/python/dist/*.whl --break-system-packages + +CMD ["python3 -u server"] From 4879a166f52d32a213d8ebcdb171b6481ef0e97d Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 20:46:19 +0500 Subject: [PATCH 12/38] Fix --- frameworks/web-framework-python/Dockerfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frameworks/web-framework-python/Dockerfile b/frameworks/web-framework-python/Dockerfile index 459ab1eb..364095bd 100644 --- a/frameworks/web-framework-python/Dockerfile +++ b/frameworks/web-framework-python/Dockerfile @@ -1,18 +1,19 @@ FROM ubuntu:26.04 AS build RUN apt update -RUN apt install -y uuid-dev cmake gcc g++ git unzip zip wget ninja-build +RUN apt install -y uuid-dev cmake gcc g++ git unzip zip wget ninja-build python3 python3-venv python3-pip RUN python3 -m pip install build --break-system-packages COPY web-framework-benchmark/ /app WORKDIR /app -RUN mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=bin -DCMAKE_CXX_FLAGS="-march=native" -DCMAKE_C_FLAGS="-march=native" -G "Ninja" .. && cmake --build . -j && cmake --install . +RUN mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=bin -DCMAKE_CXX_FLAGS="-march=native" -DCMAKE_C_FLAGS="-march=native" -G "Ninja" .. && cmake --build . -j && cmake --install . FROM ubuntu:26.04 -ENV LD_LIBRARY_PATH=/app +RUN apt update +RUN apt install -y python3 python3-pip COPY --from=build /app/build/bin /app From bc029fd390caa6cadc35f60d51141f6a15b72621 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 21:12:37 +0500 Subject: [PATCH 13/38] Refactor --- .../web-framework-benchmark/CMakeLists.txt | 2 +- frameworks/web-framework-python/Dockerfile | 1 + .../web-framework-benchmark/CMakeLists.txt | 18 ++++++++++++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt index ceb7eeaa..66325f8f 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt @@ -17,7 +17,7 @@ include(FetchContent) FetchContent_Declare( WebFramework - GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework + GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework.git GIT_TAG v${WEB_FRAMEWORK_VERSION} ) diff --git a/frameworks/web-framework-python/Dockerfile b/frameworks/web-framework-python/Dockerfile index 364095bd..29e58a58 100644 --- a/frameworks/web-framework-python/Dockerfile +++ b/frameworks/web-framework-python/Dockerfile @@ -20,5 +20,6 @@ COPY --from=build /app/build/bin /app WORKDIR /app RUN python3 -m pip install WebFramework/api/python/dist/*.whl --break-system-packages +RUN rm -rf WebFramework CMD ["python3 -u server"] diff --git a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt index 3b98b879..40cee9f8 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt @@ -2,30 +2,40 @@ cmake_minimum_required(VERSION 4.0.0) set(WEB_FRAMEWORK_VERSION 3.4.1) +set(WITH_PYTHON_EXECUTORS ON) +set(WITH_DOTNET_EXECUTORS OFF) +set(BUILD_PYTHON_API ON) +set(BUILD_CC_API OFF) +set(BUILD_CXX_API OFF) +set(BUILD_CSHARP_API OFF) + project(web_framework_benchmark) +set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) +set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) + include(FetchContent) FetchContent_Declare( WebFramework - GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework + GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework.git GIT_TAG dev ) FetchContent_MakeAvailable(WebFramework) execute_process( - COMMAND cmake -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DWITH_PYTHON_EXECUTORS=ON -DWITH_DOTNET_EXECUTORS=OFF -DBUILD_PYTHON_API=ON -DBUILD_CC_API=OFF -DBUILD_CXX_API=OFF -DBUILD_CSHARP_API=OFF -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}/WebFramework -G "Ninja" . + COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}/WebFramework -G "Ninja" . WORKING_DIRECTORY ${webframework_SOURCE_DIR} ) execute_process( - COMMAND cmake --build . -j + COMMAND ${CMAKE_COMMAND} --build . -j WORKING_DIRECTORY ${webframework_SOURCE_DIR} ) execute_process( - COMMAND cmake --install . + COMMAND ${CMAKE_COMMAND} --install . WORKING_DIRECTORY ${webframework_SOURCE_DIR} ) From 522868155e0834dac8d54a5de8ec25089595e5c4 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 21:24:35 +0500 Subject: [PATCH 14/38] Add CMAKE_BUILD_TYPE add --prefix at install --- .../web-framework-benchmark/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt index 40cee9f8..37a6cd74 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 4.0.0) +set(CMAKE_BUILD_TYPE Release) + set(WEB_FRAMEWORK_VERSION 3.4.1) set(WITH_PYTHON_EXECUTORS ON) @@ -25,7 +27,7 @@ FetchContent_Declare( FetchContent_MakeAvailable(WebFramework) execute_process( - COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}/WebFramework -G "Ninja" . + COMMAND ${CMAKE_COMMAND} -G "Ninja" . WORKING_DIRECTORY ${webframework_SOURCE_DIR} ) @@ -35,7 +37,7 @@ execute_process( ) execute_process( - COMMAND ${CMAKE_COMMAND} --install . + COMMAND ${CMAKE_COMMAND} --install . --prefix ${CMAKE_INSTALL_PREFIX}/WebFrameworkLibrary WORKING_DIRECTORY ${webframework_SOURCE_DIR} ) From 148ef31266b4f24d9eefc3d0e05aee4232f8e8e4 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 21:31:55 +0500 Subject: [PATCH 15/38] Fixes --- frameworks/web-framework-python/Dockerfile | 3 +- .../web-framework-benchmark/CMakeLists.txt | 2 +- .../executors/app/Ws.py | 39 ------------------- 3 files changed, 2 insertions(+), 42 deletions(-) diff --git a/frameworks/web-framework-python/Dockerfile b/frameworks/web-framework-python/Dockerfile index 29e58a58..008f273b 100644 --- a/frameworks/web-framework-python/Dockerfile +++ b/frameworks/web-framework-python/Dockerfile @@ -19,7 +19,6 @@ COPY --from=build /app/build/bin /app WORKDIR /app -RUN python3 -m pip install WebFramework/api/python/dist/*.whl --break-system-packages -RUN rm -rf WebFramework +RUN python3 -m pip install api/python_api/dist/*.whl --break-system-packages CMD ["python3 -u server"] diff --git a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt index 37a6cd74..3d17b407 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt @@ -37,7 +37,7 @@ execute_process( ) execute_process( - COMMAND ${CMAKE_COMMAND} --install . --prefix ${CMAKE_INSTALL_PREFIX}/WebFrameworkLibrary + COMMAND ${CMAKE_COMMAND} --install . WORKING_DIRECTORY ${webframework_SOURCE_DIR} ) diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py index 9e19ce85..72a493a6 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py @@ -1,42 +1,3 @@ -# #include "Ws.hpp" -# -# namespace executor -# { -# void Ws::doGet(framework::HttpRequest& request, framework::HttpResponse& response) -# { -# response.setResponseCode(framework::ResponseCodes::badRequest); -# } -# -# std::optional>> WebSocketEcho::onReceive(const framework::WebSocketExecutor::Frame& frame, std::optional& close) -# { -# switch (frame.getType()) -# { -# case framework::WebSocketExecutor::Frame::Type::text: -# return std::string(frame.getPayload()); -# -# case framework::WebSocketExecutor::Frame::Type::binary: -# { -# std::span payload = frame.getPayload>(); -# -# return std::vector(payload.begin(), payload.end()); -# } -# -# case framework::WebSocketExecutor::Frame::Type::close: -# close.emplace(framework::WebSocketExecutor::Frame::Close::Code::normalClosure, "validate done"); -# -# return std::nullopt; -# -# default: -# break; -# } -# -# return std::nullopt; -# } -# -# DEFINE_EXECUTOR(Ws); -# DEFINE_WEB_SOCKET_EXECUTOR(WebSocketEcho); -# } - from web_framework_api import StatelessExecutor, WebSocketExecutor, ResponseCodes, Frame From d2b7b57ed0f60b5b43aa36db686cc663a9f3c885 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 21:36:19 +0500 Subject: [PATCH 16/38] Fix --- .../web-framework-cpp/web-framework-benchmark/CMakeLists.txt | 3 ++- .../web-framework-benchmark/executors/web.json | 5 ----- frameworks/web-framework-python/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt index 66325f8f..5fb12c66 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt @@ -18,7 +18,8 @@ include(FetchContent) FetchContent_Declare( WebFramework GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework.git - GIT_TAG v${WEB_FRAMEWORK_VERSION} + # GIT_TAG v${WEB_FRAMEWORK_VERSION} + GIT_TAG dev ) FetchContent_MakeAvailable(WebFramework) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json b/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json index 78151d55..38ca5a22 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json @@ -19,11 +19,6 @@ "loadType": "dynamic", "route": "upload" }, - "Static": { - "api": "cxx", - "loadType": "initialization", - "route": "static/{string:filePath}" - }, "Ws": { "api": "cxx", "loadType": "initialization", diff --git a/frameworks/web-framework-python/Dockerfile b/frameworks/web-framework-python/Dockerfile index 008f273b..c0d272a6 100644 --- a/frameworks/web-framework-python/Dockerfile +++ b/frameworks/web-framework-python/Dockerfile @@ -21,4 +21,4 @@ WORKDIR /app RUN python3 -m pip install api/python_api/dist/*.whl --break-system-packages -CMD ["python3 -u server"] +CMD ["python3 server.py"] From c6d7046d9027a6437f0f92c394b382dd4b10d303 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 22:37:05 +0500 Subject: [PATCH 17/38] Fixes --- .../web-framework-benchmark/CMakeLists.txt | 3 +- .../executors/CMakeLists.txt | 1 - .../executors/include/Static.hpp | 12 ------- .../executors/src/Static.cpp | 31 ------------------- frameworks/web-framework-python/Dockerfile | 4 ++- .../server/config.json | 3 ++ 6 files changed, 7 insertions(+), 47 deletions(-) delete mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Static.hpp delete mode 100644 frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt index 5fb12c66..66325f8f 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt @@ -18,8 +18,7 @@ include(FetchContent) FetchContent_Declare( WebFramework GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework.git - # GIT_TAG v${WEB_FRAMEWORK_VERSION} - GIT_TAG dev + GIT_TAG v${WEB_FRAMEWORK_VERSION} ) FetchContent_MakeAvailable(WebFramework) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt b/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt index 8f5a6449..f8cd4d25 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt @@ -8,7 +8,6 @@ add_library( src/JsonExecutor.cpp src/Pipeline.cpp src/Upload.cpp - src/Static.cpp src/Ws.cpp ) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Static.hpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Static.hpp deleted file mode 100644 index b77be01c..00000000 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Static.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include - -namespace executor -{ - class Static : public framework::HeavyOperationStatelessExecutor - { - public: - void doGet(framework::HttpRequest& request, framework::HttpResponse& response) override; - }; -} diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp deleted file mode 100644 index 0cb9dba5..00000000 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Static.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "Static.hpp" - -#include -#include - -namespace executor -{ - void Static::doGet(framework::HttpRequest& request, framework::HttpResponse& response) - { - constexpr std::array, 8> contentTypes = - { - std::make_pair(".css", "text/css"), - std::make_pair(".js", "application/javascript"), - std::make_pair(".html", "text/html"), - std::make_pair(".woff2", "font/woff2"), - std::make_pair(".svg", "image/svg+xml"), - std::make_pair(".webp", "image/webp"), - std::make_pair(".json", "application/json"), - std::make_pair(".txt", "text/plain") - }; - - std::filesystem::path filePath = "static/" + request.getRouteParameter("filePath"); - std::string extension = filePath.extension().string(); - std::string_view contentType = std::ranges::find_if(contentTypes, [&extension](const std::pair& contentType) { return contentType.first == extension; })->second; - - response.addHeader("Content-Type", contentType); - request.sendAssetFile(filePath.string(), response); - } - - DEFINE_EXECUTOR(Static); -}; diff --git a/frameworks/web-framework-python/Dockerfile b/frameworks/web-framework-python/Dockerfile index c0d272a6..80893d9b 100644 --- a/frameworks/web-framework-python/Dockerfile +++ b/frameworks/web-framework-python/Dockerfile @@ -12,6 +12,8 @@ RUN mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=bin -DCMAKE_CXX_FLAG FROM ubuntu:26.04 +ENV LD_LIBRARY=/app/lib + RUN apt update RUN apt install -y python3 python3-pip @@ -21,4 +23,4 @@ WORKDIR /app RUN python3 -m pip install api/python_api/dist/*.whl --break-system-packages -CMD ["python3 server.py"] +CMD ["python3", "server.py"] diff --git a/frameworks/web-framework-python/web-framework-benchmark/server/config.json b/frameworks/web-framework-python/web-framework-benchmark/server/config.json index 2e2225c4..f3026c8a 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/server/config.json +++ b/frameworks/web-framework-python/web-framework-benchmark/server/config.json @@ -8,6 +8,9 @@ "assetsPath": "/data", "templatesPath": "templates", "webServerType": "threadPool", + "runtimes": [ + "python" + ], "settingsPaths": [ "web.json" ], From 6affb3bed1299c49e1cc7aa370c6d568ed868e68 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sat, 9 May 2026 22:41:40 +0500 Subject: [PATCH 18/38] Fix --- frameworks/web-framework-python/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/web-framework-python/Dockerfile b/frameworks/web-framework-python/Dockerfile index 80893d9b..96a96339 100644 --- a/frameworks/web-framework-python/Dockerfile +++ b/frameworks/web-framework-python/Dockerfile @@ -12,7 +12,7 @@ RUN mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=bin -DCMAKE_CXX_FLAG FROM ubuntu:26.04 -ENV LD_LIBRARY=/app/lib +ENV LD_LIBRARY_PATH=/app/lib RUN apt update RUN apt install -y python3 python3-pip From 004d55a813d59850883f979fa72cdbb6b94ad7da Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sun, 10 May 2026 01:28:53 +0500 Subject: [PATCH 19/38] Refactor --- .../web-framework-benchmark/executors/src/Baseline11.cpp | 2 -- .../web-framework-benchmark/executors/src/Pipeline.cpp | 5 +---- .../web-framework-benchmark/executors/src/Upload.cpp | 2 -- .../web-framework-benchmark/executors/app/JsonExecutor.py | 8 ++++++-- .../web-framework-benchmark/executors/app/Upload.py | 4 ++-- .../web-framework-benchmark/executors/app/Ws.py | 2 +- .../web-framework-benchmark/server/config.json | 3 ++- 7 files changed, 12 insertions(+), 14 deletions(-) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp index 99958c68..7a8454d7 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp @@ -28,7 +28,6 @@ namespace executor Baseline11::parseValues(request, a, b); - response.addHeader("Content-Type", "text/plain"); response.setBody(std::to_string(a + b)); } @@ -55,7 +54,6 @@ namespace executor std::from_chars(body.data(), body.data() + body.size(), c); } - response.addHeader("Content-Type", "text/plain"); response.setBody(std::to_string(a + b + c)); } diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Pipeline.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Pipeline.cpp index a996a86c..34828dc3 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Pipeline.cpp +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Pipeline.cpp @@ -4,10 +4,7 @@ namespace executor { void Pipeline::doGet(framework::HttpRequest& request, framework::HttpResponse& response) { - constexpr std::string_view okResponse = "ok"; - - response.addHeader("Content-Type", "text/plain"); - response.setBody(okResponse); + response.setBody("ok"); } DEFINE_EXECUTOR(Pipeline); diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Upload.cpp b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Upload.cpp index 880809b5..769a1592 100644 --- a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Upload.cpp +++ b/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Upload.cpp @@ -28,7 +28,6 @@ namespace executor if (isLastPacket) { - response.addHeader("Content-Type", "text/plain"); response.setBody(std::to_string(currentSize)); } } @@ -36,7 +35,6 @@ namespace executor { currentSize = request.getBody().size(); - response.addHeader("Content-Type", "text/plain"); response.setBody(std::to_string(currentSize)); } } diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/JsonExecutor.py b/frameworks/web-framework-python/web-framework-benchmark/executors/app/JsonExecutor.py index 52abc2ed..b235b07e 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/executors/app/JsonExecutor.py +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/app/JsonExecutor.py @@ -1,7 +1,7 @@ import json import copy -from typing import Any, Dict +from typing import Any, Dict, List from web_framework_api.web_framework_api import StatelessExecutor @@ -19,6 +19,7 @@ def do_get(self, request, response): multiplier = int(request.get_query_parameters()["m"]) count = request.get_int_route_parameter("count") result: Dict[str, Any] = dict() + items: List[Any] = list() for i in range(count): item: Dict[str, Any] = self._items[i] @@ -26,6 +27,9 @@ def do_get(self, request, response): temp["total"] = int(temp["price"]) * int(temp["quantity"]) * multiplier - result["items"] = temp + items.append(temp) + + result["count"] = count + result["items"] = items response.set_body(result) diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py index cca61eb3..a388c7bd 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py @@ -10,9 +10,9 @@ def __init__(self): def do_post(self, request, response): if int(request.get_headers()["Content-Length"]) >= self._threshold_size: - (dart_part, is_last_packet) = request.get_large_data() + (data, is_last_packet) = request.get_large_data() - self._current_size += len(dart_part) + self._current_size += len(data) if is_last_packet: response.set_body(f"{self._current_size}") diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py index 72a493a6..4841948c 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py @@ -18,4 +18,4 @@ def on_receive(self, frame): case Frame.FrameType.CLOSE: return Frame.Close(Frame.Close.NORMAL_CLOSURE, "validate done") case _: - raise Exception(f"Wrong frame type: {frame_type.name}") + return None diff --git a/frameworks/web-framework-python/web-framework-benchmark/server/config.json b/frameworks/web-framework-python/web-framework-benchmark/server/config.json index f3026c8a..9cd48e1b 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/server/config.json +++ b/frameworks/web-framework-python/web-framework-benchmark/server/config.json @@ -28,7 +28,8 @@ }, "resourcesThreads": 8, "largeBodySizeThreshold": 5242880, - "largeBodyPacketSize": 1048576 + "largeBodyPacketSize": 1048576, + "enableExceptionMessages": true }, "ThreadPoolServer": { "threadCount": 8 From 393c03c9c0751cfa5710cc64038fefcdd0c41db0 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sun, 10 May 2026 01:45:35 +0500 Subject: [PATCH 20/38] Fix Upload, add WITH_STACKTRACE --- .../web-framework-benchmark/CMakeLists.txt | 1 + .../web-framework-benchmark/executors/app/Upload.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt index 3d17b407..6878324f 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt @@ -10,6 +10,7 @@ set(BUILD_PYTHON_API ON) set(BUILD_CC_API OFF) set(BUILD_CXX_API OFF) set(BUILD_CSHARP_API OFF) +set(WITH_STACKTRACE ON) project(web_framework_benchmark) diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py index a388c7bd..44af99cf 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py +++ b/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py @@ -10,13 +10,13 @@ def __init__(self): def do_post(self, request, response): if int(request.get_headers()["Content-Length"]) >= self._threshold_size: - (data, is_last_packet) = request.get_large_data() + data, is_last_packet = request.get_large_data() self._current_size += len(data) if is_last_packet: response.set_body(f"{self._current_size}") else: - self._current_size = len(request.get_body()) + self._current_size = len(request.get_body_as_bytes()) response.set_body(f"{self._current_size}") From 50ad621be9a3b65738e24e44858ce0c0cd98d31d Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sun, 10 May 2026 03:26:08 +0500 Subject: [PATCH 21/38] Refactor --- .../web-framework-python/web-framework-benchmark/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt index 6878324f..3d17b407 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt @@ -10,7 +10,6 @@ set(BUILD_PYTHON_API ON) set(BUILD_CC_API OFF) set(BUILD_CXX_API OFF) set(BUILD_CSHARP_API OFF) -set(WITH_STACKTRACE ON) project(web_framework_benchmark) From af6ccfb4bb0d0eb0c44b4a23741e3cfca87673c1 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sun, 10 May 2026 03:34:03 +0500 Subject: [PATCH 22/38] Finish web-framework-python --- .../web-framework-benchmark/CMakeLists.txt | 2 +- .../web-framework-benchmark/server/config.json | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt index 3d17b407..fac540b3 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt +++ b/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt @@ -21,7 +21,7 @@ include(FetchContent) FetchContent_Declare( WebFramework GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework.git - GIT_TAG dev + GIT_TAG v${WEB_FRAMEWORK_VERSION} ) FetchContent_MakeAvailable(WebFramework) diff --git a/frameworks/web-framework-python/web-framework-benchmark/server/config.json b/frameworks/web-framework-python/web-framework-benchmark/server/config.json index 9cd48e1b..f3026c8a 100644 --- a/frameworks/web-framework-python/web-framework-benchmark/server/config.json +++ b/frameworks/web-framework-python/web-framework-benchmark/server/config.json @@ -28,8 +28,7 @@ }, "resourcesThreads": 8, "largeBodySizeThreshold": 5242880, - "largeBodyPacketSize": 1048576, - "enableExceptionMessages": true + "largeBodyPacketSize": 1048576 }, "ThreadPoolServer": { "threadCount": 8 From b6454a33f20969e86299d544299afa300cba7ec9 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sun, 10 May 2026 17:45:03 +0500 Subject: [PATCH 23/38] Add web-framework-csharp --- frameworks/web-framework-csharp/Dockerfile | 23 ++++++++++ frameworks/web-framework-csharp/meta.json | 11 +++++ .../web_framework_benchmark/.gitignore | 5 +++ .../Executors/Baseline11.cs | 43 +++++++++++++++++++ .../Executors/Executors.csproj | 13 ++++++ .../Executors/JsonExecutor.cs | 34 +++++++++++++++ .../Executors/Pipeline.cs | 12 ++++++ .../Executors/Upload.cs | 32 ++++++++++++++ .../web_framework_benchmark/Executors/Ws.cs | 31 +++++++++++++ .../Executors/web.json | 28 ++++++++++++ .../web_framework_benchmark/Server/Main.cs | 36 ++++++++++++++++ .../Server/Server.csproj | 14 ++++++ .../Server/config.json | 32 ++++++++++++++ .../web_framework_benchmark.slnx | 4 ++ 14 files changed, 318 insertions(+) create mode 100644 frameworks/web-framework-csharp/Dockerfile create mode 100644 frameworks/web-framework-csharp/meta.json create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/.gitignore create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/Executors/Baseline11.cs create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/Executors/JsonExecutor.cs create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/Executors/Pipeline.cs create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/Executors/Ws.cs create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/Executors/web.json create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/Server/Main.cs create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/Server/config.json create mode 100644 frameworks/web-framework-csharp/web_framework_benchmark/web_framework_benchmark.slnx diff --git a/frameworks/web-framework-csharp/Dockerfile b/frameworks/web-framework-csharp/Dockerfile new file mode 100644 index 00000000..42b3be2b --- /dev/null +++ b/frameworks/web-framework-csharp/Dockerfile @@ -0,0 +1,23 @@ +FROM ubuntu:26.04 AS build + +RUN apt update +RUN apt install -y dotnet-sdk-10.0 + +COPY . . + +RUN dotnet publish -c Release -p:PublishDir=/app + +FROM ubuntu:26.04 + +ENV LD_LIBRARY_PATH=/app/lib + +RUN apt update +RUN apt install -y dotnet-runtime-10.0 + +RUN LD_LIBRARY_PATH=$(find / -name libhostfxr.so) && echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >> /etc/environment + +COPY --from=build /app/ /app + +WORKDIR /app + +# CMD ["dotnet", "Server.dll"] diff --git a/frameworks/web-framework-csharp/meta.json b/frameworks/web-framework-csharp/meta.json new file mode 100644 index 00000000..3c16428e --- /dev/null +++ b/frameworks/web-framework-csharp/meta.json @@ -0,0 +1,11 @@ +{ + "display_name": "WebFramework C#", + "language": "C#", + "engine": "WebFramework", + "type": "production", + "description": "Web framework in C++ with different language APIs(Python, C, C++, C#)", + "repo": "https://github.com/LazyPanda07/WebFramework", + "enabled": true, + "tests": [ "baseline", "limited-conn", "pipelined", "json", "upload", "static", "echo-ws" ], + "maintainers": "LazyPanda07" +} \ No newline at end of file diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/.gitignore b/frameworks/web-framework-csharp/web_framework_benchmark/.gitignore new file mode 100644 index 00000000..2b3fbf92 --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/.gitignore @@ -0,0 +1,5 @@ +# Binaries +out/ +build/ +bin/ +obj/ diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Baseline11.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Baseline11.cs new file mode 100644 index 00000000..7946364f --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Baseline11.cs @@ -0,0 +1,43 @@ +namespace Executors; + +using Framework; +using System.Text; + +public class Baseline11 : StatelessExecutor +{ + private static void ParseValues(HttpRequest request, out int a, out int b) + { + IDictionary queryParameters = request.GetQueryParameters(); + + a = int.Parse(queryParameters["a"]); + b = int.Parse(queryParameters["b"]); + } + + public override void DoGet(HttpRequest request, HttpResponse response) + { + ParseValues(request, out int a, out int b); + + response.AddHeader("Content-Type", "text/plain"); + response.SetBody($"{a + b}"); + } + + public override void DoPost(HttpRequest request, HttpResponse response) + { + IDictionary headers = request.GetHeaders(); + int c; + + ParseValues(request, out int a, out int b); + + if (headers.ContainsKey("Transfer-Encoding")) + { + c = int.Parse(Encoding.ASCII.GetString(request.GetChunks()[0])); + } + else + { + c = int.Parse(request.GetHttpBody()); + } + + response.AddHeader("Content-Type", "text/plain"); + response.SetBody($"{a + b + c}"); + } +} diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj new file mode 100644 index 00000000..f7bf627c --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj @@ -0,0 +1,13 @@ + + + + net10.0 + enable + enable + + + + + + + diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/JsonExecutor.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/JsonExecutor.cs new file mode 100644 index 00000000..83f7e282 --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/JsonExecutor.cs @@ -0,0 +1,34 @@ +namespace Executors; + +using Framework; +using System.Text.Json.Nodes; + +public class JsonExecutor : StatelessExecutor +{ + private JsonArray? _items; + + public override void Init(ExecutorSettings settings) => _items = JsonNode.Parse(settings.GetFile("dataset.json"))!.AsArray(); + + public override void DoGet(HttpRequest request, HttpResponse response) + { + int multiplier = int.Parse(request.GetQueryParameters()["m"]); + int count = request.GetRouteParameter("count"); + var result = new + { + count, + items = new JsonArray() + }; + + for (int i = 0; i < count; i++) + { + JsonObject temp = _items!.ElementAt(i)!.AsObject().DeepClone().AsObject(); + + temp["total"] = temp["price"]!.GetValue() * temp["quantity"]!.GetValue() * multiplier; + + result.items.Add(temp); + } + + response.AddHeader("Content-Type", "text/plain"); + response.SetBody(result); + } +} diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Pipeline.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Pipeline.cs new file mode 100644 index 00000000..570e6b3c --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Pipeline.cs @@ -0,0 +1,12 @@ +namespace Executors; + +using Framework; + +public class Pipeline : StatelessExecutor +{ + public override void DoGet(HttpRequest request, HttpResponse response) + { + response.AddHeader("Content-Type", "text/plain"); + response.SetBody("ok"); + } +} diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs new file mode 100644 index 00000000..1e1fa123 --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs @@ -0,0 +1,32 @@ +namespace Executors; + +using Framework; + +public class Upload : HeavyOperationStatefulExecutor +{ + private const int thresholdSize = 5242880; + private int currentSize = 0; + + public override void DoPost(HttpRequest request, HttpResponse response) + { + if (int.Parse(request.GetHeaders()["Content-Length"]) >= thresholdSize) + { + var (data, last) = request.GetLargeData(); + + currentSize += data.Length; + + if (last) + { + response.AddHeader("Content-Type", "text/plain"); + response.SetBody($"{currentSize}"); + } + } + else + { + currentSize = request.GetHttpBody().Length; + + response.AddHeader("Content-Type", "text/plain"); + response.SetBody($"{currentSize}"); + } + } +} diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Ws.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Ws.cs new file mode 100644 index 00000000..39ec4df8 --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Ws.cs @@ -0,0 +1,31 @@ +namespace Executors; + +using Framework; +using Framework.Utility; + +public class Ws : StatelessExecutor +{ + public override void DoGet(HttpRequest request, HttpResponse response) + { + response.SetResponseCode(ResponseCodes.BadRequest); + } +} + +public class WebSocketEcho : WebSocketExecutor +{ + public override FramePayload? OnReceive(Frame frame) + { + switch (frame.GetFrameType()) + { + case Frame.Type.text: + case Frame.Type.binary: + return frame.GetPayload(); + + case Frame.Type.close: + return null; + + default: + return null; + } + } +} diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/web.json b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/web.json new file mode 100644 index 00000000..3b939b4c --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/web.json @@ -0,0 +1,28 @@ +{ + "Executors.Baseline11": { + "api": "csharp", + "loadType": "initialization", + "route": "baseline11" + }, + "Executors.JsonExecutor": { + "api": "csharp", + "loadType": "initialization", + "route": "json/{int:count}" + }, + "Executors.Pipeline": { + "api": "csharp", + "loadType": "initialization", + "route": "pipeline" + }, + "Executors.Upload": { + "api": "csharp", + "loadType": "dynamic", + "route": "upload" + }, + "Executors.Ws": { + "api": "csharp", + "loadType": "initialization", + "route": "ws", + "webSocketExecutorName": "Executors.WebSocketEcho" + } +} \ No newline at end of file diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Server/Main.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Main.cs new file mode 100644 index 00000000..d3fa9ceb --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Main.cs @@ -0,0 +1,36 @@ +using Framework; +using Framework.Utility; + +try +{ + Config config = new("config.json"); + + string? threads = Environment.GetEnvironmentVariable("THREADS"); + + if (threads != null) + { + int value = int.Parse(threads); + + if (value > 8) + { + config.OverrideConfiguration("threadCount", value - 8); + } + } + + threads = Environment.GetEnvironmentVariable("H2THREADS"); + + if (threads != null) + { + // TODO: HTTP/2.0 + } + + WebFramework server = new(config); + + server.Start(true, () => Console.WriteLine("Server is running...")); +} +catch (Exception e) +{ + Console.WriteLine(e.Message); + + Environment.Exit(1); +} diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj new file mode 100644 index 00000000..8506fdca --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj @@ -0,0 +1,14 @@ + + + + Exe + net10.0 + enable + enable + + + + + + + diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Server/config.json b/frameworks/web-framework-csharp/web_framework_benchmark/Server/config.json new file mode 100644 index 00000000..3b80c0e9 --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Server/config.json @@ -0,0 +1,32 @@ +{ + "WebServer": { + "ip": "0.0.0.0", + "port": 8080, + "timeout": 30000 + }, + "WebFramework": { + "assetsPath": "/data", + "templatesPath": "templates", + "webServerType": "threadPool", + "runtimes": [ + ".net" + ], + "settingsPaths": [ + "web.json" + ], + "loadSources": [ + "Executors" + ], + "HTTPS": { + "pathToCertificate": "/certs/server.crt", + "pathToKey": "/certs/server.key", + "useHTTPS": false + }, + "resourcesThreads": 8, + "largeBodySizeThreshold": 5242880, + "largeBodyPacketSize": 1048576 + }, + "ThreadPoolServer": { + "threadCount": 8 + } +} \ No newline at end of file diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/web_framework_benchmark.slnx b/frameworks/web-framework-csharp/web_framework_benchmark/web_framework_benchmark.slnx new file mode 100644 index 00000000..bd440a03 --- /dev/null +++ b/frameworks/web-framework-csharp/web_framework_benchmark/web_framework_benchmark.slnx @@ -0,0 +1,4 @@ + + + + From bfb9684f4e5914531fa44d2a54449c8b2f92d025 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sun, 10 May 2026 17:54:17 +0500 Subject: [PATCH 24/38] Add copying config.json, web.json --- frameworks/web-framework-csharp/Dockerfile | 6 ++---- .../web_framework_benchmark/Executors/Executors.csproj | 7 +++++++ .../web_framework_benchmark/Server/Server.csproj | 7 +++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/frameworks/web-framework-csharp/Dockerfile b/frameworks/web-framework-csharp/Dockerfile index 42b3be2b..bd6fa9e8 100644 --- a/frameworks/web-framework-csharp/Dockerfile +++ b/frameworks/web-framework-csharp/Dockerfile @@ -3,14 +3,12 @@ FROM ubuntu:26.04 AS build RUN apt update RUN apt install -y dotnet-sdk-10.0 -COPY . . +COPY web_framework_benchmark/ . RUN dotnet publish -c Release -p:PublishDir=/app FROM ubuntu:26.04 -ENV LD_LIBRARY_PATH=/app/lib - RUN apt update RUN apt install -y dotnet-runtime-10.0 @@ -20,4 +18,4 @@ COPY --from=build /app/ /app WORKDIR /app -# CMD ["dotnet", "Server.dll"] +CMD ["dotnet", "./Server.dll"] diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj index f7bf627c..ab9cac4b 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj @@ -10,4 +10,11 @@ + + + PreserveNewest + PreserveNewest + + + diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj index 8506fdca..72e7a905 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj @@ -11,4 +11,11 @@ + + + PreserveNewest + PreserveNewest + + + From 627288fa2354711eb23a567557fc61365facb251 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sun, 10 May 2026 21:45:14 +0500 Subject: [PATCH 25/38] Update WebFramework to v3.4.1 --- frameworks/web-framework-csharp/Dockerfile | 6 +++++- .../web_framework_benchmark/Executors/Executors.csproj | 2 +- .../web_framework_benchmark/Executors/Ws.cs | 4 +++- .../web_framework_benchmark/Server/Main.cs | 5 ++--- .../web_framework_benchmark/Server/Server.csproj | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/frameworks/web-framework-csharp/Dockerfile b/frameworks/web-framework-csharp/Dockerfile index bd6fa9e8..e61c1528 100644 --- a/frameworks/web-framework-csharp/Dockerfile +++ b/frameworks/web-framework-csharp/Dockerfile @@ -9,6 +9,8 @@ RUN dotnet publish -c Release -p:PublishDir=/app FROM ubuntu:26.04 +ENV WEB_FRAMEWORK_CSHARP_API_PATH=/app/WebFrameworkCSharpAPI.dll + RUN apt update RUN apt install -y dotnet-runtime-10.0 @@ -18,4 +20,6 @@ COPY --from=build /app/ /app WORKDIR /app -CMD ["dotnet", "./Server.dll"] +RUN ln -s $(find / -name libhostfxr.so) + +CMD ["LD_LIBRARY_PATH=/app", "dotnet", "./Server.dll"] diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj index ab9cac4b..cbfc7eb1 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj @@ -7,7 +7,7 @@ - + diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Ws.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Ws.cs index 39ec4df8..b1e1b165 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Ws.cs +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Ws.cs @@ -13,7 +13,7 @@ public override void DoGet(HttpRequest request, HttpResponse response) public class WebSocketEcho : WebSocketExecutor { - public override FramePayload? OnReceive(Frame frame) + public override FramePayload? OnReceive(Frame frame, ref Frame.Close? close) { switch (frame.GetFrameType()) { @@ -22,6 +22,8 @@ public class WebSocketEcho : WebSocketExecutor return frame.GetPayload(); case Frame.Type.close: + close = new(Frame.Close.Code.normalClosure, "validate done"); + return null; default: diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Server/Main.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Main.cs index d3fa9ceb..0e118e02 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Server/Main.cs +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Main.cs @@ -1,4 +1,5 @@ using Framework; +using Framework.Exceptions; using Framework.Utility; try @@ -28,9 +29,7 @@ server.Start(true, () => Console.WriteLine("Server is running...")); } -catch (Exception e) +catch (WebFrameworkException e) { Console.WriteLine(e.Message); - - Environment.Exit(1); } diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj index 72e7a905..583a6be9 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj @@ -8,7 +8,7 @@ - + From 923be9b4d75ba2c1c838256c30388d21d445e9a7 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sun, 10 May 2026 21:49:17 +0500 Subject: [PATCH 26/38] Fix --- frameworks/web-framework-csharp/Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frameworks/web-framework-csharp/Dockerfile b/frameworks/web-framework-csharp/Dockerfile index e61c1528..f7b10216 100644 --- a/frameworks/web-framework-csharp/Dockerfile +++ b/frameworks/web-framework-csharp/Dockerfile @@ -10,16 +10,15 @@ RUN dotnet publish -c Release -p:PublishDir=/app FROM ubuntu:26.04 ENV WEB_FRAMEWORK_CSHARP_API_PATH=/app/WebFrameworkCSharpAPI.dll +ENV LD_LIBRARY_PATH=/app RUN apt update RUN apt install -y dotnet-runtime-10.0 -RUN LD_LIBRARY_PATH=$(find / -name libhostfxr.so) && echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >> /etc/environment - COPY --from=build /app/ /app WORKDIR /app RUN ln -s $(find / -name libhostfxr.so) -CMD ["LD_LIBRARY_PATH=/app", "dotnet", "./Server.dll"] +CMD ["dotnet", "./Server.dll"] From 7fa709de601db0e89989dd249486cbf38a775b42 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sun, 10 May 2026 21:52:51 +0500 Subject: [PATCH 27/38] Fix LD_LIBRARY_PATH --- frameworks/web-framework-csharp/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/web-framework-csharp/Dockerfile b/frameworks/web-framework-csharp/Dockerfile index f7b10216..935cc1e5 100644 --- a/frameworks/web-framework-csharp/Dockerfile +++ b/frameworks/web-framework-csharp/Dockerfile @@ -10,7 +10,7 @@ RUN dotnet publish -c Release -p:PublishDir=/app FROM ubuntu:26.04 ENV WEB_FRAMEWORK_CSHARP_API_PATH=/app/WebFrameworkCSharpAPI.dll -ENV LD_LIBRARY_PATH=/app +ENV LD_LIBRARY_PATH=/app:/app/runtimes/linux-x64/native RUN apt update RUN apt install -y dotnet-runtime-10.0 From 1dc6b94e2077542fdd1f4bcb18399102b21f4550 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Sun, 10 May 2026 22:06:46 +0500 Subject: [PATCH 28/38] Remove Content-Type --- .../web_framework_benchmark/Executors/Baseline11.cs | 2 -- .../web_framework_benchmark/Executors/JsonExecutor.cs | 1 - .../web_framework_benchmark/Executors/Pipeline.cs | 1 - .../web_framework_benchmark/Executors/Upload.cs | 2 -- 4 files changed, 6 deletions(-) diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Baseline11.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Baseline11.cs index 7946364f..8b792748 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Baseline11.cs +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Baseline11.cs @@ -17,7 +17,6 @@ public override void DoGet(HttpRequest request, HttpResponse response) { ParseValues(request, out int a, out int b); - response.AddHeader("Content-Type", "text/plain"); response.SetBody($"{a + b}"); } @@ -37,7 +36,6 @@ public override void DoPost(HttpRequest request, HttpResponse response) c = int.Parse(request.GetHttpBody()); } - response.AddHeader("Content-Type", "text/plain"); response.SetBody($"{a + b + c}"); } } diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/JsonExecutor.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/JsonExecutor.cs index 83f7e282..8ead2fd6 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/JsonExecutor.cs +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/JsonExecutor.cs @@ -28,7 +28,6 @@ public override void DoGet(HttpRequest request, HttpResponse response) result.items.Add(temp); } - response.AddHeader("Content-Type", "text/plain"); response.SetBody(result); } } diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Pipeline.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Pipeline.cs index 570e6b3c..8cd2d67d 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Pipeline.cs +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Pipeline.cs @@ -6,7 +6,6 @@ public class Pipeline : StatelessExecutor { public override void DoGet(HttpRequest request, HttpResponse response) { - response.AddHeader("Content-Type", "text/plain"); response.SetBody("ok"); } } diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs index 1e1fa123..ba3e71cd 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs @@ -17,7 +17,6 @@ public override void DoPost(HttpRequest request, HttpResponse response) if (last) { - response.AddHeader("Content-Type", "text/plain"); response.SetBody($"{currentSize}"); } } @@ -25,7 +24,6 @@ public override void DoPost(HttpRequest request, HttpResponse response) { currentSize = request.GetHttpBody().Length; - response.AddHeader("Content-Type", "text/plain"); response.SetBody($"{currentSize}"); } } From 3835357b614689e1097d3790ed3a091aec656f14 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Mon, 11 May 2026 03:19:24 +0500 Subject: [PATCH 29/38] Add web-framework-cc --- frameworks/web-framework-cc/Dockerfile | 20 +++ frameworks/web-framework-cc/meta.json | 11 ++ .../web_framework_benchmark}/.gitignore | 0 .../web_framework_benchmark/CMakeLists.txt | 28 +++++ .../executors/CMakeLists.txt | 20 +++ .../executors/src/baseline11.c | 97 ++++++++++++++ .../executors/src/json_executor.c | 118 ++++++++++++++++++ .../executors/src/pipeline.c | 10 ++ .../executors/src/upload.c | 60 +++++++++ .../executors/src/ws.c | 45 +++++++ .../executors/web.json | 28 +++++ .../server/CMakeLists.txt | 16 +++ .../server/config.json | 0 .../web_framework_benchmark/server/server.c | 86 +++++++++++++ frameworks/web-framework-cpp/Dockerfile | 2 +- .../web_framework_benchmark}/.gitignore | 0 .../CMakeLists.txt | 0 .../executors/CMakeLists.txt | 0 .../executors/include/Baseline11.hpp | 0 .../executors/include/JsonExecutor.hpp | 0 .../executors/include/Pipeline.hpp | 0 .../executors/include/Upload.hpp | 0 .../executors/include/Ws.hpp | 0 .../executors/src/Baseline11.cpp | 0 .../executors/src/JsonExecutor.cpp | 0 .../executors/src/Pipeline.cpp | 0 .../executors/src/Upload.cpp | 0 .../executors/src/Ws.cpp | 0 .../executors/web.json | 0 .../server/CMakeLists.txt | 0 .../server/config.json | 25 ++++ .../server/server.cpp | 0 frameworks/web-framework-python/Dockerfile | 2 +- .../web_framework_benchmark/.gitignore | 3 + .../CMakeLists.txt | 0 .../executors/CMakeLists.txt | 0 .../executors/app/Baseline11.py | 0 .../executors/app/JsonExecutor.py | 0 .../executors/app/Pipeline.py | 0 .../executors/app/Upload.py | 0 .../executors/app/Ws.py | 0 .../executors/web.json | 0 .../server/CMakeLists.txt | 0 .../server/config.json | 0 .../server/server.py | 0 45 files changed, 569 insertions(+), 2 deletions(-) create mode 100644 frameworks/web-framework-cc/Dockerfile create mode 100644 frameworks/web-framework-cc/meta.json rename frameworks/{web-framework-cpp/web-framework-benchmark => web-framework-cc/web_framework_benchmark}/.gitignore (100%) create mode 100644 frameworks/web-framework-cc/web_framework_benchmark/CMakeLists.txt create mode 100644 frameworks/web-framework-cc/web_framework_benchmark/executors/CMakeLists.txt create mode 100644 frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c create mode 100644 frameworks/web-framework-cc/web_framework_benchmark/executors/src/json_executor.c create mode 100644 frameworks/web-framework-cc/web_framework_benchmark/executors/src/pipeline.c create mode 100644 frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c create mode 100644 frameworks/web-framework-cc/web_framework_benchmark/executors/src/ws.c create mode 100644 frameworks/web-framework-cc/web_framework_benchmark/executors/web.json create mode 100644 frameworks/web-framework-cc/web_framework_benchmark/server/CMakeLists.txt rename frameworks/{web-framework-cpp/web-framework-benchmark => web-framework-cc/web_framework_benchmark}/server/config.json (100%) create mode 100644 frameworks/web-framework-cc/web_framework_benchmark/server/server.c rename frameworks/{web-framework-python/web-framework-benchmark => web-framework-cpp/web_framework_benchmark}/.gitignore (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/CMakeLists.txt (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/CMakeLists.txt (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/include/Baseline11.hpp (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/include/JsonExecutor.hpp (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/include/Pipeline.hpp (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/include/Upload.hpp (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/include/Ws.hpp (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/src/Baseline11.cpp (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/src/JsonExecutor.cpp (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/src/Pipeline.cpp (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/src/Upload.cpp (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/src/Ws.cpp (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/executors/web.json (100%) rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/server/CMakeLists.txt (100%) create mode 100644 frameworks/web-framework-cpp/web_framework_benchmark/server/config.json rename frameworks/web-framework-cpp/{web-framework-benchmark => web_framework_benchmark}/server/server.cpp (100%) create mode 100644 frameworks/web-framework-python/web_framework_benchmark/.gitignore rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/CMakeLists.txt (100%) rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/executors/CMakeLists.txt (100%) rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/executors/app/Baseline11.py (100%) rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/executors/app/JsonExecutor.py (100%) rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/executors/app/Pipeline.py (100%) rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/executors/app/Upload.py (100%) rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/executors/app/Ws.py (100%) rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/executors/web.json (100%) rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/server/CMakeLists.txt (100%) rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/server/config.json (100%) rename frameworks/web-framework-python/{web-framework-benchmark => web_framework_benchmark}/server/server.py (100%) diff --git a/frameworks/web-framework-cc/Dockerfile b/frameworks/web-framework-cc/Dockerfile new file mode 100644 index 00000000..9b049b42 --- /dev/null +++ b/frameworks/web-framework-cc/Dockerfile @@ -0,0 +1,20 @@ +FROM ubuntu:26.04 AS build + +RUN apt update +RUN apt install -y uuid-dev cmake gcc g++ git unzip zip wget ninja-build + +COPY web_framework_benchmark/ /app + +WORKDIR /app + +RUN mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=bin -DCMAKE_CXX_FLAGS="-march=native" -DCMAKE_C_FLAGS="-march=native" -G "Ninja" .. && cmake --build . -j && cmake --install . + +FROM ubuntu:26.04 + +ENV LD_LIBRARY_PATH=/app + +COPY --from=build /app/build/bin /app + +WORKDIR /app + +CMD ["./server"] diff --git a/frameworks/web-framework-cc/meta.json b/frameworks/web-framework-cc/meta.json new file mode 100644 index 00000000..50c8ef56 --- /dev/null +++ b/frameworks/web-framework-cc/meta.json @@ -0,0 +1,11 @@ +{ + "display_name": "WebFramework C", + "language": "C", + "engine": "WebFramework", + "type": "production", + "description": "Web framework in C++ with different language APIs(Python, C, C++, C#)", + "repo": "https://github.com/LazyPanda07/WebFramework", + "enabled": true, + "tests": [ "baseline", "limited-conn", "pipelined", "json", "upload", "static", "echo-ws" ], + "maintainers": "LazyPanda07" +} \ No newline at end of file diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/.gitignore b/frameworks/web-framework-cc/web_framework_benchmark/.gitignore similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/.gitignore rename to frameworks/web-framework-cc/web_framework_benchmark/.gitignore diff --git a/frameworks/web-framework-cc/web_framework_benchmark/CMakeLists.txt b/frameworks/web-framework-cc/web_framework_benchmark/CMakeLists.txt new file mode 100644 index 00000000..554d2674 --- /dev/null +++ b/frameworks/web-framework-cc/web_framework_benchmark/CMakeLists.txt @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 4.0.0) + +set(CMAKE_CXX_STANDARD 23) + +set(AS_DEPENDENCY ON) +set(WITH_PYTHON_EXECUTORS OFF) +set(WITH_DOTNET_EXECUTORS OFF) +set(BUILD_CXX_API OFF) +set(BUILD_PYTHON_API OFF) +set(BUILD_CSHARP_API OFF) + +set(WEB_FRAMEWORK_VERSION 3.4.1) + +project(web_framework_benchmark) + +include(FetchContent) + +FetchContent_Declare( + WebFramework + GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework.git + # GIT_TAG v${WEB_FRAMEWORK_VERSION} + GIT_TAG dev +) + +FetchContent_MakeAvailable(WebFramework) + +add_subdirectory(server) +add_subdirectory(executors) diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/CMakeLists.txt b/frameworks/web-framework-cc/web_framework_benchmark/executors/CMakeLists.txt new file mode 100644 index 00000000..d84db722 --- /dev/null +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 4.0.0) + +project(executors) + +add_library( + ${PROJECT_NAME} SHARED + src/baseline11.c + src/json_executor.c + src/pipeline.c + src/upload.c + src/ws.c +) + +target_link_libraries( + ${PROJECT_NAME} PRIVATE + CC_API +) + +install(TARGETS ${PROJECT_NAME} DESTINATION .) +install(FILES web.json DESTINATION .) diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c new file mode 100644 index 00000000..ce4555f7 --- /dev/null +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c @@ -0,0 +1,97 @@ +#include + +static void parse_values(http_request_t request, int* a, int* b); + +DEFINE_DEFAULT_EXECUTOR(baseline_t, STATELESS_EXECUTOR) + +DEFINE_EXECUTOR_METHOD(baseline_t, GET_METHOD, request, response) +{ + int a; + int b; + + parse_values(request, &a, &b); + + char buffer[32]; + + memset(buffer, 0, sizeof(buffer)); + snprintf(buffer, sizeof(buffer), "%d", a + b); + + wf_set_body(response, buffer, sizeof(buffer)); +} + +DEFINE_EXECUTOR_METHOD(baseline_t, POST_METHOD, request, response) +{ + int a; + int b; + int c; + bool chunked = false; + http_header_t* headers = NULL; + size_t size; + + parse_values(request, &a, &b); + + wf_get_http_headers(request, &headers, &size); + + for (size_t i = 0; i < size; i++) + { + if (!strcmp(headers[i].key, "Transfer-Encoding")) + { + chunked = true; + + break; + } + } + + if (chunked) + { + http_chunk_t* chunks; + size_t size; + + wf_get_chunks(request, &chunks, &size); + + c = atoi(chunks[0].data); + + free(chunks); + } + else + { + const char* body; + size_t size; + + wf_get_http_body(request, &body, &size); + + c = atoi(body); + } + + char buffer[32]; + + memset(buffer, 0, sizeof(buffer)); + snprintf(buffer, sizeof(buffer), "%d", a + b + c); + + free(headers); + + wf_set_body(response, buffer, sizeof(buffer)); +} + +void parse_values(http_request_t request, int* a, int* b) +{ + query_parameter_t* query_parameters = NULL; + size_t size; + + wf_get_query_parameters(request, &query_parameters, &size); + + for (size_t i = 0; i < size; i++) + { + if (!strcmp(query_parameters[i].key, "a")) + { + *a = atoi(query_parameters[i].value); + } + else if (!strcmp(query_parameters[i].key, "b")) + { + *b = atoi(query_parameters[i].value); + } + } +} + +DEFINE_EXECUTOR(baseline_t) +DEFINE_INITIALIZE_WEB_FRAMEWORK() diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/json_executor.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/json_executor.c new file mode 100644 index 00000000..da57c7f8 --- /dev/null +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/json_executor.c @@ -0,0 +1,118 @@ +#include + +typedef struct json_executor +{ + json_object_t items; + size_t size; +} json_executor_t; + +DEFINE_EXECUTOR(json_executor_t, STATELESS_EXECUTOR) + +DEFINE_EXECUTOR_INIT(json_executor_t) +{ + json_executor_t* self = (json_executor_t*)executor; + char* data; + size_t size; + + wf_get_file_executor_settings(settings, "dataset.json", &data, &size); + + json_parser_t parser; + json_object_t parsed_data; + + wf_create_json_parser_from_string(data, &parser); + wf_create_json_object(&self->items); + + wf_get_json_parser_parsed_data(parser, &parsed_data, true); + wf_copy_json_object_array(&parsed_data, &self->items, &self->size); + + free(data); + wf_delete_json_parser(parser); +} + +DEFINE_EXECUTOR_METHOD(json_executor_t, GET_METHOD, request, response) +{ + json_executor_t* self = (json_executor_t*)executor; + query_parameter_t* query_parameters; + size_t size; + int64_t count = 0; + int64_t multiplier = 0; + json_builder_t result; + + wf_create_json_builder(&result); + + wf_get_query_parameters(request, &query_parameters, &size); + + for (size_t i = 0; i < size; i++) + { + if (!strcmp(query_parameters[i].key, "m")) + { + multiplier = atoll(query_parameters[i].value); + + break; + } + } + + wf_get_route_integer_parameter(request, "count", &count); + + json_object_t* array = (json_object_t*)malloc(sizeof(json_object_t) * count); + + for (int i = 0; i < count; i++) + { + json_object_t temp; + int64_t calculated; + + { + json_object_t item; + + wf_index_access_json_object_array(&self->items, i, &item); + + wf_copy_json_object(&temp, &item); + } + + { + json_object_t current; + + wf_assign_or_get_json_object(&temp, "price", ¤t); + wf_get_json_object_integer(¤t, &calculated); + } + + + { + json_object_t current; + int64_t value; + + wf_assign_or_get_json_object(&temp, "quantity", ¤t); + wf_get_json_object_integer(¤t, &value); + + calculated *= value; + } + + calculated *= multiplier; + + { + json_object_t total; + + wf_assign_or_get_json_object(&temp, "total", &total); + + wf_set_json_object_integer(&total, calculated); + } + + array[i] = temp; + } + + wf_append_json_builder_integer(result, "count", count); + wf_append_json_builder_array(result, "items", array, count); + + wf_set_json_body(response, result); + + free(query_parameters); + + for (int i = 0; i < count; i++) + { + wf_delete_json_object(&array[i]); + } + + free(array); + + wf_delete_json_builder(result); +} diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/pipeline.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/pipeline.c new file mode 100644 index 00000000..90d2f58d --- /dev/null +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/pipeline.c @@ -0,0 +1,10 @@ +#include + +DEFINE_DEFAULT_EXECUTOR(pipeline_t, STATELESS_EXECUTOR) + +DEFINE_EXECUTOR_METHOD(pipeline_t, GET_METHOD, request, response) +{ + const char ok[] = "ok"; + + wf_set_body(response, ok, strlen(ok)); +} diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c new file mode 100644 index 00000000..f87c4b2b --- /dev/null +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c @@ -0,0 +1,60 @@ +#include + +#define THRESHOLD_SIZE 5242880 + +typedef struct upload +{ + int current_size; +} upload_t; + +DEFINE_EXECUTOR(upload_t, HEAVY_OPERATION_STATEFUL_EXECUTOR) + +DEFINE_EXECUTOR_INIT(upload_t) +{ + ((upload_t*)executor)->current_size = 0; +} + +DEFINE_EXECUTOR_METHOD(upload_t, POST_METHOD, request, response) +{ + upload_t* self = (upload_t*)executor; + const char* contentLength; + + wf_get_http_header(request, "Content-Length", &contentLength); + + if (atoi(contentLength) >= THRESHOLD_SIZE) + { + large_data_t* data = NULL; + + wf_get_large_data(request, &data); + + self->current_size += data->data_part_size; + + if (data->is_last_packet) + { + const char buffer[32]; + + memset(buffer, 0, sizeof(buffer)); + + snprintf(buffer, sizeof(buffer), "%d", self->current_size); + + wf_set_body(response, buffer, sizeof(buffer)); + } + } + else + { + const char* body; + size_t size; + + wf_get_http_body(request, &body, &size); + + self->current_size += size; + + const char buffer[32]; + + memset(buffer, 0, sizeof(buffer)); + + snprintf(buffer, sizeof(buffer), "%d", self->current_size); + + wf_set_body(response, buffer, sizeof(buffer)); + } +} diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/ws.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/ws.c new file mode 100644 index 00000000..c10e0735 --- /dev/null +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/ws.c @@ -0,0 +1,45 @@ +#include +#include + +DEFINE_DEFAULT_EXECUTOR(ws_t, STATELESS_EXECUTOR) + +DEFINE_EXECUTOR_METHOD(ws_t, GET_METHOD, request, response) +{ + wf_set_http_response_code(response, BAD_REQUEST); +} + +DEFINE_DEFAULT_WEB_SOCKET_EXECUTOR(web_socket_echo_t); + +DEFINE_WEB_SOCKET_EXECUTOR_ON_RECEIVE(web_socket_echo_t) +{ + web_socket_frame_t frame = WF_GET_WEB_SOCKET_FRAME(); + web_socket_frame_type_t type; + char* payload; + uint64_t size; + + wf_web_socket_frame_get_type(frame, &type); + wf_web_socket_frame_get_payload(frame, &payload, &size); + + switch (type) + { + case FRAME_TYPE_TEXT: + case FRAME_TYPE_BINARY: + WF_SEND_WEB_SOCKET_FRAME(payload, size, type); + + break; + + case FRAME_TYPE_CLOSE: + { + uint16_t code = 1000; + const char message[] = "validate done"; + const char data[sizeof(code) + sizeof(message)]; + + memcpy(data, &code, sizeof(code)); + memcpy(data + sizeof(code), message, sizeof(message)); + + WF_SEND_WEB_SOCKET_FRAME(data, sizeof(data), type); + } + + break; + } +} diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/web.json b/frameworks/web-framework-cc/web_framework_benchmark/executors/web.json new file mode 100644 index 00000000..ddf93dbc --- /dev/null +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/web.json @@ -0,0 +1,28 @@ +{ + "baseline11_t": { + "api": "cc", + "loadType": "initialization", + "route": "baseline11" + }, + "json_executor_t": { + "api": "cc", + "loadType": "initialization", + "route": "json/{int:count}" + }, + "pipeline_t": { + "api": "cc", + "loadType": "initialization", + "route": "pipeline" + }, + "upload_t": { + "api": "cc", + "loadType": "dynamic", + "route": "upload" + }, + "ws_t": { + "api": "cc", + "loadType": "initialization", + "route": "ws", + "webSocketExecutorName": "web_socket_echo_t" + } +} \ No newline at end of file diff --git a/frameworks/web-framework-cc/web_framework_benchmark/server/CMakeLists.txt b/frameworks/web-framework-cc/web_framework_benchmark/server/CMakeLists.txt new file mode 100644 index 00000000..b3fdd3d5 --- /dev/null +++ b/frameworks/web-framework-cc/web_framework_benchmark/server/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 4.0.0) + +project(server) + +add_executable( + ${PROJECT_NAME} + server.c +) + +target_link_libraries( + ${PROJECT_NAME} PRIVATE + CC_API +) + +install(TARGETS ${PROJECT_NAME} DESTINATION .) +install(FILES config.json DESTINATION .) diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/server/config.json b/frameworks/web-framework-cc/web_framework_benchmark/server/config.json similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/server/config.json rename to frameworks/web-framework-cc/web_framework_benchmark/server/config.json diff --git a/frameworks/web-framework-cc/web_framework_benchmark/server/server.c b/frameworks/web-framework-cc/web_framework_benchmark/server/server.c new file mode 100644 index 00000000..1d6eea78 --- /dev/null +++ b/frameworks/web-framework-cc/web_framework_benchmark/server/server.c @@ -0,0 +1,86 @@ +#include +#include + +#include + +static void on_start(); + +int main(int argc, char** argv) +{ + wf_initialize_web_framework("WebFramework"); + + config_t config; + const char* ptr = getenv("THREADS"); + + web_framework_exception_t exception = wf_create_config_from_path("config.json", &config); + + if (exception) + { + fprintf(stderr, "%s\n", wf_get_error_message(exception)); + + wf_delete_web_framework_exception(exception); + + return 1; + } + + if (ptr) + { + int64_t value = atoll(ptr); + + if (value > 8) + { + exception = wf_override_configuration_integer(config, "threadCount", value - 8, true); + } + } + + if (exception) + { + fprintf(stderr, "%s\n", wf_get_error_message(exception)); + + wf_delete_config(config); + wf_delete_web_framework_exception(exception); + + return 2; + } + + ptr = getenv("H2THREADS"); + + if (ptr) + { + // TODO: HTTP/2.0 + } + + web_framework_t server; + + exception = wf_create_web_framework_from_config(config, &server); + + if (exception) + { + fprintf(stderr, "%s\n", wf_get_error_message(exception)); + + wf_delete_config(config); + wf_delete_web_framework_exception(exception); + + return 3; + } + + exception = wf_start_web_framework_server(server, true, on_start); + + if (exception) + { + fprintf(stderr, "%s\n", wf_get_error_message(exception)); + + wf_delete_config(config); + wf_delete_web_framework(server); + wf_delete_web_framework_exception(exception); + + return 4; + } + + return 0; +} + +void on_start() +{ + printf("Server is running...\n"); +} diff --git a/frameworks/web-framework-cpp/Dockerfile b/frameworks/web-framework-cpp/Dockerfile index 601aaa5e..9b049b42 100644 --- a/frameworks/web-framework-cpp/Dockerfile +++ b/frameworks/web-framework-cpp/Dockerfile @@ -3,7 +3,7 @@ FROM ubuntu:26.04 AS build RUN apt update RUN apt install -y uuid-dev cmake gcc g++ git unzip zip wget ninja-build -COPY web-framework-benchmark/ /app +COPY web_framework_benchmark/ /app WORKDIR /app diff --git a/frameworks/web-framework-python/web-framework-benchmark/.gitignore b/frameworks/web-framework-cpp/web_framework_benchmark/.gitignore similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/.gitignore rename to frameworks/web-framework-cpp/web_framework_benchmark/.gitignore diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-cpp/web_framework_benchmark/CMakeLists.txt similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/CMakeLists.txt rename to frameworks/web-framework-cpp/web_framework_benchmark/CMakeLists.txt diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt b/frameworks/web-framework-cpp/web_framework_benchmark/executors/CMakeLists.txt similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/CMakeLists.txt rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/CMakeLists.txt diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Baseline11.hpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Baseline11.hpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Baseline11.hpp rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Baseline11.hpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/JsonExecutor.hpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/include/JsonExecutor.hpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/include/JsonExecutor.hpp rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/include/JsonExecutor.hpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Pipeline.hpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Pipeline.hpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Pipeline.hpp rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Pipeline.hpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Upload.hpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Upload.hpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Upload.hpp rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Upload.hpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Ws.hpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Ws.hpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/include/Ws.hpp rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Ws.hpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Baseline11.cpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Baseline11.cpp rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Baseline11.cpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/JsonExecutor.cpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/src/JsonExecutor.cpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/src/JsonExecutor.cpp rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/src/JsonExecutor.cpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Pipeline.cpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Pipeline.cpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Pipeline.cpp rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Pipeline.cpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Upload.cpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Upload.cpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Upload.cpp rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Upload.cpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Ws.cpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Ws.cpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/src/Ws.cpp rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Ws.cpp diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json b/frameworks/web-framework-cpp/web_framework_benchmark/executors/web.json similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/executors/web.json rename to frameworks/web-framework-cpp/web_framework_benchmark/executors/web.json diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/server/CMakeLists.txt b/frameworks/web-framework-cpp/web_framework_benchmark/server/CMakeLists.txt similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/server/CMakeLists.txt rename to frameworks/web-framework-cpp/web_framework_benchmark/server/CMakeLists.txt diff --git a/frameworks/web-framework-cpp/web_framework_benchmark/server/config.json b/frameworks/web-framework-cpp/web_framework_benchmark/server/config.json new file mode 100644 index 00000000..da629be7 --- /dev/null +++ b/frameworks/web-framework-cpp/web_framework_benchmark/server/config.json @@ -0,0 +1,25 @@ +{ + "WebServer": { + "ip": "0.0.0.0", + "port": 8080, + "timeout": 30000 + }, + "WebFramework": { + "assetsPath": "/data", + "templatesPath": "templates", + "webServerType": "threadPool", + "settingsPaths": [ "web.json" ], + "loadSources": [ "executors" ], + "HTTPS": { + "pathToCertificate": "/certs/server.crt", + "pathToKey": "/certs/server.key", + "useHTTPS": false + }, + "resourcesThreads": 8, + "largeBodySizeThreshold": 5242880, + "largeBodyPacketSize": 1048576 + }, + "ThreadPoolServer": { + "threadCount": 8 + } +} \ No newline at end of file diff --git a/frameworks/web-framework-cpp/web-framework-benchmark/server/server.cpp b/frameworks/web-framework-cpp/web_framework_benchmark/server/server.cpp similarity index 100% rename from frameworks/web-framework-cpp/web-framework-benchmark/server/server.cpp rename to frameworks/web-framework-cpp/web_framework_benchmark/server/server.cpp diff --git a/frameworks/web-framework-python/Dockerfile b/frameworks/web-framework-python/Dockerfile index 96a96339..2cb4a0df 100644 --- a/frameworks/web-framework-python/Dockerfile +++ b/frameworks/web-framework-python/Dockerfile @@ -4,7 +4,7 @@ RUN apt update RUN apt install -y uuid-dev cmake gcc g++ git unzip zip wget ninja-build python3 python3-venv python3-pip RUN python3 -m pip install build --break-system-packages -COPY web-framework-benchmark/ /app +COPY web_framework_benchmark/ /app WORKDIR /app diff --git a/frameworks/web-framework-python/web_framework_benchmark/.gitignore b/frameworks/web-framework-python/web_framework_benchmark/.gitignore new file mode 100644 index 00000000..7ddb7100 --- /dev/null +++ b/frameworks/web-framework-python/web_framework_benchmark/.gitignore @@ -0,0 +1,3 @@ +# Binaries +out/ +build/ diff --git a/frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt b/frameworks/web-framework-python/web_framework_benchmark/CMakeLists.txt similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/CMakeLists.txt rename to frameworks/web-framework-python/web_framework_benchmark/CMakeLists.txt diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/CMakeLists.txt b/frameworks/web-framework-python/web_framework_benchmark/executors/CMakeLists.txt similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/executors/CMakeLists.txt rename to frameworks/web-framework-python/web_framework_benchmark/executors/CMakeLists.txt diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Baseline11.py b/frameworks/web-framework-python/web_framework_benchmark/executors/app/Baseline11.py similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/executors/app/Baseline11.py rename to frameworks/web-framework-python/web_framework_benchmark/executors/app/Baseline11.py diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/JsonExecutor.py b/frameworks/web-framework-python/web_framework_benchmark/executors/app/JsonExecutor.py similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/executors/app/JsonExecutor.py rename to frameworks/web-framework-python/web_framework_benchmark/executors/app/JsonExecutor.py diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Pipeline.py b/frameworks/web-framework-python/web_framework_benchmark/executors/app/Pipeline.py similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/executors/app/Pipeline.py rename to frameworks/web-framework-python/web_framework_benchmark/executors/app/Pipeline.py diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py b/frameworks/web-framework-python/web_framework_benchmark/executors/app/Upload.py similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/executors/app/Upload.py rename to frameworks/web-framework-python/web_framework_benchmark/executors/app/Upload.py diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py b/frameworks/web-framework-python/web_framework_benchmark/executors/app/Ws.py similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/executors/app/Ws.py rename to frameworks/web-framework-python/web_framework_benchmark/executors/app/Ws.py diff --git a/frameworks/web-framework-python/web-framework-benchmark/executors/web.json b/frameworks/web-framework-python/web_framework_benchmark/executors/web.json similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/executors/web.json rename to frameworks/web-framework-python/web_framework_benchmark/executors/web.json diff --git a/frameworks/web-framework-python/web-framework-benchmark/server/CMakeLists.txt b/frameworks/web-framework-python/web_framework_benchmark/server/CMakeLists.txt similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/server/CMakeLists.txt rename to frameworks/web-framework-python/web_framework_benchmark/server/CMakeLists.txt diff --git a/frameworks/web-framework-python/web-framework-benchmark/server/config.json b/frameworks/web-framework-python/web_framework_benchmark/server/config.json similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/server/config.json rename to frameworks/web-framework-python/web_framework_benchmark/server/config.json diff --git a/frameworks/web-framework-python/web-framework-benchmark/server/server.py b/frameworks/web-framework-python/web_framework_benchmark/server/server.py similarity index 100% rename from frameworks/web-framework-python/web-framework-benchmark/server/server.py rename to frameworks/web-framework-python/web_framework_benchmark/server/server.py From 2bf85971adc578b599cc8d5339db1c768c81fffe Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Mon, 11 May 2026 03:25:23 +0500 Subject: [PATCH 30/38] Fix --- .../web_framework_benchmark/executors/src/baseline11.c | 1 - .../web_framework_benchmark/executors/src/upload.c | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c index ce4555f7..bd4c1f20 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c @@ -93,5 +93,4 @@ void parse_values(http_request_t request, int* a, int* b) } } -DEFINE_EXECUTOR(baseline_t) DEFINE_INITIALIZE_WEB_FRAMEWORK() diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c index f87c4b2b..a3ea7f54 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c @@ -31,7 +31,7 @@ DEFINE_EXECUTOR_METHOD(upload_t, POST_METHOD, request, response) if (data->is_last_packet) { - const char buffer[32]; + char buffer[32]; memset(buffer, 0, sizeof(buffer)); @@ -49,7 +49,7 @@ DEFINE_EXECUTOR_METHOD(upload_t, POST_METHOD, request, response) self->current_size += size; - const char buffer[32]; + char buffer[32]; memset(buffer, 0, sizeof(buffer)); From 8b862485adf6fd5b435b522fa19216347fb02f17 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Mon, 11 May 2026 03:34:44 +0500 Subject: [PATCH 31/38] Add fflush --- .../web_framework_benchmark/executors/src/upload.c | 2 +- .../web-framework-cc/web_framework_benchmark/server/server.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c index a3ea7f54..a78f30b2 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c @@ -23,7 +23,7 @@ DEFINE_EXECUTOR_METHOD(upload_t, POST_METHOD, request, response) if (atoi(contentLength) >= THRESHOLD_SIZE) { - large_data_t* data = NULL; + const large_data_t* data = NULL; wf_get_large_data(request, &data); diff --git a/frameworks/web-framework-cc/web_framework_benchmark/server/server.c b/frameworks/web-framework-cc/web_framework_benchmark/server/server.c index 1d6eea78..e23eb80b 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/server/server.c +++ b/frameworks/web-framework-cc/web_framework_benchmark/server/server.c @@ -17,6 +17,7 @@ int main(int argc, char** argv) if (exception) { fprintf(stderr, "%s\n", wf_get_error_message(exception)); + fflush(stderr); wf_delete_web_framework_exception(exception); @@ -36,6 +37,7 @@ int main(int argc, char** argv) if (exception) { fprintf(stderr, "%s\n", wf_get_error_message(exception)); + fflush(stderr); wf_delete_config(config); wf_delete_web_framework_exception(exception); @@ -57,6 +59,7 @@ int main(int argc, char** argv) if (exception) { fprintf(stderr, "%s\n", wf_get_error_message(exception)); + fflush(stderr); wf_delete_config(config); wf_delete_web_framework_exception(exception); @@ -69,6 +72,7 @@ int main(int argc, char** argv) if (exception) { fprintf(stderr, "%s\n", wf_get_error_message(exception)); + fflush(stderr); wf_delete_config(config); wf_delete_web_framework(server); From 9bd544fa900fac1558b88c84d048e5bec2d26b2b Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Mon, 11 May 2026 03:58:44 +0500 Subject: [PATCH 32/38] Refactor --- .../web_framework_benchmark/server/server.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/frameworks/web-framework-cc/web_framework_benchmark/server/server.c b/frameworks/web-framework-cc/web_framework_benchmark/server/server.c index e23eb80b..e7ef9d79 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/server/server.c +++ b/frameworks/web-framework-cc/web_framework_benchmark/server/server.c @@ -16,8 +16,7 @@ int main(int argc, char** argv) if (exception) { - fprintf(stderr, "%s\n", wf_get_error_message(exception)); - fflush(stderr); + printf("%s\n", wf_get_error_message(exception)); wf_delete_web_framework_exception(exception); @@ -36,8 +35,7 @@ int main(int argc, char** argv) if (exception) { - fprintf(stderr, "%s\n", wf_get_error_message(exception)); - fflush(stderr); + printf("%s\n", wf_get_error_message(exception)); wf_delete_config(config); wf_delete_web_framework_exception(exception); @@ -58,8 +56,7 @@ int main(int argc, char** argv) if (exception) { - fprintf(stderr, "%s\n", wf_get_error_message(exception)); - fflush(stderr); + printf("%s\n", wf_get_error_message(exception)); wf_delete_config(config); wf_delete_web_framework_exception(exception); @@ -71,8 +68,7 @@ int main(int argc, char** argv) if (exception) { - fprintf(stderr, "%s\n", wf_get_error_message(exception)); - fflush(stderr); + printf("%s\n", wf_get_error_message(exception)); wf_delete_config(config); wf_delete_web_framework(server); From 372bd8fef2e502be721dc6acd75c97da531b2d8b Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Mon, 11 May 2026 04:07:42 +0500 Subject: [PATCH 33/38] Refactor --- .../web_framework_benchmark/server/server.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/web-framework-cc/web_framework_benchmark/server/server.c b/frameworks/web-framework-cc/web_framework_benchmark/server/server.c index e7ef9d79..1d6eea78 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/server/server.c +++ b/frameworks/web-framework-cc/web_framework_benchmark/server/server.c @@ -16,7 +16,7 @@ int main(int argc, char** argv) if (exception) { - printf("%s\n", wf_get_error_message(exception)); + fprintf(stderr, "%s\n", wf_get_error_message(exception)); wf_delete_web_framework_exception(exception); @@ -35,7 +35,7 @@ int main(int argc, char** argv) if (exception) { - printf("%s\n", wf_get_error_message(exception)); + fprintf(stderr, "%s\n", wf_get_error_message(exception)); wf_delete_config(config); wf_delete_web_framework_exception(exception); @@ -56,7 +56,7 @@ int main(int argc, char** argv) if (exception) { - printf("%s\n", wf_get_error_message(exception)); + fprintf(stderr, "%s\n", wf_get_error_message(exception)); wf_delete_config(config); wf_delete_web_framework_exception(exception); @@ -68,7 +68,7 @@ int main(int argc, char** argv) if (exception) { - printf("%s\n", wf_get_error_message(exception)); + fprintf(stderr, "%s\n", wf_get_error_message(exception)); wf_delete_config(config); wf_delete_web_framework(server); From de783d9eaa3f70a5d0666b725c062b5799270ac4 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Mon, 11 May 2026 04:13:07 +0500 Subject: [PATCH 34/38] Fix --- .../web_framework_benchmark/executors/src/baseline11.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c index bd4c1f20..3eb719db 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/baseline11.c @@ -2,9 +2,9 @@ static void parse_values(http_request_t request, int* a, int* b); -DEFINE_DEFAULT_EXECUTOR(baseline_t, STATELESS_EXECUTOR) +DEFINE_DEFAULT_EXECUTOR(baseline11_t, STATELESS_EXECUTOR) -DEFINE_EXECUTOR_METHOD(baseline_t, GET_METHOD, request, response) +DEFINE_EXECUTOR_METHOD(baseline11_t, GET_METHOD, request, response) { int a; int b; @@ -19,7 +19,7 @@ DEFINE_EXECUTOR_METHOD(baseline_t, GET_METHOD, request, response) wf_set_body(response, buffer, sizeof(buffer)); } -DEFINE_EXECUTOR_METHOD(baseline_t, POST_METHOD, request, response) +DEFINE_EXECUTOR_METHOD(baseline11_t, POST_METHOD, request, response) { int a; int b; From dad7df0ccb6d70313109da3b170a5aea8628e107 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Mon, 11 May 2026 18:19:46 +0500 Subject: [PATCH 35/38] Update versions --- .../web-framework-cc/web_framework_benchmark/CMakeLists.txt | 5 ++--- .../web-framework-cpp/web_framework_benchmark/CMakeLists.txt | 2 +- .../web_framework_benchmark/Executors/Executors.csproj | 2 +- .../web_framework_benchmark/Server/Server.csproj | 2 +- .../web_framework_benchmark/CMakeLists.txt | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/frameworks/web-framework-cc/web_framework_benchmark/CMakeLists.txt b/frameworks/web-framework-cc/web_framework_benchmark/CMakeLists.txt index 554d2674..8d7d325d 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/CMakeLists.txt +++ b/frameworks/web-framework-cc/web_framework_benchmark/CMakeLists.txt @@ -9,7 +9,7 @@ set(BUILD_CXX_API OFF) set(BUILD_PYTHON_API OFF) set(BUILD_CSHARP_API OFF) -set(WEB_FRAMEWORK_VERSION 3.4.1) +set(WEB_FRAMEWORK_VERSION 3.4.2) project(web_framework_benchmark) @@ -18,8 +18,7 @@ include(FetchContent) FetchContent_Declare( WebFramework GIT_REPOSITORY https://github.com/LazyPanda07/WebFramework.git - # GIT_TAG v${WEB_FRAMEWORK_VERSION} - GIT_TAG dev + GIT_TAG v${WEB_FRAMEWORK_VERSION} ) FetchContent_MakeAvailable(WebFramework) diff --git a/frameworks/web-framework-cpp/web_framework_benchmark/CMakeLists.txt b/frameworks/web-framework-cpp/web_framework_benchmark/CMakeLists.txt index 66325f8f..ce24d994 100644 --- a/frameworks/web-framework-cpp/web_framework_benchmark/CMakeLists.txt +++ b/frameworks/web-framework-cpp/web_framework_benchmark/CMakeLists.txt @@ -9,7 +9,7 @@ set(BUILD_CC_API OFF) set(BUILD_PYTHON_API OFF) set(BUILD_CSHARP_API OFF) -set(WEB_FRAMEWORK_VERSION 3.4.1) +set(WEB_FRAMEWORK_VERSION 3.4.2) project(web_framework_benchmark) diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj index cbfc7eb1..ec3ad914 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Executors.csproj @@ -7,7 +7,7 @@ - + diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj index 583a6be9..1f2803f3 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Server/Server.csproj @@ -8,7 +8,7 @@ - + diff --git a/frameworks/web-framework-python/web_framework_benchmark/CMakeLists.txt b/frameworks/web-framework-python/web_framework_benchmark/CMakeLists.txt index fac540b3..c5bb30d3 100644 --- a/frameworks/web-framework-python/web_framework_benchmark/CMakeLists.txt +++ b/frameworks/web-framework-python/web_framework_benchmark/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 4.0.0) set(CMAKE_BUILD_TYPE Release) -set(WEB_FRAMEWORK_VERSION 3.4.1) +set(WEB_FRAMEWORK_VERSION 3.4.2) set(WITH_PYTHON_EXECUTORS ON) set(WITH_DOTNET_EXECUTORS OFF) From c64a4e2d7d84e2d5a4d42e28dab1946c0e27cb28 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Tue, 12 May 2026 00:50:30 +0500 Subject: [PATCH 36/38] Refactor --- .../web_framework_benchmark/executors/src/upload.c | 2 +- .../executors/include/Upload.hpp | 4 ++-- .../web_framework_benchmark/Executors/Upload.cs | 11 ++++++++--- .../web_framework_benchmark/executors/app/Upload.py | 4 ++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c index a78f30b2..4566f702 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c @@ -7,7 +7,7 @@ typedef struct upload int current_size; } upload_t; -DEFINE_EXECUTOR(upload_t, HEAVY_OPERATION_STATEFUL_EXECUTOR) +DEFINE_EXECUTOR(upload_t, STATEFUL_EXECUTOR) DEFINE_EXECUTOR_INIT(upload_t) { diff --git a/frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Upload.hpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Upload.hpp index fe33ec62..d1ef68f6 100644 --- a/frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Upload.hpp +++ b/frameworks/web-framework-cpp/web_framework_benchmark/executors/include/Upload.hpp @@ -1,10 +1,10 @@ #pragma once -#include +#include namespace executor { - class Upload : public framework::HeavyOperationStatefulExecutor + class Upload : public framework::StatefulExecutor { private: size_t currentSize; diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs index ba3e71cd..1e6f57f3 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs @@ -2,14 +2,19 @@ using Framework; -public class Upload : HeavyOperationStatefulExecutor +public class Upload : StatefulExecutor { - private const int thresholdSize = 5242880; private int currentSize = 0; public override void DoPost(HttpRequest request, HttpResponse response) { - if (int.Parse(request.GetHeaders()["Content-Length"]) >= thresholdSize) + const int thresholdSize = 5242880; + + IDictionary headers = request.GetHeaders(); + string temp = headers["Content-Length"]; + int contentLength = int.Parse(temp); + + if (contentLength >= thresholdSize) { var (data, last) = request.GetLargeData(); diff --git a/frameworks/web-framework-python/web_framework_benchmark/executors/app/Upload.py b/frameworks/web-framework-python/web_framework_benchmark/executors/app/Upload.py index 44af99cf..6e89b024 100644 --- a/frameworks/web-framework-python/web_framework_benchmark/executors/app/Upload.py +++ b/frameworks/web-framework-python/web_framework_benchmark/executors/app/Upload.py @@ -1,7 +1,7 @@ -from web_framework_api import HeavyOperationStatefulExecutor +from web_framework_api import StatefulExecutor -class Upload(HeavyOperationStatefulExecutor): +class Upload(StatefulExecutor): def __init__(self): super().__init__() From e471ca07dc71f61c7b76d521b9f05fe03f34f1bb Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Tue, 12 May 2026 01:07:19 +0500 Subject: [PATCH 37/38] Update size --- .../executors/src/upload.c | 2 +- .../server/config.json | 2 +- .../executors/src/Upload.cpp | 2 +- .../server/config.json | 2 +- .../Executors/Upload.cs | 20 +++++++++++++------ .../Server/config.json | 2 +- .../executors/app/Upload.py | 2 +- .../server/config.json | 2 +- 8 files changed, 21 insertions(+), 13 deletions(-) diff --git a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c index 4566f702..cef0cf47 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c +++ b/frameworks/web-framework-cc/web_framework_benchmark/executors/src/upload.c @@ -1,6 +1,6 @@ #include -#define THRESHOLD_SIZE 5242880 +#define THRESHOLD_SIZE 102400 typedef struct upload { diff --git a/frameworks/web-framework-cc/web_framework_benchmark/server/config.json b/frameworks/web-framework-cc/web_framework_benchmark/server/config.json index da629be7..bc6375bb 100644 --- a/frameworks/web-framework-cc/web_framework_benchmark/server/config.json +++ b/frameworks/web-framework-cc/web_framework_benchmark/server/config.json @@ -16,7 +16,7 @@ "useHTTPS": false }, "resourcesThreads": 8, - "largeBodySizeThreshold": 5242880, + "largeBodySizeThreshold": 102400, "largeBodyPacketSize": 1048576 }, "ThreadPoolServer": { diff --git a/frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Upload.cpp b/frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Upload.cpp index 769a1592..512c07fa 100644 --- a/frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Upload.cpp +++ b/frameworks/web-framework-cpp/web_framework_benchmark/executors/src/Upload.cpp @@ -12,7 +12,7 @@ namespace executor void Upload::doPost(framework::HttpRequest& request, framework::HttpResponse& response) { - constexpr size_t thresholdSize = 5242880; + constexpr size_t thresholdSize = 102400; const framework::HttpRequest::HeadersMap& headers = request.getHeaders(); const std::string& temp = headers.at("Content-Length"); diff --git a/frameworks/web-framework-cpp/web_framework_benchmark/server/config.json b/frameworks/web-framework-cpp/web_framework_benchmark/server/config.json index da629be7..bc6375bb 100644 --- a/frameworks/web-framework-cpp/web_framework_benchmark/server/config.json +++ b/frameworks/web-framework-cpp/web_framework_benchmark/server/config.json @@ -16,7 +16,7 @@ "useHTTPS": false }, "resourcesThreads": 8, - "largeBodySizeThreshold": 5242880, + "largeBodySizeThreshold": 102400, "largeBodyPacketSize": 1048576 }, "ThreadPoolServer": { diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs index 1e6f57f3..a20e57fa 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Executors/Upload.cs @@ -4,17 +4,25 @@ public class Upload : StatefulExecutor { - private int currentSize = 0; + private int currentSize; + private bool? isLargeData; public override void DoPost(HttpRequest request, HttpResponse response) { - const int thresholdSize = 5242880; + if (isLargeData == null) + { + const int thresholdSize = 102400; + + currentSize = 0; - IDictionary headers = request.GetHeaders(); - string temp = headers["Content-Length"]; - int contentLength = int.Parse(temp); + IDictionary headers = request.GetHeaders(); + string temp = headers["Content-Length"]; + int contentLength = int.Parse(temp); + + isLargeData = contentLength >= thresholdSize; + } - if (contentLength >= thresholdSize) + if ((bool)isLargeData) { var (data, last) = request.GetLargeData(); diff --git a/frameworks/web-framework-csharp/web_framework_benchmark/Server/config.json b/frameworks/web-framework-csharp/web_framework_benchmark/Server/config.json index 3b80c0e9..64446b3a 100644 --- a/frameworks/web-framework-csharp/web_framework_benchmark/Server/config.json +++ b/frameworks/web-framework-csharp/web_framework_benchmark/Server/config.json @@ -23,7 +23,7 @@ "useHTTPS": false }, "resourcesThreads": 8, - "largeBodySizeThreshold": 5242880, + "largeBodySizeThreshold": 102400, "largeBodyPacketSize": 1048576 }, "ThreadPoolServer": { diff --git a/frameworks/web-framework-python/web_framework_benchmark/executors/app/Upload.py b/frameworks/web-framework-python/web_framework_benchmark/executors/app/Upload.py index 6e89b024..b6e548b4 100644 --- a/frameworks/web-framework-python/web_framework_benchmark/executors/app/Upload.py +++ b/frameworks/web-framework-python/web_framework_benchmark/executors/app/Upload.py @@ -5,7 +5,7 @@ class Upload(StatefulExecutor): def __init__(self): super().__init__() - self._threshold_size = 5242880 + self._threshold_size = 102400 self._current_size = 0 def do_post(self, request, response): diff --git a/frameworks/web-framework-python/web_framework_benchmark/server/config.json b/frameworks/web-framework-python/web_framework_benchmark/server/config.json index f3026c8a..93e5539d 100644 --- a/frameworks/web-framework-python/web_framework_benchmark/server/config.json +++ b/frameworks/web-framework-python/web_framework_benchmark/server/config.json @@ -27,7 +27,7 @@ "useHTTPS": false }, "resourcesThreads": 8, - "largeBodySizeThreshold": 5242880, + "largeBodySizeThreshold": 102400, "largeBodyPacketSize": 1048576 }, "ThreadPoolServer": { From 48004b514d189b5360978198b94b42b413952cb2 Mon Sep 17 00:00:00 2001 From: LazyPanda07 Date: Tue, 12 May 2026 04:33:38 +0500 Subject: [PATCH 38/38] Fix maintainers --- frameworks/web-framework-cc/meta.json | 2 +- frameworks/web-framework-cpp/meta.json | 2 +- frameworks/web-framework-csharp/meta.json | 2 +- frameworks/web-framework-python/meta.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/web-framework-cc/meta.json b/frameworks/web-framework-cc/meta.json index 50c8ef56..6e6caddb 100644 --- a/frameworks/web-framework-cc/meta.json +++ b/frameworks/web-framework-cc/meta.json @@ -7,5 +7,5 @@ "repo": "https://github.com/LazyPanda07/WebFramework", "enabled": true, "tests": [ "baseline", "limited-conn", "pipelined", "json", "upload", "static", "echo-ws" ], - "maintainers": "LazyPanda07" + "maintainers": [ "LazyPanda07" ] } \ No newline at end of file diff --git a/frameworks/web-framework-cpp/meta.json b/frameworks/web-framework-cpp/meta.json index 70a02cbc..913e35e6 100644 --- a/frameworks/web-framework-cpp/meta.json +++ b/frameworks/web-framework-cpp/meta.json @@ -7,5 +7,5 @@ "repo": "https://github.com/LazyPanda07/WebFramework", "enabled": true, "tests": [ "baseline", "limited-conn", "pipelined", "json", "upload", "static", "echo-ws" ], - "maintainers": "LazyPanda07" + "maintainers": [ "LazyPanda07" ] } \ No newline at end of file diff --git a/frameworks/web-framework-csharp/meta.json b/frameworks/web-framework-csharp/meta.json index 3c16428e..027e84ee 100644 --- a/frameworks/web-framework-csharp/meta.json +++ b/frameworks/web-framework-csharp/meta.json @@ -7,5 +7,5 @@ "repo": "https://github.com/LazyPanda07/WebFramework", "enabled": true, "tests": [ "baseline", "limited-conn", "pipelined", "json", "upload", "static", "echo-ws" ], - "maintainers": "LazyPanda07" + "maintainers": [ "LazyPanda07" ] } \ No newline at end of file diff --git a/frameworks/web-framework-python/meta.json b/frameworks/web-framework-python/meta.json index 9e7221d7..4ac36955 100644 --- a/frameworks/web-framework-python/meta.json +++ b/frameworks/web-framework-python/meta.json @@ -7,5 +7,5 @@ "repo": "https://github.com/LazyPanda07/WebFramework", "enabled": true, "tests": [ "baseline", "limited-conn", "pipelined", "json", "upload", "static", "echo-ws" ], - "maintainers": "LazyPanda07" + "maintainers": [ "LazyPanda07" ] } \ No newline at end of file