Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

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

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

  • Опять Подорванка смыла мост

    В четверг лило настолько, что, похоже, опять на подорванке забилась стремнина бревнами, а потом внезапно это все прорвало. МЧСовсцы перетаскивали…

  • Diskworld

    Смотрели вчера с женой на кухне "Крепкого орешка" и зацепился мой взгляд за дочкину поделку: Я жене и говорю: прямо-таки просится эти белые…

  • Юпитер и Сатурн

    Слишком близко к Солнцу, чтобы что-то получилось, а также слишком разные по яркости, чтобы без обработки их можно было бы снять одновременно.

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 18 comments

  • Опять Подорванка смыла мост

    В четверг лило настолько, что, похоже, опять на подорванке забилась стремнина бревнами, а потом внезапно это все прорвало. МЧСовсцы перетаскивали…

  • Diskworld

    Смотрели вчера с женой на кухне "Крепкого орешка" и зацепился мой взгляд за дочкину поделку: Я жене и говорю: прямо-таки просится эти белые…

  • Юпитер и Сатурн

    Слишком близко к Солнцу, чтобы что-то получилось, а также слишком разные по яркости, чтобы без обработки их можно было бы снять одновременно.