eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2020-10-23 03:43 pm

Глюк с вебсокетом

Продолжаю развивать базу для построения веб-морд на основе 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!
Черт!!! Реально, это — проблема библиотеки. Автор, видимо, не подумал, что к серверу одновременно тысячи клиентов должны иметь возможность подключаться!
Грусть-печаль. Хоть сиди, да пиши патчи в библиотеку!

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org