фикс ошибок релизной сборки и парсинга большого тела запроса
This commit is contained in:
@@ -1,11 +1,31 @@
|
||||
#include "request_parser.hpp"
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
#include "request.hpp"
|
||||
|
||||
|
||||
namespace http::server {
|
||||
constexpr int HTTP_MAX_HEADERS = 64;
|
||||
|
||||
/**
|
||||
* Функция, позволяющая или запрещающая выделение размера тела для запросов.
|
||||
* @return true, если тело удовлетворяет размерам
|
||||
*/
|
||||
static bool requestBodySizeResolver(Request& req, size_t reqSize) {
|
||||
// разрешаем тело только для POST запросов
|
||||
if (req.method != "POST") {
|
||||
return false;
|
||||
}
|
||||
|
||||
// для обновления прошивки разрешаем большое тело
|
||||
if (req.url->path == "/api/firmwareUpdate") {
|
||||
return reqSize <= HTTP_MAX_PAYLOAD;
|
||||
}
|
||||
|
||||
return reqSize < 0x4000; // 16кб на все POST-запросы к API будет более чем достаточно
|
||||
}
|
||||
|
||||
static void parseParams(Url& u, const std::string& query) {
|
||||
std::istringstream iss(query);
|
||||
std::string param;
|
||||
@@ -72,7 +92,7 @@ namespace http::server {
|
||||
switch (state_) {
|
||||
case expecting_payload:
|
||||
req.payload.push_back(input);
|
||||
if (req.payload.size() <= contentLenghtHeader - 1) {
|
||||
if (req.payload.size() < contentLenghtHeader) {
|
||||
return indeterminate;
|
||||
}
|
||||
return good;
|
||||
@@ -186,17 +206,23 @@ namespace http::server {
|
||||
if (input == '\r') {
|
||||
state_ = expecting_newline_3;
|
||||
return indeterminate;
|
||||
} else if (!req.headers.empty() && (input == ' ' || input == '\t')) {
|
||||
}
|
||||
if (!req.headers.empty() && (input == ' ' || input == '\t')) {
|
||||
state_ = header_lws;
|
||||
return indeterminate;
|
||||
} else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) {
|
||||
return bad;
|
||||
} else {
|
||||
req.headers.emplace_back();
|
||||
req.headers.back().name.push_back(input);
|
||||
state_ = header_name;
|
||||
return indeterminate;
|
||||
}
|
||||
if (!is_char(input) || is_ctl(input) || is_tspecial(input)) {
|
||||
return bad;
|
||||
}
|
||||
|
||||
if (req.headers.size() > HTTP_MAX_HEADERS) {
|
||||
return bad;
|
||||
}
|
||||
req.headers.emplace_back();
|
||||
req.headers.back().name.push_back(input);
|
||||
state_ = header_name;
|
||||
return indeterminate;
|
||||
|
||||
case header_lws:
|
||||
if (input == '\r') {
|
||||
state_ = expecting_newline_2;
|
||||
@@ -255,11 +281,10 @@ namespace http::server {
|
||||
if (contentLenghtHeader == 0) {
|
||||
return good;
|
||||
}
|
||||
state_ = expecting_payload;
|
||||
if (contentLenghtHeader > HTTP_MAX_PAYLOAD) {
|
||||
return bad;
|
||||
if (requestBodySizeResolver(req, contentLenghtHeader)) {
|
||||
state_ = expecting_payload;
|
||||
return indeterminate;
|
||||
}
|
||||
return indeterminate;
|
||||
}
|
||||
return bad;
|
||||
|
||||
|
Reference in New Issue
Block a user