diff --git a/README.md b/README.md index 0757137..ab9743f 100644 --- a/README.md +++ b/README.md @@ -123,5 +123,5 @@ This library is licensed under the GNU Lesser General Public License version 3.0 ## Copyright -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net \ No newline at end of file diff --git a/implementations/Crafter.Network-ClientHTTP.cpp b/implementations/Crafter.Network-ClientHTTP.cpp index a470cf6..22e2224 100644 --- a/implementations/Crafter.Network-ClientHTTP.cpp +++ b/implementations/Crafter.Network-ClientHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/implementations/Crafter.Network-ClientTCP.cpp b/implementations/Crafter.Network-ClientTCP.cpp index a8e51e7..58c517b 100755 --- a/implementations/Crafter.Network-ClientTCP.cpp +++ b/implementations/Crafter.Network-ClientTCP.cpp @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/implementations/Crafter.Network-ListenerHTTP.cpp b/implementations/Crafter.Network-ListenerHTTP.cpp index 3124eef..5864bed 100644 --- a/implementations/Crafter.Network-ListenerHTTP.cpp +++ b/implementations/Crafter.Network-ListenerHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/implementations/Crafter.Network-ListenerTCP.cpp b/implementations/Crafter.Network-ListenerTCP.cpp index 344d94d..00b051b 100755 --- a/implementations/Crafter.Network-ListenerTCP.cpp +++ b/implementations/Crafter.Network-ListenerTCP.cpp @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network-ClientHTTP.cppm b/interfaces/Crafter.Network-ClientHTTP.cppm index e4df28e..e549723 100644 --- a/interfaces/Crafter.Network-ClientHTTP.cppm +++ b/interfaces/Crafter.Network-ClientHTTP.cppm @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network-ClientTCP.cppm b/interfaces/Crafter.Network-ClientTCP.cppm index efca771..0de1e84 100755 --- a/interfaces/Crafter.Network-ClientTCP.cppm +++ b/interfaces/Crafter.Network-ClientTCP.cppm @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network-HTTP.cppm b/interfaces/Crafter.Network-HTTP.cppm index b6788a5..b785d32 100644 --- a/interfaces/Crafter.Network-HTTP.cppm +++ b/interfaces/Crafter.Network-HTTP.cppm @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network-ListenerHTTP.cppm b/interfaces/Crafter.Network-ListenerHTTP.cppm index 728b7e9..a59cac4 100644 --- a/interfaces/Crafter.Network-ListenerHTTP.cppm +++ b/interfaces/Crafter.Network-ListenerHTTP.cppm @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network-ListenerTCP.cppm b/interfaces/Crafter.Network-ListenerTCP.cppm index 007d6e7..e8f3828 100755 --- a/interfaces/Crafter.Network-ListenerTCP.cppm +++ b/interfaces/Crafter.Network-ListenerTCP.cppm @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network.cppm b/interfaces/Crafter.Network.cppm index 92dec0b..2648a10 100755 --- a/interfaces/Crafter.Network.cppm +++ b/interfaces/Crafter.Network.cppm @@ -1,6 +1,6 @@ /* Crafter®.Thread -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/project.cpp b/project.cpp deleted file mode 100644 index e8fb41b..0000000 --- a/project.cpp +++ /dev/null @@ -1,71 +0,0 @@ -import std; -import Crafter.Build; -namespace fs = std::filesystem; -using namespace Crafter; - -extern "C" Configuration CrafterBuildProject(std::span args) { - constexpr std::array networkInterfaces = { - "interfaces/Crafter.Network", - "interfaces/Crafter.Network-ClientTCP", - "interfaces/Crafter.Network-ListenerTCP", - "interfaces/Crafter.Network-ClientHTTP", - "interfaces/Crafter.Network-ListenerHTTP", - "interfaces/Crafter.Network-HTTP", - }; - constexpr std::array networkImplementations = { - "implementations/Crafter.Network-ClientTCP", - "implementations/Crafter.Network-ListenerTCP", - "implementations/Crafter.Network-ClientHTTP", - "implementations/Crafter.Network-ListenerHTTP", - }; - - std::vector depArgs(args.begin(), args.end()); - Configuration* thread = GitProject({ - .source = { .url = "https://forgejo.catcrafts.net/Catcrafts/Crafter.Thread.git" }, - .args = depArgs, - }); - - Configuration cfg; - cfg.path = "./"; - cfg.name = "Crafter.Network"; - cfg.outputName = "Crafter.Network"; - cfg.type = ConfigurationType::LibraryStatic; - ApplyStandardArgs(cfg, args); - cfg.dependencies = { thread }; - { - std::array ifaces; - std::ranges::copy(networkInterfaces, ifaces.begin()); - std::array impls; - std::ranges::copy(networkImplementations, impls.begin()); - cfg.GetInterfacesAndImplementations(ifaces, impls); - } - - auto addTest = [&](std::string name, fs::path implFile) { - Test t; - t.config.path = "./"; - t.config.name = std::move(name); - t.config.outputName = t.config.name; - t.config.target = cfg.target; - t.config.debug = cfg.debug; - t.config.march = cfg.march; - t.config.mtune = cfg.mtune; - t.config.type = ConfigurationType::Executable; - t.config.dependencies = { thread }; - std::array ifaces; - std::ranges::copy(networkInterfaces, ifaces.begin()); - std::array impls; - std::ranges::copy(networkImplementations, impls.begin()); - impls[4] = std::move(implFile); - t.config.GetInterfacesAndImplementations(ifaces, impls); - cfg.tests.push_back(std::move(t)); - }; - - addTest("ShouldCompile", "tests/ShouldCompile"); - addTest("ShouldRecieveHTTP", "tests/ShouldRecieveHTTP"); - addTest("ShouldSendHTTP", "tests/ShouldSendHTTP"); - addTest("ShouldSendRecieveHTTP", "tests/ShouldSendRecieveHTTP"); - addTest("ShouldSendRecieveKeepaliveHTTP", "tests/ShouldSendRecieveKeepaliveHTTP"); - addTest("ShouldSendRecieveLargeHTTP", "tests/ShouldSendRecieveLargeHTTP"); - - return cfg; -} diff --git a/project.json b/project.json new file mode 100644 index 0000000..bc70234 --- /dev/null +++ b/project.json @@ -0,0 +1,99 @@ +{ + "name": "crafter-network", + "configurations": [ + { + "name": "base", + "interfaces": ["interfaces/Crafter.Network-ClientTCP", "interfaces/Crafter.Network-ListenerTCP", "interfaces/Crafter.Network", "interfaces/Crafter.Network-ListenerHTTP", "interfaces/Crafter.Network-ClientHTTP", "interfaces/Crafter.Network-HTTP"], + "implementations": ["implementations/Crafter.Network-ClientTCP", "implementations/Crafter.Network-ListenerTCP", "implementations/Crafter.Network-ListenerHTTP", "implementations/Crafter.Network-ClientHTTP"] + }, + { + "name": "lib", + "extends": ["base"], + "type":"library", + "dependencies": [ + { + "path":"https://forgejo.catcrafts.net/Catcrafts/Crafter.Thread.git", + "configuration":"lib" + } + ] + }, + { + "name": "lib-debug", + "extends": ["lib"], + "debug": true + }, + { + "name": "lib-shared", + "extends": ["base"], + "type":"shared-library", + "dependencies": [ + { + "path":"https://forgejo.catcrafts.net/Catcrafts/Crafter.Thread.git", + "configuration":"lib-shared" + } + ] + } + ], + "tests":[ + { + "name": "should-compile", + "implementations": ["tests/ShouldCompile"], + "dependencies": [ + { + "path":"./project.json", + "configuration":"lib-shared" + } + ] + }, + { + "name": "should-recieve-http", + "implementations": ["tests/ShouldRecieveHTTP"], + "dependencies": [ + { + "path":"./project.json", + "configuration":"lib-shared" + } + ] + }, + { + "name": "should-send-http", + "implementations": ["tests/ShouldSendHTTP"], + "dependencies": [ + { + "path":"./project.json", + "configuration":"lib-shared" + } + ] + }, + { + "name": "should-send-recieve-http", + "implementations": ["tests/ShouldSendRecieveHTTP"], + "dependencies": [ + { + "path":"./project.json", + "configuration":"lib-shared" + } + ] + }, + { + "name": "should-send-recieve-keepalive-http", + "implementations": ["tests/ShouldSendRecieveKeepaliveHTTP"], + "dependencies": [ + { + "path":"./project.json", + "configuration":"lib-shared" + } + ] + }, + { + "name": "should-send-recieve-large-http", + "implementations": ["tests/ShouldSendRecieveLargeHTTP"], + "dependencies": [ + { + "path":"./project.json", + "configuration":"lib-shared" + } + ] + } + ] +} diff --git a/tests/ShouldCompile.cpp b/tests/ShouldCompile.cpp index 3553b82..5da2770 100644 --- a/tests/ShouldCompile.cpp +++ b/tests/ShouldCompile.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -20,8 +20,10 @@ import Crafter.Network; import std; using namespace Crafter; -int main() { - return 0; +extern "C" { + std::string* RunTest() { + return nullptr; + } } diff --git a/tests/ShouldRecieveHTTP.cpp b/tests/ShouldRecieveHTTP.cpp index d405537..401d929 100644 --- a/tests/ShouldRecieveHTTP.cpp +++ b/tests/ShouldRecieveHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -22,22 +22,23 @@ import Crafter.Network; import std; using namespace Crafter; -int main() { - bool success = false; - ListenerAsyncHTTP listener(8081, {{"/", [&](const HTTPRequest& request) { - success = true; - return CreateResponseHTTP("200 OK", "Hello World!"); - }}}); - try { - system("curl http://localhost:8081 > /dev/null 2>&1"); - std::this_thread::sleep_for(std::chrono::seconds(1)); - if (success) { - return 0; +extern "C" { + std::string* RunTest() { + bool success = false; + ListenerAsyncHTTP listener(8080, {{"/", [&](const HTTPRequest& request) { + success = true; + return CreateResponseHTTP("200 OK", "Hello World!"); + }}}); + try { + system("curl http://localhost:8080 > /dev/null 2>&1"); + std::this_thread::sleep_for(std::chrono::seconds(1)); + if (success) { + return nullptr; + } else { + return new std::string("Did not receive"); + } + } catch(std::exception& e) { + return new std::string(e.what()); } - std::println("Did not receive"); - return 1; - } catch (std::exception& e) { - std::println("{}", e.what()); - return 1; } } \ No newline at end of file diff --git a/tests/ShouldSendHTTP.cpp b/tests/ShouldSendHTTP.cpp index 51e32b2..59810b4 100644 --- a/tests/ShouldSendHTTP.cpp +++ b/tests/ShouldSendHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -20,12 +20,14 @@ import Crafter.Network; import std; using namespace Crafter; -int main() { - ClientHTTP client("httpbin.org", 80); - HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/get", "httpbin.org")); - if (response.status == "200 OK") { - return 0; +extern "C" { + std::string* RunTest() { + ClientHTTP client("httpbin.org", 80); + HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/get", "httpbin.org")); + if(response.status == "200 OK") { + return nullptr; + } else { + return new std::string(response.body); + } } - std::println("{}", response.body); - return 1; } \ No newline at end of file diff --git a/tests/ShouldSendRecieveHTTP.cpp b/tests/ShouldSendRecieveHTTP.cpp index e50ebef..29ecaba 100644 --- a/tests/ShouldSendRecieveHTTP.cpp +++ b/tests/ShouldSendRecieveHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -22,20 +22,22 @@ import Crafter.Network; import std; using namespace Crafter; -int main() { - ListenerAsyncHTTP listener(8082, {{"/", [&](const HTTPRequest& request) { - return CreateResponseHTTP("200 OK", "Hello World!"); - }}}); - try { - ClientHTTP client("localhost", 8082); - HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); - if (response.status == "200 OK" && response.body == "Hello World!") { - return 0; +extern "C" { + std::string* RunTest() { + bool success = false; + ListenerAsyncHTTP listener(8080, {{"/", [&](const HTTPRequest& request) { + return CreateResponseHTTP("200 OK", "Hello World!"); + }}}); + try { + ClientHTTP client("localhost", 8080); + HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); + if(response.status == "200 OK" && response.body == "Hello World!") { + return nullptr; + } else { + return new std::string(response.status +response.body); + } + } catch(std::exception& e) { + return new std::string(e.what()); } - std::println("{}{}", response.status, response.body); - return 1; - } catch (std::exception& e) { - std::println("{}", e.what()); - return 1; } } \ No newline at end of file diff --git a/tests/ShouldSendRecieveKeepaliveHTTP.cpp b/tests/ShouldSendRecieveKeepaliveHTTP.cpp index 742ef55..9d6edd3 100644 --- a/tests/ShouldSendRecieveKeepaliveHTTP.cpp +++ b/tests/ShouldSendRecieveKeepaliveHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -22,27 +22,28 @@ import Crafter.Network; import std; using namespace Crafter; -int main() { - ListenerAsyncHTTP listener(8083, {{"/", [&](const HTTPRequest& request) { - return CreateResponseHTTP("200 OK", "Hello World!"); - }}}); - try { - ClientHTTP client("localhost", 8083); - HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); - std::this_thread::sleep_for(std::chrono::seconds(1)); - if (response.status != "200 OK" || response.body != "Hello World!") { - std::println("{}{}", response.status, response.body); - return 1; +extern "C" { + std::string* RunTest() { + ListenerAsyncHTTP listener(8080, {{"/", [&](const HTTPRequest& request) { + return CreateResponseHTTP("200 OK", "Hello World!"); + }}}); + try { + ClientHTTP client("localhost", 8080); + HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); + std::this_thread::sleep_for(std::chrono::seconds(1)); + if(response.status == "200 OK" && response.body == "Hello World!") { + response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); + std::this_thread::sleep_for(std::chrono::seconds(1)); + if(response.status == "200 OK" && response.body == "Hello World!") { + return nullptr; + } else { + return new std::string(response.status +response.body); + } + } else { + return new std::string(response.status +response.body); + } + } catch(std::exception& e) { + return new std::string(e.what()); } - response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); - std::this_thread::sleep_for(std::chrono::seconds(1)); - if (response.status != "200 OK" || response.body != "Hello World!") { - std::println("{}{}", response.status, response.body); - return 1; - } - return 0; - } catch (std::exception& e) { - std::println("{}", e.what()); - return 1; } } \ No newline at end of file diff --git a/tests/ShouldSendRecieveLargeHTTP.cpp b/tests/ShouldSendRecieveLargeHTTP.cpp index 7b6f003..6e881ae 100644 --- a/tests/ShouldSendRecieveLargeHTTP.cpp +++ b/tests/ShouldSendRecieveLargeHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2026 Catcrafts® +Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -22,27 +22,28 @@ import Crafter.Network; import std; using namespace Crafter; -int main() { - ListenerAsyncHTTP listener(8084, {{ "/", [&](const HTTPRequest& request) { - if (request.body.size() > 1'000'000) { - return CreateResponseHTTP("200 OK", "Large request received: " + std::to_string(request.body.size()) + " bytes"); +extern "C" { + std::string* RunTest() { + ListenerAsyncHTTP listener(8080, {{ "/", [&](const HTTPRequest& request) { + if (request.body.size() > 1'000'000) { + return CreateResponseHTTP("200 OK", "Large request received: " + std::to_string(request.body.size()) + " bytes"); + } + return CreateResponseHTTP("200 OK", "Small request received"); } - return CreateResponseHTTP("200 OK", "Small request received"); - } - }}); + }}); - try { - ClientHTTP client("localhost", 8084); - std::string large_body(10 * 1024 * 1024, 'A'); - HTTPResponse response = client.Send(CreateRequestHTTP("POST", "/", "localhost", large_body)); - std::this_thread::sleep_for(std::chrono::seconds(1)); - if (response.status == "200 OK" && response.body.find("Large request received") != std::string::npos) { - return 0; + try { + ClientHTTP client("localhost", 8080); + std::string large_body(10 * 1024 * 1024, 'A'); + HTTPResponse response = client.Send(CreateRequestHTTP("POST", "/", "localhost", large_body)); + std::this_thread::sleep_for(std::chrono::seconds(1)); + if (response.status == "200 OK" && response.body.find("Large request received") != std::string::npos) { + return nullptr; + } else { + return new std::string("Unexpected response: " + response.status + " " + response.body); + } + } catch (const std::exception& e) { + return new std::string(e.what()); } - std::println("Unexpected response: {} {}", response.status, response.body); - return 1; - } catch (const std::exception& e) { - std::println("{}", e.what()); - return 1; } } \ No newline at end of file