diff --git a/examples/Http3Server.cpp b/examples/Http3Server.cpp index cbbff86..329bb9a 100644 --- a/examples/Http3Server.cpp +++ b/examples/Http3Server.cpp @@ -7,8 +7,8 @@ /* Tentative example of simple Http3 server */ int main() { uWS::H3App({ - .key_file_name = "../misc/key.pem", - .cert_file_name = "../misc/cert.pem", + .key_file_name = "misc/key.pem", + .cert_file_name = "misc/cert.pem", .passphrase = "1234" }).get("/*", [](auto *res, auto *req) { diff --git a/misc/15.pro b/misc/15.pro deleted file mode 100644 index ce137b2..0000000 --- a/misc/15.pro +++ /dev/null @@ -1,41 +0,0 @@ -TEMPLATE = app -CONFIG += console c++1z -CONFIG -= app_bundle -CONFIG -= qt - -SOURCES += \ - main.cpp \ - ../uSockets/src/eventing/epoll.c \ - ../uSockets/src/context.c \ - ../uSockets/src/socket.c \ - ../uSockets/src/eventing/libuv.c \ - ../uSockets/src/ssl.c \ - ../uSockets/src/loop.c - -HEADERS += \ - ../src/HttpRouter.h \ - ../src/HttpParser.h \ - ../src/libwshandshake.hpp \ - ../src/WebSocketProtocol.h \ - ../src/HttpContext.h \ - ../src/HttpContextData.h \ - ../src/HttpResponseData.h \ - ../src/HttpResponse.h \ - ../src/LoopData.h \ - ../src/AsyncSocket.h \ - ../src/AsyncSocketData.h \ - ../src/Loop.h \ - ../src/App.h \ - ../src/Utilities.h \ - ../src/WebSocket.h \ - ../src/WebSocketData.h \ - ../src/WebSocketContext.h \ - ../src/WebSocketContextData.h \ - ../src/WebSocketExtensions.h \ - ../src/PerMessageDeflate.h \ - ../src/TopicTree.h - -INCLUDEPATH += ../uSockets/src ../src -QMAKE_CXXFLAGS += -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-parameter -fsanitize=address -QMAKE_CFLAGS += -Wno-unused-parameter -Wno-unused-variable -LIBS += -lasan -pthread -lssl -lcrypto -lz -lstdc++fs diff --git a/misc/2018.png b/misc/2018.png deleted file mode 100644 index 8d15a82..0000000 Binary files a/misc/2018.png and /dev/null differ diff --git a/misc/FAQ.md b/misc/FAQ.md deleted file mode 100644 index 1c8293d..0000000 --- a/misc/FAQ.md +++ /dev/null @@ -1,19 +0,0 @@ -## Build systems -Q: -``` -Hi Alex, -I've used your library and I like it, however, to integrate it in my process it needs to use cmake and conan. I have written those for my own project, would you like me to submit a pull request? - -Regards, -Ioannis -``` -A: -``` -Hi Ioannis, - -This is a very common request. I don't accept any specific build systems because I know from experience that doing so opens up hell. People simply cannot agree on which build system to use, or even how to use one particular build system. - -That's why I no longer accept any such PRs. I've had too many CMake PRs dragging in completely different directions to know this is the only solution. - -You'll have to clone the repo and create a new project in whatever build system you want to use. -``` diff --git a/misc/Screenshot_20210915-004009.png b/misc/Screenshot_20210915-004009.png deleted file mode 100644 index e36aa51..0000000 Binary files a/misc/Screenshot_20210915-004009.png and /dev/null differ diff --git a/misc/cert.pem b/misc/cert.pem new file mode 100644 index 0000000..8dbd2da --- /dev/null +++ b/misc/cert.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDXTCCAkWgAwIBAgIJAKLdQVPy90jjMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTkwMjAzMTQ0OTM1WhcNMjAwMjAzMTQ0OTM1WjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA7i7IIEdICTiSTVx+ma6xHxOtcbd6wGW3nkxlCkJ1UuV8NmY5ovMsGnGD +hJJtUQ2j5ig5BcJUf3tezqCNW4tKnSOgSISfEAKvpn2BPvaFq3yx2Yjz0ruvcGKp +DMZBXmB/AAtGyN/UFXzkrcfppmLHJTaBYGG6KnmU43gPkSDy4iw46CJFUOupc51A +FIz7RsE7mbT1plCM8e75gfqaZSn2k+Wmy+8n1HGyYHhVISRVvPqkS7gVLSVEdTea +UtKP1Vx/818/HDWk3oIvDVWI9CFH73elNxBkMH5zArSNIBTehdnehyAevjY4RaC/ +kK8rslO3e4EtJ9SnA4swOjCiqAIQEwIDAQABo1AwTjAdBgNVHQ4EFgQUv5rc9Smm +9c4YnNf3hR49t4rH4yswHwYDVR0jBBgwFoAUv5rc9Smm9c4YnNf3hR49t4rH4ysw +DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEATcL9CAAXg0u//eYUAlQa +L+l8yKHS1rsq1sdmx7pvsmfZ2g8ONQGfSF3TkzkI2OOnCBokeqAYuyT8awfdNUtE +EHOihv4ZzhK2YZVuy0fHX2d4cCFeQpdxno7aN6B37qtsLIRZxkD8PU60Dfu9ea5F +DDynnD0TUabna6a0iGn77yD8GPhjaJMOz3gMYjQFqsKL252isDVHEDbpVxIzxPmN +w1+WK8zRNdunAcHikeoKCuAPvlZ83gDQHp07dYdbuZvHwGj0nfxBLc9qt90XsBtC +4IYR7c/bcLMmKXYf0qoQ4OzngsnPI5M+v9QEHvYWaKVwFY4CTcSNJEwfXw+BAeO5 +OA== +-----END CERTIFICATE----- diff --git a/misc/design.dia b/misc/design.dia deleted file mode 100644 index 85e356c..0000000 Binary files a/misc/design.dia and /dev/null differ diff --git a/misc/key.pem b/misc/key.pem new file mode 100644 index 0000000..777095f --- /dev/null +++ b/misc/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDuLsggR0gJOJJN +XH6ZrrEfE61xt3rAZbeeTGUKQnVS5Xw2Zjmi8ywacYOEkm1RDaPmKDkFwlR/e17O +oI1bi0qdI6BIhJ8QAq+mfYE+9oWrfLHZiPPSu69wYqkMxkFeYH8AC0bI39QVfOSt +x+mmYsclNoFgYboqeZTjeA+RIPLiLDjoIkVQ66lznUAUjPtGwTuZtPWmUIzx7vmB ++pplKfaT5abL7yfUcbJgeFUhJFW8+qRLuBUtJUR1N5pS0o/VXH/zXz8cNaTegi8N +VYj0IUfvd6U3EGQwfnMCtI0gFN6F2d6HIB6+NjhFoL+QryuyU7d7gS0n1KcDizA6 +MKKoAhATAgMBAAECggEAd5g/3o1MK20fcP7PhsVDpHIR9faGCVNJto9vcI5cMMqP +6xS7PgnSDFkRC6EmiLtLn8Z0k2K3YOeGfEP7lorDZVG9KoyE/doLbpK4MfBAwBG1 +j6AHpbmd5tVzQrnNmuDjBBelbDmPWVbD0EqAFI6mphXPMqD/hFJWIz1mu52Kt2s6 +++MkdqLO0ORDNhKmzu6SADQEcJ9Suhcmv8nccMmwCsIQAUrfg3qOyqU4//8QB8ZM +josO3gMUesihVeuF5XpptFjrAliPgw9uIG0aQkhVbf/17qy0XRi8dkqXj3efxEDp +1LSqZjBFiqJlFchbz19clwavMF/FhxHpKIhhmkkRSQKBgQD9blaWSg/2AGNhRfpX +Yq+6yKUkUD4jL7pmX1BVca6dXqILWtHl2afWeUorgv2QaK1/MJDH9Gz9Gu58hJb3 +ymdeAISwPyHp8euyLIfiXSAi+ibKXkxkl1KQSweBM2oucnLsNne6Iv6QmXPpXtro +nTMoGQDS7HVRy1on5NQLMPbUBQKBgQDwmN+um8F3CW6ZV1ZljJm7BFAgNyJ7m/5Q +YUcOO5rFbNsHexStrx/h8jYnpdpIVlxACjh1xIyJ3lOCSAWfBWCS6KpgeO1Y484k +EYhGjoUsKNQia8UWVt+uWnwjVSDhQjy5/pSH9xyFrUfDg8JnSlhsy0oC0C/PBjxn +hxmADSLnNwKBgQD2A51USVMTKC9Q50BsgeU6+bmt9aNMPvHAnPf76d5q78l4IlKt +wMs33QgOExuYirUZSgjRwknmrbUi9QckRbxwOSqVeMOwOWLm1GmYaXRf39u2CTI5 +V9gTMHJ5jnKd4gYDnaA99eiOcBhgS+9PbgKSAyuUlWwR2ciL/4uDzaVeDQKBgDym +vRSeTRn99bSQMMZuuD5N6wkD/RxeCbEnpKrw2aZVN63eGCtkj0v9LCu4gptjseOu +7+a4Qplqw3B/SXN5/otqPbEOKv8Shl/PT6RBv06PiFKZClkEU2T3iH27sws2EGru +w3C3GaiVMxcVewdg1YOvh5vH8ZVlxApxIzuFlDvnAoGAN5w+gukxd5QnP/7hcLDZ +F+vesAykJX71AuqFXB4Wh/qFY92CSm7ImexWA/L9z461+NKeJwb64Nc53z59oA10 +/3o2OcIe44kddZXQVP6KTZBd7ySVhbtOiK3/pCy+BQRsrC7d71W914DxNWadwZ+a +jtwwKjDzmPwdIXDSQarCx0U= +-----END PRIVATE KEY----- diff --git a/misc/main.cpp b/misc/main.cpp deleted file mode 100644 index 57238b5..0000000 --- a/misc/main.cpp +++ /dev/null @@ -1,119 +0,0 @@ -#include "App.h" - -//#include "../examples/helpers/AsyncFileReader.h" -//#include "../examples/helpers/AsyncFileStreamer.h" - -us_listen_socket *token; - -int main(int argc, char **argv) { - - struct PerSocketData { - char pad[256]; - int hello; - }; - - auto app = uWS::/*SSL*/App({ - .key_file_name = "/home/alexhultman/key.pem", - .cert_file_name = "/home/alexhultman/cert.pem", - .passphrase = "1234" - }).any("/anything", [](auto *res, auto *req) { - std::cout << "Any route with method: " << req->getMethod() << std::endl; - res->end("Hello Any route!"); - }).get("/exit", [](auto *res, auto *req) { - - if (!token) { - res->end("Server already closed down!"); - return; - } - - res->end("Closing down server now"); - - /* Use this route to signal stop listening */ - us_listen_socket_close(token); - token = nullptr; - }).ws("/*", { - /* Settings */ - .compression = uWS::DEDICATED_COMPRESSOR, - .maxPayloadLength = 16 * 1024 * 1024, - .idleTimeout = 10, - /* Handlers */ - .open = [](auto *ws) { - std::cout << "WebSocket connected" << std::endl; - /* Access per socket data */ - PerSocketData *perSocketData = (PerSocketData *) ws->getUserData(); - perSocketData->hello = 13; - }, - .message = [](auto *ws, std::string_view message, uWS::OpCode opCode) { - ws->send(message, opCode, true); - PerSocketData *perSocketData = (PerSocketData *) ws->getUserData(); - std::cout << "OK per socket data: " << (perSocketData->hello == 13) << std::endl; - }, - .drain = [](auto *ws) { - std::cout << "Drainage: " << ws->getBufferedAmount() << std::endl; - }, - .ping = [](auto *ws) { - std::cout << "Ping" << std::endl; - }, - .pong = [](auto *ws) { - std::cout << "Pong" << std::endl; - }, - .close = [](auto *ws, int code, std::string_view message) { - std::cout << "WebSocket disconnected: " << code << "[" << message << "]" << std::endl; - /* Access per socket data */ - PerSocketData *perSocketData = (PerSocketData *) ws->getUserData(); - std::cout << "OK per socket data: " << (perSocketData->hello == 13) << std::endl; - } - }).listen(9001, [](auto *token) { - ::token = token; - if (token) { - std::cout << "Listening on port " << 3000 << std::endl; - } - }).run(); - - - std::cout << "Everything fine, falling through" << std::endl; - -// return 0; - -// AsyncFileStreamer *asyncFileStreamer = new AsyncFileStreamer("/home/alexhultman/v0.15/public"); - -// uWS::/*SSL*/App(/*{ -// .key_file_name = "/home/alexhultman/uWebSockets/misc/ssl/key.pem", -// .cert_file_name = "/home/alexhultman/uWebSockets/misc/ssl/cert.pem", -// .dh_params_file_name = "/home/alexhultman/dhparams.pem", -// .passphrase = "1234" -// }*/)/*.get("/*", [](auto *res, auto *req) { - -// res->end("GET /WILDCARD"); - -// })*/.get("/:param1/:param2", [](auto *res, auto *req) { - -// res->write("GET /:param1/:param2 = "); -// res->write(req->getParameter(0)); -// res->write(" and "); -// res->end(req->getParameter(1)); - -// }).post("/hello", [asyncFileStreamer](auto *res, auto *req) { - -// // depending on the file type we want to also add mime! -// //asyncFileStreamer->streamFile(res, req->getUrl()); - -// res->end("POST /hello"); - -// }).get("/hello", [](auto *res, auto *req) { - -// res->end("GET /hello"); - -// }).unhandled([](auto *res, auto *req) { - -// res->writeStatus("404 Not Found"); -// res->writeHeader("Content-Type", "text/html; charset=utf-8"); -// res->end("

404 Not Found

µWebSockets v0.15"); - -// }).listen(3000, [](auto *token) { -// if (token) { -// std::cout << "Listening on port " << 3000 << std::endl; -// } -// }).run(); - -} diff --git a/misc/nodejs.png b/misc/nodejs.png deleted file mode 100644 index 9b3ef4b..0000000 Binary files a/misc/nodejs.png and /dev/null differ diff --git a/misc/python3.png b/misc/python3.png deleted file mode 100644 index 0231660..0000000 Binary files a/misc/python3.png and /dev/null differ diff --git a/misc/rough_uml_design.pdf b/misc/rough_uml_design.pdf deleted file mode 100644 index aff1c9d..0000000 Binary files a/misc/rough_uml_design.pdf and /dev/null differ diff --git a/misc/tests.cpp b/misc/tests.cpp deleted file mode 100644 index 7a1e7da..0000000 --- a/misc/tests.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "HttpParser.h" - -#include -#include - -// todo: random test of chunked http parsing of randomly generated requests -void testHttpParser() { - - char headers[] = "GET /hello.htm HTTP/1.1\r\n" - "User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)\r\n" - "Host: www.tutorialspoint.com\r\n" - "Accept-Language: en-us\r\n" - "Accept-Encoding: gzip, deflate\r\n" - "Connection: Keep-Alive\r\n" - "Content-length: 1048576\r\n\r\n"; - - const int requestLength = sizeof(headers) - 1 + 1048576; - char *request = (char *) malloc(requestLength + 32); - memset(request, 0, requestLength); - memcpy(request, headers, sizeof(headers) - 1); - - char *data = (char *) malloc(requestLength * 10); - int length = requestLength * 10; - - int maxChunkSize = 10000; - char *paddedBuffer = (char *) malloc(maxChunkSize + 32); - - // dela upp dessa 10 i 5 segment - HttpParser httpParser; - int validRequests = 0, numDataEmits = 0, numChunks = 0; - size_t dataBytes = 0; - - for (int i = 0; i < 10; i++) { - memcpy(data + requestLength * i, request, requestLength); - } - - for (int j = 0; j < 1000; j++) { - for (int currentOffset = 0; currentOffset != length; ) { - - int chunkSize = rand() % 10000; - if (currentOffset + chunkSize > length) { - chunkSize = length - currentOffset; - } - - memcpy(paddedBuffer, data + currentOffset, chunkSize); - - httpParser.consumePostPadded(paddedBuffer, chunkSize, nullptr, [&validRequests](void *user, HttpRequest *req) { - validRequests++; - - if (req->getUrl() != "/hello.htm") { - std::cout << "WRONG URL!" << std::endl; - exit(-1); - } - - }, [&dataBytes, &numDataEmits](void *, std::string_view data) { - numDataEmits++; - dataBytes += data.length(); - }, [](void *) { - - std::cout << "Error!" << std::endl; - return; - }); - - numChunks++; - - currentOffset += chunkSize; - } - } - - std::cout << "validRequests: " << validRequests << std::endl; - std::cout << "Data bytes: " << dataBytes << std::endl; - std::cout << "Data emits: " << numDataEmits << std::endl; - std::cout << "Chunks parsed: " << numChunks << std::endl; - - validRequests = 0; - - auto start = std::chrono::high_resolution_clock::now(); - for (int i = 0; i < 10000000; i++) { - httpParser.consumePostPadded(request, requestLength, nullptr, [&validRequests](void *user, HttpRequest *req) { - validRequests++; - }, [](void *, std::string_view data) { - - }, [](void *) { - - }); - } - auto stop = std::chrono::high_resolution_clock::now(); - - std::cout << "Parsed " << validRequests << " in " << std::chrono::duration_cast(stop - start).count() << "ms" << std::endl; -} - -int main() { - testHttpParser(); -} diff --git a/src/Http3App.h b/src/Http3App.h index 534edb7..ad5825b 100644 --- a/src/Http3App.h +++ b/src/Http3App.h @@ -10,8 +10,15 @@ namespace uWS { Http3Context *http3Context; H3App(SocketContextOptions options = {}) { + /* This conversion should not be needed */ + us_quic_socket_context_options_t h3options = {}; + + h3options.key_file_name = strdup(options.key_file_name); + h3options.cert_file_name = strdup(options.cert_file_name); + h3options.passphrase = strdup(options.passphrase); + /* Create the http3 context */ - http3Context = Http3Context::create((us_loop_t *)Loop::get(), {}); + http3Context = Http3Context::create((us_loop_t *)Loop::get(), h3options); http3Context->init(); } diff --git a/src/Http3Response.h b/src/Http3Response.h index 9d4e7bc..894c04d 100644 --- a/src/Http3Response.h +++ b/src/Http3Response.h @@ -2,6 +2,8 @@ extern "C" { #include "quic.h" } +#include "Http3ResponseData.h" + namespace uWS { /* Is a quic stream */ @@ -11,9 +13,24 @@ namespace uWS { } + void writeHeader() { + + } + + void tryEnd() { + + } + + void write() { + + } + void end(std::string_view data) { - // Http3ResponseData *responseData = us_quic_stream_ext(this); + Http3ResponseData *responseData = (Http3ResponseData *) us_quic_stream_ext((us_quic_stream_t *) this); + + printf("Wrapper responseData is %p\n", responseData); + printf("%s\n", responseData); // if not already written status then write status diff --git a/src/Http3ResponseData.h b/src/Http3ResponseData.h index 743da1d..87ccdc1 100644 --- a/src/Http3ResponseData.h +++ b/src/Http3ResponseData.h @@ -1,5 +1,16 @@ +#ifndef UWS_H3RESPONSEDATA_H +#define UWS_H3RESPONSEDATA_H + namespace uWS { struct Http3ResponseData { + + // will need onWritable + // onData + + // hasWrittenStatus + }; -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/uSockets b/uSockets index 4528c2f..f78aba5 160000 --- a/uSockets +++ b/uSockets @@ -1 +1 @@ -Subproject commit 4528c2f9dd686a27aa644911434d1da3b6312236 +Subproject commit f78aba50c087cb1e7a79661b17224486f126936d