1111#include < string>
1212
1313#include " mongoose/mongoose.h"
14- #include " var.h"
15- #include " var_map.h"
16- #include " param.h"
14+ #include " include/var.h"
15+ #include " include/param.h"
1716
1817#define MAX_POLL_SLEEP 100
1918
@@ -22,7 +21,7 @@ mg_mgr manager;
2221int nextHandle = 0 ;
2322struct Session ;
2423std::map<int , Session *> sessions;
25- mg_serve_http_opts s_http_server_opts ;
24+ bool web_directory = false ;
2625
2726enum ConnectionState {
2827 kInit = 0 ,
@@ -58,26 +57,25 @@ static void session_close(Session *session) {
5857 }
5958}
6059
61- static void server_frame (mg_connection *conn, websocket_message *message, Session *session) {
60+ static void server_frame (mg_connection *conn, mg_ws_message *message, Session *session) {
6261 if (session != nullptr ) {
6362 session->_recv .clear ();
64- session->_recv .append ((char *)message->data , message->size );
65- }
66- for (mg_connection *c = mg_next (conn->mgr , nullptr ); c != nullptr ; c = mg_next (conn->mgr , c)) {
67- if (c != conn) {
68- mg_send_websocket_frame (c, WEBSOCKET_OP_TEXT, message->data , message->size );
69- }
63+ session->_recv .append ((char *)message->data .ptr , message->data .len );
7064 }
65+ mg_ws_send (conn, message->data .ptr , message->data .len , WEBSOCKET_OP_TEXT);
66+ mg_iobuf_delete (&conn->recv , conn->recv .len );
7167}
7268
7369static void server_handler (mg_connection *conn, int event, void *eventData, void *session) {
7470 switch (event) {
75- case MG_EV_WEBSOCKET_FRAME :
76- server_frame (conn, (websocket_message *)eventData, (Session *)session);
71+ case MG_EV_WS_MSG :
72+ server_frame (conn, (mg_ws_message *)eventData, (Session *)session);
7773 break ;
7874
79- case MG_EV_HTTP_REQUEST:
80- mg_serve_http (conn, (http_message *)eventData, s_http_server_opts);
75+ case MG_EV_HTTP_MSG:
76+ if (web_directory) {
77+ mg_http_serve_dir (conn, (mg_http_message *)eventData, " ." );
78+ }
8179 break ;
8280
8381 default :
@@ -91,29 +89,15 @@ static void client_connect(Session *session, int status) {
9189 }
9290}
9391
94- static void client_handshake (Session *session, http_message *message) {
95- if (session != nullptr && session->_state == kConnect && message->resp_code == 101 ) {
96- session->_state = kOpen ;
97- }
98- }
99-
100- static void client_receive_frame (Session *session, websocket_message *message) {
101- if (session != nullptr ) {
102- session->_recv .clear ();
103- session->_recv .append ((char *)message->data , message->size );
104- }
105- }
106-
10792static void client_receive (Session *session, mg_connection *conn) {
108- if (session != nullptr && conn->recv_mbuf .len && session->_state == kOpen ) {
93+ if (session != nullptr && conn->recv .len && session->_state == kOpen ) {
10994 session->_recv .clear ();
110- if ((unsigned char )conn->recv_mbuf .buf [0 ] > 128 ) {
95+ if ((unsigned char )conn->recv .buf [0 ] > 128 ) {
11196 // spurious first char?
112- session->_recv .append ((char *)conn->recv_mbuf .buf + 1 , conn->recv_mbuf .len - 1 );
97+ session->_recv .append ((char *)conn->recv .buf + 1 , conn->recv .len - 1 );
11398 } else {
114- session->_recv .append ((char *)conn->recv_mbuf .buf , conn->recv_mbuf .len );
99+ session->_recv .append ((char *)conn->recv .buf , conn->recv .len );
115100 }
116- mbuf_remove (&conn->recv_mbuf , conn->recv_mbuf .len );
117101 }
118102}
119103
@@ -123,23 +107,15 @@ static void client_handler(mg_connection *conn, int event, void *eventData, void
123107 client_connect ((Session *)session, *((int *)eventData));
124108 break ;
125109
126- case MG_EV_RECV :
110+ case MG_EV_READ :
127111 client_receive ((Session *)session, conn);
128112 break ;
129113
130114 case MG_EV_CLOSE:
131115 session_close ((Session *)session);
132116 break ;
133117
134- case MG_EV_WEBSOCKET_HANDSHAKE_DONE:
135- client_handshake ((Session *)session, (http_message *)eventData);
136- break ;
137-
138- case MG_EV_WEBSOCKET_FRAME:
139- client_receive_frame ((Session *)session, (websocket_message *)eventData);
140- break ;
141-
142- case MG_EV_WEBSOCKET_CONTROL_FRAME:
118+ case MG_EV_ERROR:
143119 break ;
144120
145121 default :
@@ -157,7 +133,7 @@ Session *get_session(int argc, slib_par_t *params) {
157133int cmd_close (int argc, slib_par_t *params, var_t *retval) {
158134 auto session = get_session (argc, params);
159135 if (session != nullptr ) {
160- session->_conn ->flags |= MG_F_CLOSE_IMMEDIATELY ;
136+ session->_conn ->is_closing = 1 ;
161137 }
162138 return argc == 1 ;
163139}
@@ -196,7 +172,7 @@ int cmd_send(int argc, slib_par_t *params, var_t *retval) {
196172 if (session != nullptr ) {
197173 const char *message = get_param_str (argc, params, 1 , nullptr );
198174 if (message != nullptr && message[0 ] != ' \0 ' ) {
199- mg_send_websocket_frame (session->_conn , WEBSOCKET_OP_TEXT, message, strlen (message));
175+ mg_ws_send (session->_conn , message, strlen (message), WEBSOCKET_OP_TEXT );
200176 } else {
201177 v_setstr (retval, " Send failed" );
202178 result = 0 ;
@@ -214,7 +190,7 @@ int cmd_create(int argc, slib_par_t *params, var_t *retval) {
214190 const char *protocol = get_param_str (argc, params, 1 , nullptr );
215191 if (url != nullptr ) {
216192 auto session = new Session ();
217- mg_connection *conn = mg_connect_ws (&manager, client_handler, session, url, protocol, nullptr );
193+ mg_connection *conn = mg_ws_connect (&manager, url, client_handler, session, protocol);
218194 if (conn == nullptr ) {
219195 delete session;
220196 v_setstr (retval, " Connection failed" );
@@ -237,18 +213,12 @@ int cmd_listen(int argc, slib_par_t *params, var_t *retval) {
237213 const char *port = get_param_str (argc, params, 0 , nullptr );
238214 if (port != nullptr ) {
239215 auto session = new Session ();
240- mg_connection *conn = mg_bind (&manager, port, server_handler, session);
216+ mg_connection *conn = mg_http_listen (&manager, port, server_handler, session);
241217 if (conn == nullptr ) {
242218 delete session;
243219 v_setstr (retval, " Listen failed" );
244220 } else {
245- mg_set_protocol_http_websocket (conn);
246- if (get_param_int (argc, params, 1 , 0 ) == 1 ) {
247- s_http_server_opts.document_root = " ." ;
248- s_http_server_opts.enable_directory_listing = " yes" ;
249- } else {
250- s_http_server_opts.enable_directory_listing = " no" ;
251- }
221+ web_directory = (get_param_int (argc, params, 1 , 0 ) == 1 );
252222 v_setint (retval, session->_handle );
253223 session->_conn = conn;
254224 result = 1 ;
@@ -329,7 +299,7 @@ int sblib_events(int wait_flag, int *w, int *h) {
329299int sblib_init (const char *sourceFile) {
330300 signal (SIGTERM, signal_handler);
331301 signal (SIGINT, signal_handler);
332- mg_mgr_init (&manager, nullptr );
302+ mg_mgr_init (&manager);
333303 return 1 ;
334304}
335305
0 commit comments