mirror of
https://github.com/esphome/esphome.git
synced 2025-08-09 11:57:46 +00:00
fixes
This commit is contained in:
parent
b16edb5a99
commit
04860567f7
@ -147,43 +147,21 @@ bool MultipartParser::parse_headers() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse Content-Disposition header (case-insensitive)
|
process_header_line(line);
|
||||||
if (str_startswith_case_insensitive(line, "content-disposition:")) {
|
|
||||||
// Extract name parameter
|
|
||||||
std::string name = extract_header_param(line, "name");
|
|
||||||
if (!name.empty()) {
|
|
||||||
current_name_ = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extract filename parameter if present
|
|
||||||
std::string filename = extract_header_param(line, "filename");
|
|
||||||
if (!filename.empty()) {
|
|
||||||
current_filename_ = filename;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Parse Content-Type header (case-insensitive)
|
|
||||||
else if (str_startswith_case_insensitive(line, "content-type:")) {
|
|
||||||
// Find the colon and skip it
|
|
||||||
size_t colon_pos = line.find(':');
|
|
||||||
if (colon_pos != std::string::npos) {
|
|
||||||
current_content_type_ = line.substr(colon_pos + 1);
|
|
||||||
// Trim leading whitespace
|
|
||||||
size_t start = current_content_type_.find_first_not_of(" \t");
|
|
||||||
if (start != std::string::npos) {
|
|
||||||
current_content_type_ = current_content_type_.substr(start);
|
|
||||||
} else {
|
|
||||||
current_content_type_.clear();
|
|
||||||
}
|
|
||||||
// Trim trailing whitespace
|
|
||||||
size_t end = current_content_type_.find_last_not_of(" \t\r\n");
|
|
||||||
if (end != std::string::npos) {
|
|
||||||
current_content_type_ = current_content_type_.substr(0, end + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MultipartParser::process_header_line(const std::string &line) {
|
||||||
|
if (str_startswith_case_insensitive(line, "content-disposition:")) {
|
||||||
|
// Extract name and filename parameters
|
||||||
|
current_name_ = extract_header_param(line, "name");
|
||||||
|
current_filename_ = extract_header_param(line, "filename");
|
||||||
|
} else if (str_startswith_case_insensitive(line, "content-type:")) {
|
||||||
|
current_content_type_ = extract_header_value(line);
|
||||||
|
}
|
||||||
|
// RFC 7578: Ignore any other Content-* headers
|
||||||
|
}
|
||||||
|
|
||||||
bool MultipartParser::extract_content() {
|
bool MultipartParser::extract_content() {
|
||||||
// Look for next boundary
|
// Look for next boundary
|
||||||
std::string search_boundary = CRLF_STR + boundary_;
|
std::string search_boundary = CRLF_STR + boundary_;
|
||||||
|
@ -52,6 +52,7 @@ class MultipartParser {
|
|||||||
private:
|
private:
|
||||||
bool find_boundary();
|
bool find_boundary();
|
||||||
bool parse_headers();
|
bool parse_headers();
|
||||||
|
void process_header_line(const std::string &line);
|
||||||
bool extract_content();
|
bool extract_content();
|
||||||
|
|
||||||
std::string read_line();
|
std::string read_line();
|
||||||
|
@ -207,6 +207,25 @@ inline bool is_form_urlencoded(const char *content_type) {
|
|||||||
return stristr(content_type, "application/x-www-form-urlencoded") != nullptr;
|
return stristr(content_type, "application/x-www-form-urlencoded") != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Trim whitespace from both ends of a string
|
||||||
|
inline std::string str_trim(const std::string &str) {
|
||||||
|
size_t start = str.find_first_not_of(" \t\r\n");
|
||||||
|
if (start == std::string::npos) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
size_t end = str.find_last_not_of(" \t\r\n");
|
||||||
|
return str.substr(start, end - start + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract header value (everything after the colon)
|
||||||
|
inline std::string extract_header_value(const std::string &header) {
|
||||||
|
size_t colon_pos = header.find(':');
|
||||||
|
if (colon_pos == std::string::npos) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return str_trim(header.substr(colon_pos + 1));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace web_server_idf
|
} // namespace web_server_idf
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
#endif // USE_WEBSERVER_OTA
|
#endif // USE_WEBSERVER_OTA
|
||||||
|
Loading…
x
Reference in New Issue
Block a user