mirror of
https://github.com/me-no-dev/ESPAsyncWebServer.git
synced 2025-09-30 08:10:56 +02:00
Fix header removal logic
This commit is contained in:
@@ -85,6 +85,27 @@ void setup() {
|
|||||||
WiFi.softAP("esp-captive");
|
WiFi.softAP("esp-captive");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Request header manipulations
|
||||||
|
// curl -v -X GET -H "x-remove-me: value" http://192.168.4.1/headers
|
||||||
|
server.on("/headers", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||||
|
Serial.printf("Request Headers:\n");
|
||||||
|
for (auto& h : request->getHeaders())
|
||||||
|
Serial.printf("Request Header: %s = %s\n", h.name().c_str(), h.value().c_str());
|
||||||
|
|
||||||
|
// remove x-remove-me header
|
||||||
|
request->removeHeader("x-remove-me");
|
||||||
|
Serial.printf("Request Headers:\n");
|
||||||
|
for (auto& h : request->getHeaders())
|
||||||
|
Serial.printf("Request Header: %s = %s\n", h.name().c_str(), h.value().c_str());
|
||||||
|
|
||||||
|
std::vector<const char*> headers;
|
||||||
|
request->getHeaderNames(headers);
|
||||||
|
for (auto& h : headers)
|
||||||
|
Serial.printf("Request Header Name: %s\n", h);
|
||||||
|
|
||||||
|
request->send(200);
|
||||||
|
});
|
||||||
|
|
||||||
server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) {
|
server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||||
request->send(200, "text/plain", "Hello, world");
|
request->send(200, "text/plain", "Hello, world");
|
||||||
});
|
});
|
||||||
|
@@ -289,12 +289,12 @@ class AsyncWebServerRequest {
|
|||||||
void setHandler(AsyncWebHandler* handler) { _handler = handler; }
|
void setHandler(AsyncWebHandler* handler) { _handler = handler; }
|
||||||
|
|
||||||
#ifndef ESP8266
|
#ifndef ESP8266
|
||||||
[[deprecated("All headers are now collected. Use removeHeadersExcept(name) if you really need to free some headers.")]]
|
[[deprecated("All headers are now collected. Use removeHeader(name) or HeaderFreeMiddleware if you really need to free some headers.")]]
|
||||||
#endif
|
#endif
|
||||||
void addInterestingHeader(__unused const char* name) {
|
void addInterestingHeader(__unused const char* name) {
|
||||||
}
|
}
|
||||||
#ifndef ESP8266
|
#ifndef ESP8266
|
||||||
[[deprecated("All headers are now collected. Use removeHeadersExcept(name) if you really need to free some headers.")]]
|
[[deprecated("All headers are now collected. Use removeHeader(name) or HeaderFreeMiddleware if you really need to free some headers.")]]
|
||||||
#endif
|
#endif
|
||||||
void addInterestingHeader(__unused const String& name) {
|
void addInterestingHeader(__unused const String& name) {
|
||||||
}
|
}
|
||||||
@@ -398,77 +398,6 @@ class AsyncWebServerRequest {
|
|||||||
AsyncWebServerResponse* beginResponse(int code, const String& contentType, PGM_P content, AwsTemplateProcessor callback = nullptr);
|
AsyncWebServerResponse* beginResponse(int code, const String& contentType, PGM_P content, AwsTemplateProcessor callback = nullptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
size_t headers() const; // get header count
|
|
||||||
|
|
||||||
// check if header exists
|
|
||||||
bool hasHeader(const char* name) const;
|
|
||||||
bool hasHeader(const String& name) const { return hasHeader(name.c_str()); };
|
|
||||||
#ifdef ESP8266
|
|
||||||
bool hasHeader(const __FlashStringHelper* data) const; // check if header exists
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const AsyncWebHeader* getHeader(const char* name) const;
|
|
||||||
const AsyncWebHeader* getHeader(const String& name) const { return getHeader(name.c_str()); };
|
|
||||||
#ifdef ESP8266
|
|
||||||
const AsyncWebHeader* getHeader(const __FlashStringHelper* data) const;
|
|
||||||
#endif
|
|
||||||
const AsyncWebHeader* getHeader(size_t num) const;
|
|
||||||
size_t getHeaderNames(std::vector<const char*>& names) const {
|
|
||||||
names.clear();
|
|
||||||
const size_t size = _headers.size();
|
|
||||||
names.reserve(size);
|
|
||||||
for (const auto& h : _headers) {
|
|
||||||
names.push_back(h.name().c_str());
|
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
const std::list<AsyncWebHeader>& getHeaders() const { return _headers; }
|
|
||||||
// Remove a header from the request.
|
|
||||||
// It will free the memory and prevent the header to be seen during request processing.
|
|
||||||
bool removeHeader(const char* name) {
|
|
||||||
const size_t size = _headers.size();
|
|
||||||
_headers.remove_if([&name](const AsyncWebHeader& header) { return header.name().equalsIgnoreCase(name); });
|
|
||||||
return size != _headers.size();
|
|
||||||
}
|
|
||||||
// Remove all request headers.
|
|
||||||
void removeHeaders() { _headers.clear(); }
|
|
||||||
// Remove all request headers with the given names.
|
|
||||||
void removeHeaders(std::vector<const char*>& namesToRemove) {
|
|
||||||
for (const char* name : namesToRemove)
|
|
||||||
removeHeader(name);
|
|
||||||
}
|
|
||||||
void removeHeaders(const char* names...) {
|
|
||||||
va_list args;
|
|
||||||
va_start(args, names);
|
|
||||||
for (const char* name = names; name != NULL; name = va_arg(args, const char*))
|
|
||||||
removeHeader(name);
|
|
||||||
va_end(args);
|
|
||||||
}
|
|
||||||
void removeHeadersExcept(std::vector<const char*>& namesToKeep) {
|
|
||||||
_headers.remove_if([&namesToKeep](const AsyncWebHeader& header) {
|
|
||||||
for (const char* name : namesToKeep)
|
|
||||||
if (header.name().equalsIgnoreCase(name))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
void removeHeadersExcept(const char* names...) {
|
|
||||||
va_list args;
|
|
||||||
va_start(args, names);
|
|
||||||
std::vector<const char*> namesToKeep;
|
|
||||||
for (const char* name = names; name != NULL; name = va_arg(args, const char*))
|
|
||||||
namesToKeep.push_back(name);
|
|
||||||
va_end(args);
|
|
||||||
removeHeadersExcept(namesToKeep);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t params() const; // get arguments count
|
|
||||||
bool hasParam(const char* name, bool post = false, bool file = false) const;
|
|
||||||
bool hasParam(const String& name, bool post = false, bool file = false) const { return hasParam(name.c_str(), post, file); };
|
|
||||||
#ifdef ESP8266
|
|
||||||
bool hasParam(const __FlashStringHelper* data, bool post = false, bool file = false) const { return hasParam(String(data).c_str(), post, file); };
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the Request parameter by name
|
* @brief Get the Request parameter by name
|
||||||
*
|
*
|
||||||
@@ -522,6 +451,52 @@ class AsyncWebServerRequest {
|
|||||||
const String& header(size_t i) const; // get request header value by number
|
const String& header(size_t i) const; // get request header value by number
|
||||||
const String& headerName(size_t i) const; // get request header name by number
|
const String& headerName(size_t i) const; // get request header name by number
|
||||||
|
|
||||||
|
size_t headers() const; // get header count
|
||||||
|
|
||||||
|
// check if header exists
|
||||||
|
bool hasHeader(const char* name) const;
|
||||||
|
bool hasHeader(const String& name) const { return hasHeader(name.c_str()); };
|
||||||
|
#ifdef ESP8266
|
||||||
|
bool hasHeader(const __FlashStringHelper* data) const; // check if header exists
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const AsyncWebHeader* getHeader(const char* name) const;
|
||||||
|
const AsyncWebHeader* getHeader(const String& name) const { return getHeader(name.c_str()); };
|
||||||
|
#ifdef ESP8266
|
||||||
|
const AsyncWebHeader* getHeader(const __FlashStringHelper* data) const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const AsyncWebHeader* getHeader(size_t num) const;
|
||||||
|
|
||||||
|
const std::list<AsyncWebHeader>& getHeaders() const { return _headers; }
|
||||||
|
|
||||||
|
size_t getHeaderNames(std::vector<const char*>& names) const {
|
||||||
|
names.clear();
|
||||||
|
const size_t size = _headers.size();
|
||||||
|
names.reserve(size);
|
||||||
|
for (const auto& h : _headers) {
|
||||||
|
names.push_back(h.name().c_str());
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove a header from the request.
|
||||||
|
// It will free the memory and prevent the header to be seen during request processing.
|
||||||
|
bool removeHeader(const char* name) {
|
||||||
|
const size_t size = _headers.size();
|
||||||
|
_headers.remove_if([name](const AsyncWebHeader& header) { return header.name().equalsIgnoreCase(name); });
|
||||||
|
return size != _headers.size();
|
||||||
|
}
|
||||||
|
// Remove all request headers.
|
||||||
|
void removeHeaders() { _headers.clear(); }
|
||||||
|
|
||||||
|
size_t params() const; // get arguments count
|
||||||
|
bool hasParam(const char* name, bool post = false, bool file = false) const;
|
||||||
|
bool hasParam(const String& name, bool post = false, bool file = false) const { return hasParam(name.c_str(), post, file); };
|
||||||
|
#ifdef ESP8266
|
||||||
|
bool hasParam(const __FlashStringHelper* data, bool post = false, bool file = false) const { return hasParam(String(data).c_str(), post, file); };
|
||||||
|
#endif
|
||||||
|
|
||||||
// REQUEST ATTRIBUTES
|
// REQUEST ATTRIBUTES
|
||||||
|
|
||||||
void setAttribute(const char* name, const char* value) { _attributes[name] = value; }
|
void setAttribute(const char* name, const char* value) { _attributes[name] = value; }
|
||||||
|
Reference in New Issue
Block a user