22#include <ev.h>
33#include <dispatch/dispatch.h>
44#include "ebb.h"
5+ #include "uri.h"
6+ #include "async.h"
7+
8+ static const char * ebb_http_404 = "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 4\r\n\r\n404\n" ;
9+
10+ typedef struct {
11+ ebb_request * request ;
12+ } ebb_connection_extras ;
513
614typedef struct {
715 ebb_connection * connection ;
8- ebb_buf * responses ;
16+ ccv_uri_dispatch_t * dispatcher ;
17+ char * query ;
18+ ebb_buf response ;
919} ebb_request_extras ;
1020
11- static ev_async main_async ;
21+ static void on_request_path (ebb_request * request , const char * at , size_t length )
22+ {
23+ ebb_request_extras * extras = (ebb_request_extras * )request -> data ;
24+ char * path = (char * )at ;
25+ char eof = path [length ];
26+ path [length ] = '\0' ;
27+ extras -> dispatcher = find_uri_dispatch (path );
28+ path [length ] = eof ;
29+ }
1230
13- static void dispatch_main_async ( dispatch_block_t block )
31+ static void on_request_query_string ( ebb_request * request , const char * at , size_t length )
1432{
15- dispatch_async (dispatch_get_main_queue (), block );
16- ev_async_send (EV_DEFAULT_ & main_async );
33+ ebb_request_extras * request_extras = (ebb_request_extras * )request -> data ;
34+ if (request_extras -> dispatcher )
35+ {
36+ }
1737}
1838
19- static void main_async_dispatch ( EV_P_ ev_async * w , int revents )
39+ static void on_connection_response_continue ( ebb_connection * connection )
2040{
21- dispatch_main ( );
41+ ebb_connection_schedule_close ( connection );
2242}
2343
24- static void on_request_path ( ebb_request * request , const char * at , size_t length )
44+ static void on_request_response ( void * context )
2545{
46+ ebb_request * request = (ebb_request * )context ;
47+ ebb_request_extras * request_extras = (ebb_request_extras * )request -> data ;
48+ ebb_connection * connection = request_extras -> connection ;
49+ ebb_connection_write (connection , request_extras -> response .data , request_extras -> response .len , on_connection_response_continue );
50+ ccfree (request );
2651}
2752
28- static void on_request_query_string ( ebb_request * request , const char * at , size_t length )
53+ static void on_request_processing ( void * context )
2954{
55+ // this is called off-thread
56+ ebb_request * request = (ebb_request * )context ;
57+ ebb_request_extras * request_extras = (ebb_request_extras * )request -> data ;
58+ request_extras -> response = request_extras -> dispatcher -> dispatch (0 );
59+ dispatch_main_async_f (request , on_request_response );
3060}
3161
3262static void on_request_dispatch (ebb_request * request )
3363{
34- dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT , 0 ), ^{
35- // do the real computation off thread
36- dispatch_main_async (^{
37- });
38- });
64+ ebb_request_extras * request_extras = (ebb_request_extras * )request -> data ;
65+ ebb_connection * connection = request_extras -> connection ;
66+ if (request_extras -> dispatcher )
67+ dispatch_async_f (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT , 0 ), request , on_request_processing );
68+ else // write 404
69+ ebb_connection_write (connection , ebb_http_404 , sizeof (ebb_http_404 ), on_connection_response_continue );
3970}
4071
4172static ebb_request * new_request (ebb_connection * connection )
4273{
4374 ebb_request * request = (ebb_request * )ccmalloc (sizeof (ebb_request ) + sizeof (ebb_request_extras ));
4475 ebb_request_init (request );
76+ ebb_connection_extras * connection_extras = (ebb_connection_extras * )(connection -> data );
77+ connection_extras -> request = request ;
4578 ebb_request_extras * request_extras = (ebb_request_extras * )(request + 1 );
4679 request_extras -> connection = connection ;
4780 request -> data = request_extras ;
@@ -58,8 +91,11 @@ static void on_connection_close(ebb_connection* connection)
5891
5992static ebb_connection * new_connection (ebb_server * server , struct sockaddr_in * addr )
6093{
61- ebb_connection * connection = (ebb_connection * )ccmalloc (sizeof (ebb_connection ));
94+ ebb_connection * connection = (ebb_connection * )ccmalloc (sizeof (ebb_connection ) + sizeof ( ebb_connection_extras ) );
6295 ebb_connection_init (connection );
96+ ebb_connection_extras * connection_extras = (ebb_connection_extras * )(connection + 1 );
97+ connection_extras -> request = 0 ;
98+ connection -> data = connection_extras ;
6399 connection -> new_request = new_request ;
64100 connection -> on_close = on_connection_close ;
65101 return connection ;
@@ -71,7 +107,10 @@ int main(int argc, char** argv)
71107 ebb_server_init (& server , EV_DEFAULT );
72108 server .new_connection = new_connection ;
73109 ebb_server_listen_on_port (& server , 3350 );
74- ev_async_init (& main_async , main_async_dispatch );
110+ printf ("Listen on 3350, http://localhost:3350/\n" );
111+ main_async_init ();
112+ main_async_start (EV_DEFAULT );
75113 ev_run (EV_DEFAULT_ 0 );
114+ main_async_destroy ();
76115 return 0 ;
77116}
0 commit comments