static void ev_handler(struct ns_connection *nc, int ev, void *ev_data) { struct http_message *hm = (struct http_message *) ev_data; struct websocket_message *wm = (struct websocket_message *) ev_data; switch (ev) { case NS_HTTP_REQUEST: /* Usual HTTP request - serve static files */ ns_serve_http(nc, hm, s_http_server_opts); nc->flags |= NSF_SEND_AND_CLOSE; break; case NS_WEBSOCKET_HANDSHAKE_DONE: /* New websocket connection. Tell everybody. */ broadcast(nc, "joined", 6); break; case NS_WEBSOCKET_FRAME: /* New websocket message. Tell everybody. */ broadcast(nc, (char *) wm->data, wm->size); break; case NS_CLOSE: /* Disconnect. Tell everybody. */ if (is_websocket(nc)) { broadcast(nc, "left", 4); } break; default: break; } }
static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { switch (ev) { case MG_EV_HTTP_REQUEST: { mg_serve_http(nc, (struct http_message *) ev_data, s_http_server_opts); break; } case MG_EV_WEBSOCKET_HANDSHAKE_DONE: { #if 0 /* New websocket connection. */ // send something... #endif break; } case MG_EV_WEBSOCKET_FRAME: { struct websocket_message *wm = (struct websocket_message *) ev_data; /* New websocket message. Tell everybody. */ // struct mg_str d = {(char *) wm->data, wm->size}; msg_command( nc, wm->data, wm->size ); fflush(stdout); break; } case MG_EV_CLOSE: { #if 0 /* Disconnect. Tell everybody. */ if (is_websocket(nc)) { // send something... } #endif break; } } }
static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { switch (ev) { case MG_EV_WEBSOCKET_HANDSHAKE_DONE: { /* New websocket connection. Tell everybody. */ broadcast(nc, mg_mk_str("++ joined")); break; } case MG_EV_WEBSOCKET_FRAME: { struct websocket_message *wm = (struct websocket_message *) ev_data; /* New websocket message. Tell everybody. */ struct mg_str d = {(char *) wm->data, wm->size}; broadcast(nc, d); break; } case MG_EV_CLOSE: { /* Disconnect. Tell everybody. */ if (is_websocket(nc)) { broadcast(nc, mg_mk_str("-- left")); } break; } } }
int connection_http_to_handler(Connection *conn) { int content_len = Request_content_length(conn->req); int rc = 0; char *body = NULL; Handler *handler = Request_get_action(conn->req, handler); error_unless(handler, conn, 404, "No action for request: %s", bdata(Request_path(conn->req))); bstring expects = Request_get(conn->req, &HTTP_EXPECT); if (expects != NULL) { if (biseqcstr(expects, "100-continue")) { Response_send_status(conn, &HTTP_100); } else { Response_send_status(conn, &HTTP_417); log_info("Client requested unsupported expectation: %s.", bdata(expects)); goto error; } } // we don't need the header anymore, so commit the buffer and deal with the body check(IOBuf_read_commit(conn->iob, Request_header_length(conn->req)) != -1, "Finaly commit failed streaming the connection to http handlers."); if(is_websocket(conn)) { bstring wsKey = Request_get(conn->req, &WS_SEC_WS_KEY); bstring response= websocket_challenge(wsKey); conn->handler = handler; //Response_send_status(conn,response); bdestroy(conn->req->request_method); conn->req->request_method=bfromcstr("WEBSOCKET_HANDSHAKE"); Connection_send_to_handler(conn, handler, bdata(response), blength(response)); bdestroy(response); bdestroy(conn->req->request_method); conn->req->request_method=bfromcstr("WEBSOCKET"); return REQ_SENT; } if(content_len == 0) { body = ""; rc = Connection_send_to_handler(conn, handler, body, content_len); check_debug(rc == 0, "Failed to deliver to the handler."); } else if(content_len > MAX_CONTENT_LENGTH) { rc = Upload_file(conn, handler, content_len); check(rc == 0, "Failed to upload file."); } else { debug("READ ALL CALLED with content_len: %d, and MAX_CONTENT_LENGTH: %d", content_len, MAX_CONTENT_LENGTH); body = IOBuf_read_all(conn->iob, content_len, CLIENT_READ_RETRIES); check(body != NULL, "Client closed the connection during upload."); rc = Connection_send_to_handler(conn, handler, body, content_len); check_debug(rc == 0, "Failed to deliver to the handler."); } Log_request(conn, 200, content_len); return REQ_SENT; error: return CLOSE; }