void t04_websocket_server_close_handshake() { INIT_LOCAL(); int length = 0; unsigned char *buffer = NULL, buffer2[8]; onion *o = websocket_server_new(); onion_request *req = websocket_start_handshake(o); req->connection.listen_point->read = (lpreader_sig_t *) websocket_data_buffer_read; req->connection.listen_point->write = (lpwriter_sig_t *) websocket_data_buffer_write; onion_response *res = onion_response_new(req); onion_websocket *ws = onion_websocket_new(req, res); length = websocket_forge_close_packet((char **)&buffer); websocket_data_buffer_write(req, (char *)buffer, length); onion_connection_status ret = onion_websocket_call(ws); FAIL_IF(ret != -2); websocket_data_buffer_read(req, (char *)&buffer2, 8); FAIL_IF_NOT(buffer2[0] == 0x88); FAIL_IF_NOT(buffer2[1] == 0x02); FAIL_IF_NOT(buffer2[2] == 0x03); FAIL_IF_NOT(buffer2[3] == 0xE8); onion_websocket_free(ws); onion_request_free(req); onion_free(o); END_LOCAL(); }
/** * @short Tryes to handle the petition with that handler. * @memberof onion_handler_t * * It needs the handler to handle, the request and the response. * * It checks this parser, and siblings. * * @returns If can not, returns OCS_NOT_PROCESSED (0), else the onion_connection_status. (normally OCS_PROCESSED) */ onion_connection_status onion_handler_handle(onion_handler *handler, onion_request *request, onion_response *response){ onion_connection_status res; while (handler){ if (handler->handler){ #ifdef __DEBUG0__ char **bs=backtrace_symbols((void * const *)&handler->handler, 1); ONION_DEBUG0("Calling handler: %s",bs[0]); /* backtrace_symbols is explicitly documented to malloc. We need to call the system free routine, not our onion_low_free ! */ onion_low_free(bs); /* Can't be onion_low_free.... */ #endif res=handler->handler(handler->priv_data, request, response); ONION_DEBUG0("Result: %d",res); if (res){ // write pending data. if (!(response->flags&OR_HEADER_SENT) && response->buffer_pos<sizeof(response->buffer)) onion_response_set_length(response, response->buffer_pos); onion_response_flush(response); if (res==OCS_WEBSOCKET){ if (request->websocket) return onion_websocket_call(request->websocket); else{ ONION_ERROR("Handler did set the OCS_WEBSOCKET, but did not initialize the websocket on this request."); return OCS_INTERNAL_ERROR; } } return res; } } handler=handler->next; } return OCS_NOT_PROCESSED; }