diff --git a/src/ESPAsyncWebServer.h b/src/ESPAsyncWebServer.h index ed45f3b..4af8ff2 100644 --- a/src/ESPAsyncWebServer.h +++ b/src/ESPAsyncWebServer.h @@ -228,21 +228,30 @@ class AsyncWebServerRequest { size_t headers() const; // get header count bool hasHeader(const String& name) const; // check if header exists + bool hasHeader(const __FlashStringHelper * data) const; // check if header exists + AsyncWebHeader* getHeader(const String& name) const; + AsyncWebHeader* getHeader(const __FlashStringHelper * data) const; AsyncWebHeader* getHeader(size_t num) const; size_t params() const; // get arguments count bool hasParam(const String& name, bool post=false, bool file=false) const; + bool hasParam(const __FlashStringHelper * data, bool post=false, bool file=false) const; + AsyncWebParameter* getParam(const String& name, bool post=false, bool file=false) const; + AsyncWebParameter* getParam(const __FlashStringHelper * data, bool post, bool file) const; AsyncWebParameter* getParam(size_t num) const; size_t args() const { return params(); } // get arguments count const String& arg(const String& name) const; // get request argument value by name + const String& arg(const __FlashStringHelper * data) const; // get request argument value by F(name) const String& arg(size_t i) const; // get request argument value by number const String& argName(size_t i) const; // get request argument name by number bool hasArg(const char* name) const; // check if argument exists + bool hasArg(const __FlashStringHelper * data) const; // check if F(argument) exists const String& header(const char* name) const;// get request header value by name + const String& header(const __FlashStringHelper * data) const;// get request header value by F(name) 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 String urlDecode(const String& text) const; diff --git a/src/WebRequest.cpp b/src/WebRequest.cpp index 501d227..7a26c59 100644 --- a/src/WebRequest.cpp +++ b/src/WebRequest.cpp @@ -541,6 +541,26 @@ bool AsyncWebServerRequest::hasHeader(const String& name) const { return false; } +bool AsyncWebServerRequest::hasHeader(const __FlashStringHelper * data) const { + PGM_P p = reinterpret_cast(data); + size_t n = 0; + while (1) { + if (pgm_read_byte(p+n) == 0) break; + n += 1; + } + char * name = (char*) malloc(n+1); + name[n] = 0; + if (name) { + for(size_t b=0; bname().equalsIgnoreCase(name)){ @@ -550,6 +570,20 @@ AsyncWebHeader* AsyncWebServerRequest::getHeader(const String& name) const { return nullptr; } +AsyncWebHeader* AsyncWebServerRequest::getHeader(const __FlashStringHelper * data) const { + PGM_P p = reinterpret_cast(data); + size_t n = strlen_P(p); + char * name = (char*) malloc(n+1); + if (name) { + strcpy_P(name, p); + AsyncWebHeader* result = getHeader( String(name)); + free(name); + return result; + } else { + return nullptr; + } +} + AsyncWebHeader* AsyncWebServerRequest::getHeader(size_t num) const { auto header = _headers.nth(num); return header ? *header : nullptr; @@ -568,6 +602,22 @@ bool AsyncWebServerRequest::hasParam(const String& name, bool post, bool file) c return false; } +bool AsyncWebServerRequest::hasParam(const __FlashStringHelper * data, bool post, bool file) const { + PGM_P p = reinterpret_cast(data); + size_t n = strlen_P(p); + + char * name = (char*) malloc(n+1); + name[n] = 0; + if (name) { + strcpy_P(name,p); + bool result = hasParam( name, post, file); + free(name); + return result; + } else { + return false; + } +} + AsyncWebParameter* AsyncWebServerRequest::getParam(const String& name, bool post, bool file) const { for(const auto& p: _params){ if(p->name() == name && p->isPost() == post && p->isFile() == file){ @@ -577,6 +627,20 @@ AsyncWebParameter* AsyncWebServerRequest::getParam(const String& name, bool post return nullptr; } +AsyncWebParameter* AsyncWebServerRequest::getParam(const __FlashStringHelper * data, bool post, bool file) const { + PGM_P p = reinterpret_cast(data); + size_t n = strlen_P(p); + char * name = (char*) malloc(n+1); + if (name) { + strcpy_P(name, p); + AsyncWebParameter* result = getParam(name, post, file); + free(name); + return result; + } else { + return nullptr; + } +} + AsyncWebParameter* AsyncWebServerRequest::getParam(size_t num) const { auto param = _params.nth(num); return param ? *param : nullptr; @@ -747,6 +811,21 @@ bool AsyncWebServerRequest::hasArg(const char* name) const { return false; } +bool AsyncWebServerRequest::hasArg(const __FlashStringHelper * data) const { + PGM_P p = reinterpret_cast(data); + size_t n = strlen_P(p); + char * name = (char*) malloc(n+1); + if (name) { + strcpy_P(name, p); + bool result = hasArg( name ); + free(name); + return result; + } else { + return false; + } +} + + const String& AsyncWebServerRequest::arg(const String& name) const { for(const auto& arg: _params){ if(arg->name() == name){ @@ -756,6 +835,21 @@ const String& AsyncWebServerRequest::arg(const String& name) const { return SharedEmptyString; } +const String& AsyncWebServerRequest::arg(const __FlashStringHelper * data) const { + PGM_P p = reinterpret_cast(data); + size_t n = strlen_P(p); + char * name = (char*) malloc(n+1); + if (name) { + strcpy(name, p); + const String & result = arg( String(name) ); + free(name); + return result; + } else { + return SharedEmptyString; + } + +} + const String& AsyncWebServerRequest::arg(size_t i) const { return getParam(i)->value(); } @@ -769,6 +863,21 @@ const String& AsyncWebServerRequest::header(const char* name) const { return h ? h->value() : SharedEmptyString; } +const String& AsyncWebServerRequest::header(const __FlashStringHelper * data) const { + PGM_P p = reinterpret_cast(data); + size_t n = strlen_P(p); + char * name = (char*) malloc(n+1); + if (name) { + strcpy_P(name, p); + const String & result = header( (const char *)name ); + free(name); + return result; + } else { + return SharedEmptyString; + } +}; + + const String& AsyncWebServerRequest::header(size_t i) const { AsyncWebHeader* h = getHeader(i); return h ? h->value() : SharedEmptyString;