static void test_ownership(evhtp_request_t * request, void * arg) { evhtp_connection_t * conn = evhtp_request_get_connection(request); evbev_t * bev = evhtp_connection_take_ownership(conn); bufferevent_enable(bev, EV_READ); bufferevent_setcb(bev, _owned_readcb, NULL, _owned_eventcb, NULL); }
static void wshtp_handler_cb(evhtp_request_t *req, void *data) { evhtp_connection_t *conn = evhtp_request_get_connection(req); wshtp_server_t *server = (wshtp_server_t*)data; wshtp_conn_t *_conn = (wshtp_conn_t*)avlmap_find(server->conns, (intptr_t)conn); wshtp_conn_set_request(_conn, req); if (req->method == htp_method_GET) { int ret = do_ws_handshake(req); if (ret == EVHTP_RES_SWITCH_PROTO) { _conn->is_websocket = true; evbev_t * bev = evhtp_connection_take_ownership(conn); evhtp_connection_set_bev(conn, bev); conn->owner = 1; bufferevent_enable(bev, EV_READ); bufferevent_setcb(bev, ws_read_cb, NULL, ws_event_cb, _conn); } else if (ret != EVHTP_RES_OK) { return; } _conn->method = WSHTP_ON_GET; } else if (req->method == htp_method_POST) { _conn->method = WSHTP_ON_POST; } else if (req->method == htp_method_PUT) { _conn->method = WSHTP_ON_PUT; } else if (req->method == htp_method_DELETE) { _conn->method = WSHTP_ON_DELETE; } if (_conn->is_open == false) { wshtp_hooks_call(server, WSHTP_ON_OPEN, _conn); _conn->is_open = true; } if (_conn->is_websocket == false && _conn->method) { wshtp_hooks_call(server, _conn->method, _conn); } }