Flash String support (#137)

* Flash String support

* use strlen_P and strcpy_p
This commit is contained in:
sticilface 2017-03-05 18:06:57 +00:00 committed by Me No Dev
parent 9b66da2c92
commit 3afc669f10
2 changed files with 118 additions and 0 deletions

View File

@ -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;

View File

@ -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<PGM_P>(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; b<n; b++)
name[b] = pgm_read_byte(p++);
bool result = hasHeader( String(name) );
free(name);
return result;
} else {
return false;
}
}
AsyncWebHeader* AsyncWebServerRequest::getHeader(const String& name) const {
for(const auto& h: _headers){
if(h->name().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<PGM_P>(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<PGM_P>(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<PGM_P>(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<PGM_P>(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<PGM_P>(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<PGM_P>(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;