@@ -6,93 +6,111 @@ extern "C" {
66#include " Http3ContextData.h"
77#include " Http3ResponseData.h"
88
9- /* Let's just have this one here for now */
10- us_quic_socket_context_t *context;
9+ namespace uWS {
10+ struct Http3Context {
11+ static Http3Context *create (us_loop_t *loop, us_quic_socket_context_options_t options) {
12+ // return nullptr;
1113
12- /* This would be a request */
13- void on_stream_headers (us_quic_stream_t *s) {
14+ printf (" Creating context now\n " );
1415
15- Http3ContextData *contextData = (Http3ContextData *) us_quic_socket_context_ext (us_quic_socket_context (us_quic_stream_socket (s)));
16+ /* Create quic socket context (assumes h3 for now) */
17+ auto *context = us_create_quic_socket_context (loop, options, sizeof (Http3ContextData)); // sizeof(Http3ContextData)
1618
17- contextData->router .route ();
19+ /* Specify application callbacks */
20+ us_quic_socket_context_on_stream_data (context, [](us_quic_stream_t *s, char *data, int length) {
1821
22+ // Http3ResponseData *responseData = us_quic_stream_ext(s);
23+ // responseData->onData(data, length);
1924
20- }
25+ printf (" Body length is: %d\n " , length);
26+ });
27+ us_quic_socket_context_on_stream_open (context, [](us_quic_stream_t *s, int is_client) {
28+ // printf("Stream opened!\n");
2129
22- /* And this would be the body of the request */
23- void on_stream_data (us_quic_stream_t *s, char *data, int length) {
30+ // inplace initialize Http3ResponseData here
31+ });
32+ us_quic_socket_context_on_close (context, [](us_quic_socket_t *s) {
33+ printf (" Disconnected!\n " );
34+ });
35+ us_quic_socket_context_on_stream_writable (context, [](us_quic_stream_t *s) {
36+ // Http3ResponseData *responseData = us_quic_stream_ext(s);
37+ // responseData->onWritable();
38+ });
39+ us_quic_socket_context_on_stream_headers (context, [](us_quic_stream_t *s) {
2440
25- // Http3ResponseData *responseData = us_quic_stream_ext(s);
26- // responseData->onData(data, length);
41+ Http3ContextData *contextData = (Http3ContextData *) us_quic_socket_context_ext (us_quic_socket_context (us_quic_stream_socket (s)));
2742
28- printf (" Body length is: %d\n " , length);
29- }
43+ Http3Request *req = nullptr ;
3044
31- void on_stream_writable (us_quic_stream_t *s) {
32- // Http3ResponseData *responseData = us_quic_stream_ext(s);
33- // responseData->onWritable();
34- }
45+ std::string_view upperCasedMethod = req->getHeader (" :method" );
46+ // std::transform(lowerCasedMethod.begin(), lowerCasedMethod.end(), lowerCasedMethod.begin(), ::tolower);
3547
36- void on_stream_close (us_quic_stream_t *s) {
48+ contextData->router .getUserData () = {(Http3Response *) s, (Http3Request *) nullptr };
49+ contextData->router .route (upperCasedMethod, " /" );
3750
38- // Http3ResponseData *responseData = us_quic_stream_ext(s);
39- // responseData->onAborted();
4051
41- // printf("Stream closed\n");
52+ });
53+ us_quic_socket_context_on_open (context, [](us_quic_socket_t *s, int is_client) {
54+ printf (" Connection established!\n " );
55+ });
56+ us_quic_socket_context_on_stream_close (context, [](us_quic_stream_t *s) {
4257
43- // inplace destruct Http3ResponseData here
44- }
58+ // Http3ResponseData *responseData = us_quic_stream_ext(s);
59+ // responseData->onAborted();
4560
46- /* On new connection */
47- void on_open (us_quic_socket_t *s, int is_client) {
48- printf (" Connection established!\n " );
49- }
61+ // printf("Stream closed\n");
5062
51- /* On new stream */
52- void on_stream_open (us_quic_stream_t *s, int is_client) {
53- // printf("Stream opened!\n");
63+ // inplace destruct Http3ResponseData here
64+ });
5465
55- // inplace initialize Http3ResponseData here
56- }
66+ return (Http3Context *) context;
5767
58- void on_close (us_quic_socket_t *s) {
59- printf (" Disconnected!\n " );
60- }
68+ // call init here after setting the ext to Http3ContextData
69+ }
6170
62- namespace uWS {
63- struct Http3Context {
64- static Http3Context *create (us_loop_t *loop, us_quic_socket_context_options_t options) {
65- // return nullptr;
71+ us_quic_listen_socket_t *listen () {
72+ /* The listening socket is the actual UDP socket used */
73+ us_quic_listen_socket_t *listen_socket = us_quic_socket_context_listen ((us_quic_socket_context_t *) this , " ::1" , 9004 , sizeof (Http3ResponseData)); // sizeof(Http3ResponseData)
6674
67- printf (" Creating context now\n " );
75+ return listen_socket;
76+ }
6877
69- /* Create quic socket context (assumes h3 for now) */
70- context = us_create_quic_socket_context (loop, options); // sizeof(Http3ContextData)
78+ void init () {
79+ // set all callbacks here
7180
72- /* Specify application callbacks */
73- us_quic_socket_context_on_stream_data (context, on_stream_data);
74- us_quic_socket_context_on_stream_open (context, on_stream_open);
75- us_quic_socket_context_on_stream_close (context, on_stream_close);
76- us_quic_socket_context_on_stream_writable (context, on_stream_writable);
77- us_quic_socket_context_on_stream_headers (context, on_stream_headers);
78- us_quic_socket_context_on_open (context, on_open);
79- us_quic_socket_context_on_close (context, on_close);
8081
81- /* The listening socket is the actual UDP socket used */
82- us_quic_listen_socket_t *listen_socket = us_quic_socket_context_listen (context, " ::1" , 9004 ); // sizeof(Http3ResponseData)
8382
83+ Http3ContextData *contextData = (Http3ContextData *) us_quic_socket_context_ext ((us_quic_socket_context_t *) this );
8484
85- return nullptr ;
85+ printf ( " init: %p \n " , contextData) ;
8686
87- // call init here after setting the ext to Http3ContextData
88- }
87+ new (contextData) Http3ContextData ();
8988
90- void init () {
91- // set all callbacks here
9289 }
9390
94- void onHttp () {
91+ // generic for get, post, any, etc
92+ void onHttp (std::string method, std::string path, MoveOnlyFunction<void (Http3Response *, Http3Request *)> &&cb) {
9593 // modifies the router we own as part of Http3ContextData, used in callbacks set in init
94+
95+ Http3ContextData *contextData = (Http3ContextData *) us_quic_socket_context_ext ((us_quic_socket_context_t *) this );
96+
97+ /* Todo: This is ugly, fix */
98+ std::vector<std::string> methods;
99+ if (method == " *" ) {
100+ methods = contextData->router .upperCasedMethods ; // bug! needs to be upper cased!
101+ // router.upperCasedMethods;
102+ } else {
103+ methods = {method};
104+ }
105+
106+ contextData->router .add (methods, path, [handler = std::move (cb)](HttpRouter<Http3ContextData::RouterData> *router) mutable {
107+
108+ Http3ContextData::RouterData &routerData = router->getUserData ();
109+
110+ handler (routerData.res , routerData.req );
111+
112+ return true ;
113+ });
96114 }
97115 };
98116}
0 commit comments