Ошибки при получении тела запроса в Mongoose WebServer

Я работаю со старой версией mongoose (веб-сервер с открытым исходным кодом) на C, которая не обеспечивала нативный доступ к полезной нагрузке запросов. Для поддержки запросов POST и PUT я изменил их вручную: после того, как mongoose читает заголовки, я проверяю, Content-Length и если да, я снова читаю из сокета Content-Lenght персонажи.

    findCL = strstr(conn->buf, "Content-Length:");
    if (findCL)
    {
        // skip "Content-Length:" string
        findCL += 15 * sizeof(char);
        findCLEnd = (char*)strchr(findCL, delimiter);
        sizeLen = findCLEnd - findCL;
        strncpy(CLSize, findCL, sizeLen);
        CLSize[sizeLen] = '\0';

        size = strtoll(CLSize, NULL, 10);

        if (size > 0)
        {
            conn->content_len = read_request(NULL, conn->client.sock, conn->ssl,
                conn->buf, conn->buf_size, &conn->data_len);
            conn->content_len = size;
            perror("recv");
            body = (char*)malloc(sizeof(char) * (size + 1));
            strncpy(body, conn->buf + conn->request_len, size);
            body[size] = '\0';
        }
    }

Пока все хорошо, даже если код не такой красивый, он делает грязную работу. Проблема в том, что при отладке код работает нормально, но когда код выполняется как простой фоновый процесс, тело не анализируется правильно: иногда результирующее тело усекается, а иногда просто пусто. Кажется, что проблема вызвана быстрыми запросами от клиентов.

1 ответ

Не настоящий ответ, но я так решил. Модуль веб-сервера начинался как веб-сервер Mongoose; Я перенес его на Civetweb несколько месяцев назад, надеясь, что последние версии проекта также будут поддерживать разбор тела. Это было не так, и мне пришлось реализовать это вручную. Через некоторое время я обнаружил, что у Civetweb есть проблемы с обслуживанием файлов Javascript в браузерах IE8 (по какой-то загадочной причине). Я вернулся к Mongoose, и все работало, кроме парсинга тела, что привело к приведенному выше коду и последующим ошибкам. Я наконец решил, вернувшись обратно к Civetweb, стабильной версии 1.9.1, сохранив процедуру парсинга тела вручную. Это решило как усеченное тело запросов, так и усеченные обслуживаемые файлы javascript. Вероятно, первая версия Civetweb была не очень стабильной бета-версией, хотя мне интересно, как ей удавалось работать месяцами.

Я до сих пор не проверил diffМежду двумя версиями, но я ожидаю, что это будет связано с максимальным размером ответа в зависимости от платформы или заголовка запроса или чего-то еще.

Другие вопросы по тегам