Глюк с вебсокетом
Продолжаю развивать базу для построения веб-морд на основе libonion. И вот, наткнулся на непонятный косяк: если я открыл веб-сокет, то создать из другой вкладки браузера (или из другого браузера) еще одно подключение не могу!
Вроде бы код правильный:
По аналогии с веб-сервером libonion должен на каждый запрос чего угодно по порту G.wsport запустить функцию websocket_run. Однако, не запускает, собака!
Вот сама websocket_run:
Если открываю во второй вкладке, а до истечения таймаута закрываю первую, то проходит коннект и все ОК. Но если вебсокет занят в первой вкладке, то во второй болты!
Вот интересно: это я нарукожопил или таки в libonion дыра?
Глянул примеры, которые идут с libonion!
Черт!!! Реально, это — проблема библиотеки. Автор, видимо, не подумал, что к серверу одновременно тысячи клиентов должны иметь возможность подключаться!
Грусть-печаль. Хоть сиди, да пиши патчи в библиотеку!
Вроде бы код правильный:
static void *runWS(_U_ void *data){
ow = onion_new(O_THREADED);
if(!(onion_flags(ow) & O_SSL_AVAILABLE)){
ONION_ERROR("SSL support is not available");
signals(1);
}
int error = onion_set_certificate(ow, O_SSL_CERTIFICATE_KEY, G.certfile, G.keyfile);
if(error){
ONION_ERROR("Cant set certificate and key files (%s, %s)", G.certfile, G.keyfile);
signals(1);
}
onion_set_port(ow, G.wsport);
onion_url *url = onion_root_url(ow);
onion_url_add(url, "", websocket_run);
DBG("Listen websocket");
error = onion_listen(ow);
if(error) ONION_ERROR("Cant create POST/GET server: %s", strerror(errno));
onion_free(ow);
return NULL;
}
По аналогии с веб-сервером libonion должен на каждый запрос чего угодно по порту G.wsport запустить функцию websocket_run. Однако, не запускает, собака!
Вот сама websocket_run:
onion_connection_status websocket_run(_U_ void *data, onion_request *req, onion_response *res){
FNAME();
onion_websocket *ws = onion_websocket_new(req, res);
if (!ws){
DBG("Processed");
return OCS_PROCESSED;
}
DBG("WS ready");
const char *host = onion_request_get_client_description(req);
const char *UA = onion_request_get_header(req, "User-Agent");
green("Got WS connection from %s (UA: %s)\n", host, UA);
WSdata *wsdata = calloc(1, sizeof(WSdata));
wsdata->flags = WS_FLAG_NOTAUTHORIZED;
wsdata->IPhash = MurmurOAAT64(host);
wsdata->UAhash = MurmurOAAT64(UA);
onion_websocket_set_userdata(ws, (void*)wsdata, free);
onion_websocket_set_callback(ws, websocket_cont);
return OCS_WEBSOCKET;
}
Если открываю во второй вкладке, а до истечения таймаута закрываю первую, то проходит коннект и все ОК. Но если вебсокет занят в первой вкладке, то во второй болты!
Вот интересно: это я нарукожопил или таки в libonion дыра?
Глянул примеры, которые идут с libonion!
Черт!!! Реально, это — проблема библиотеки. Автор, видимо, не подумал, что к серверу одновременно тысячи клиентов должны иметь возможность подключаться!
Грусть-печаль. Хоть сиди, да пиши патчи в библиотеку!