Емельянов Эдуард Владимирович (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

  • Как пользоваться переменными в ld-cкрипте?

    Очень неудобно задавать размер блока флеш-памяти в заголовочных файлах, т.к. он все равно должен быть определен в линкере (для выравнивания начала…

  • Хеши строковых команд для МК

    Долго я к этому шел, но, похоже, пора уже: однобуквенные команды сложно запоминать (особенно если команд толпа, и большая часть с этими буквами…

  • M$ teams…

    Начал с сегодняшнего дня студентам ЮФУ удаленно лекции читать. У них все завязано на различные корпорации зла. И базовая работа - через teams. ОК,…

promo eddy_em september 3, 12:13 8
Buy for 10 tokens
Уже больше полугода занимаюсь разработкой, вот, наконец-то в мастерских взялись за меня и начали выдавать первые детали. Сегодня сделал тестовую сборку (как обычно, местами пришлось "доработать напильником"): Пока прибор без названия (да и как-то не лезет в голову ничего, у меня нет…
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 18 comments

  • Как пользоваться переменными в ld-cкрипте?

    Очень неудобно задавать размер блока флеш-памяти в заголовочных файлах, т.к. он все равно должен быть определен в линкере (для выравнивания начала…

  • Хеши строковых команд для МК

    Долго я к этому шел, но, похоже, пора уже: однобуквенные команды сложно запоминать (особенно если команд толпа, и большая часть с этими буквами…

  • M$ teams…

    Начал с сегодняшнего дня студентам ЮФУ удаленно лекции читать. У них все завязано на различные корпорации зла. И базовая работа - через teams. ОК,…