Ошибки при получении тела запроса в 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
Между двумя версиями, но я ожидаю, что это будет связано с максимальным размером ответа в зависимости от платформы или заголовка запроса или чего-то еще.