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");
|
||||
#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) {
|
||||
request->send(200, "text/plain", "Hello, world");
|
||||
});
|
||||
|
@@ -289,12 +289,12 @@ class AsyncWebServerRequest {
|
||||
void setHandler(AsyncWebHandler* handler) { _handler = handler; }
|
||||
|
||||
#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
|
||||
void addInterestingHeader(__unused const char* name) {
|
||||
}
|
||||
#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
|
||||
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);
|
||||
#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
|
||||
*
|
||||
@@ -522,6 +451,52 @@ class AsyncWebServerRequest {
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
void setAttribute(const char* name, const char* value) { _attributes[name] = value; }
|
||||
|
Reference in New Issue
Block a user