2727#include < functional>
2828
2929#include " LinkedList.h"
30+ #include " util/StringUtils.h"
3031
3132#include < external/AsyncTCP.h>
3233#include < WiFi.h>
3334
35+ #include < string>
36+ #include < string_view>
37+
3438#ifdef ASYNCWEBSERVER_REGEX
3539#define ASYNCWEBSERVER_REGEX_ATTRIBUTE
3640#else
@@ -74,23 +78,23 @@ typedef std::function<void(void)> ArDisconnectHandler;
7478
7579class AsyncWebParameter {
7680private:
77- String _name;
78- String _value;
81+ std::string _name;
82+ std::string _value;
7983 size_t _size;
8084 bool _isForm;
8185 bool _isFile;
8286
8387public:
84- AsyncWebParameter (const String& name, const String& value, bool form = false , bool file = false , size_t size = 0 )
88+ AsyncWebParameter (std::string_view name, std::string_view value, bool form = false , bool file = false , size_t size = 0 )
8589 : _name(name)
8690 , _value(value)
8791 , _size(size)
8892 , _isForm(form)
8993 , _isFile(file)
9094 {
9195 }
92- const String & name () const { return _name; }
93- const String & value () const { return _value; }
96+ const std::string & name () const { return _name; }
97+ const std::string & value () const { return _value; }
9498 size_t size () const { return _size; }
9599 bool isPost () const { return _isForm; }
96100 bool isFile () const { return _isFile; }
@@ -102,29 +106,31 @@ class AsyncWebParameter {
102106
103107class AsyncWebHeader {
104108private:
105- String _name;
106- String _value;
109+ std::string _name;
110+ std::string _value;
107111
108112public:
109- AsyncWebHeader (const String& name, const String& value)
113+ AsyncWebHeader (std::string_view name, std::string_view value)
110114 : _name(name)
111115 , _value(value)
112116 {
113117 }
114- AsyncWebHeader (const String& data)
118+ AsyncWebHeader (std::string_view data)
115119 : _name()
116120 , _value()
117121 {
118- if (!data) return ;
119- int index = data.indexOf (' :' );
120- if (index < 0 ) return ;
121- _name = data.substring (0 , index);
122- _value = data.substring (index + 2 );
122+ if (data.empty ()) return ;
123+
124+ auto index = data.find (' :' );
125+ if (index == std::string_view::npos) return ;
126+
127+ _name = data.substr (0 , index);
128+ _value = OpenShock::StringTrim (data.substr (index));
123129 }
124130 ~AsyncWebHeader () { }
125- const String & name () const { return _name; }
126- const String & value () const { return _value; }
127- String toString () const { return String (_name + " : " + _value + " \r\n " ); }
131+ const std::string & name () const { return _name; }
132+ const std::string & value () const { return _value; }
133+ std::string toString () const { return std::string (_name + " : " + _value + " \r\n " ); }
128134};
129135
130136/*
@@ -155,16 +161,16 @@ class AsyncWebServerRequest {
155161 AsyncWebServerResponse* _response;
156162 ArDisconnectHandler _onDisconnectfn;
157163
158- String _temp;
164+ std::string _temp;
159165 uint8_t _parseState;
160166
161167 uint8_t _version;
162168 WebRequestMethodComposite _method;
163- String _url;
164- String _host;
165- String _contentType;
166- String _boundary;
167- String _authorization;
169+ std::string _url;
170+ std::string _host;
171+ std::string _contentType;
172+ std::string _boundary;
173+ std::string _authorization;
168174 RequestedConnectionType _reqconntype;
169175 bool _isDigest;
170176 bool _isMultipart;
@@ -175,16 +181,16 @@ class AsyncWebServerRequest {
175181
176182 LinkedList<AsyncWebHeader*> _headers;
177183 LinkedList<AsyncWebParameter*> _params;
178- LinkedList<String *> _pathParams;
184+ LinkedList<std::string *> _pathParams;
179185
180186 uint8_t _multiParseState;
181187 uint8_t _boundaryPosition;
182188 size_t _itemStartIndex;
183189 size_t _itemSize;
184- String _itemName;
185- String _itemFilename;
186- String _itemType;
187- String _itemValue;
190+ std::string _itemName;
191+ std::string _itemFilename;
192+ std::string _itemType;
193+ std::string _itemValue;
188194 uint8_t * _itemBuffer;
189195 size_t _itemBufferIndex;
190196 bool _itemIsFile;
@@ -204,7 +210,7 @@ class AsyncWebServerRequest {
204210 void _parseLine ();
205211 void _parsePlainPostChar (uint8_t data);
206212 void _parseMultipartPostByte (uint8_t data, bool last);
207- void _addGetParams (const String& params);
213+ void _addGetParams (std::string_view params);
208214
209215 void _handleUploadStart ();
210216 void _handleUploadByte (uint8_t data, bool last);
@@ -220,9 +226,9 @@ class AsyncWebServerRequest {
220226 AsyncClient* client () { return _client; }
221227 uint8_t version () const { return _version; }
222228 WebRequestMethodComposite method () const { return _method; }
223- const String & url () const { return _url; }
224- const String & host () const { return _host; }
225- const String & contentType () const { return _contentType; }
229+ const std::string & url () const { return _url; }
230+ const std::string & host () const { return _host; }
231+ const std::string & contentType () const { return _contentType; }
226232 size_t contentLength () const { return _contentLength; }
227233 bool multipart () const { return _isMultipart; }
228234 const char * methodToString () const ;
@@ -233,59 +239,52 @@ class AsyncWebServerRequest {
233239
234240 void setHandler (AsyncWebHandler* handler) { _handler = handler; }
235241
236- void redirect (const String& url);
242+ void redirect (std::string_view url);
237243
238244 void send (AsyncWebServerResponse* response);
239- void send (int code, const String& contentType = String(), const String& content = String());
240- void send (FS& fs, const String& path, const String& contentType = String(), bool download = false);
241- void send (File content, const String& path, const String& contentType = String(), bool download = false);
242- void send (Stream& stream, const String& contentType, size_t len);
243- void send (const String& contentType, size_t len, AwsResponseFiller callback);
244- void sendChunked (const String& contentType, AwsResponseFiller callback);
245- void send_P (int code, const String& contentType, const uint8_t * content, size_t len);
246- void send_P (int code, const String& contentType, PGM_P content);
247-
248- AsyncWebServerResponse* beginResponse (int code, const String& contentType = String(), const String& content = String());
249- AsyncWebServerResponse* beginResponse (FS& fs, const String& path, const String& contentType = String(), bool download = false);
250- AsyncWebServerResponse* beginResponse (File content, const String& path, const String& contentType = String(), bool download = false);
251- AsyncWebServerResponse* beginResponse (Stream& stream, const String& contentType, size_t len);
252- AsyncWebServerResponse* beginResponse (const String& contentType, size_t len, AwsResponseFiller callback);
253- AsyncWebServerResponse* beginChunkedResponse (const String& contentType, AwsResponseFiller callback);
254- AsyncResponseStream* beginResponseStream (const String& contentType, size_t bufferSize = 1460 );
255- AsyncWebServerResponse* beginResponse_P (int code, const String& contentType, const uint8_t * content, size_t len);
256- AsyncWebServerResponse* beginResponse_P (int code, const String& contentType, PGM_P content);
257-
258- size_t headers () const ; // get header count
259- bool hasHeader (const String& name) const ; // check if header exists
260- bool hasHeader (const __FlashStringHelper* data) const ; // check if header exists
261-
262- AsyncWebHeader* getHeader (const String& name) const ;
263- AsyncWebHeader* getHeader (const __FlashStringHelper* data) const ;
245+ void send (int code, std::string_view contentType = {}, std::string_view content = {});
246+ void send (FS& fs, std::string_view path, std::string_view contentType = {}, bool download = false );
247+ void send (File content, std::string_view path, std::string_view contentType = {}, bool download = false );
248+ void send (Stream& stream, std::string_view contentType, size_t len);
249+ void send (std::string_view contentType, size_t len, AwsResponseFiller callback);
250+ void sendChunked (std::string_view contentType, AwsResponseFiller callback);
251+ void send_P (int code, std::string_view contentType, const uint8_t * content, size_t len);
252+ void send_P (int code, std::string_view contentType, PGM_P content);
253+
254+ AsyncWebServerResponse* beginResponse (int code, std::string_view contentType = {}, std::string_view content = {});
255+ AsyncWebServerResponse* beginResponse (FS& fs, std::string_view path, std::string_view contentType = {}, bool download = false );
256+ AsyncWebServerResponse* beginResponse (File content, std::string_view path, std::string_view contentType = {}, bool download = false );
257+ AsyncWebServerResponse* beginResponse (Stream& stream, std::string_view contentType, size_t len);
258+ AsyncWebServerResponse* beginResponse (std::string_view contentType, size_t len, AwsResponseFiller callback);
259+ AsyncWebServerResponse* beginChunkedResponse (std::string_view contentType, AwsResponseFiller callback);
260+ AsyncResponseStream* beginResponseStream (std::string_view contentType, size_t bufferSize = 1460 );
261+ AsyncWebServerResponse* beginResponse_P (int code, std::string_view contentType, const uint8_t * content, size_t len);
262+ AsyncWebServerResponse* beginResponse_P (int code, std::string_view contentType, PGM_P content);
263+
264+ size_t headers () const ; // get header count
265+ bool hasHeader (std::string_view name) const ; // check if header exists
266+
267+ AsyncWebHeader* getHeader (std::string_view name) const ;
264268 AsyncWebHeader* getHeader (size_t num) const ;
265269
266270 size_t params () const ; // get arguments count
267- bool hasParam (const String& name, bool post = false , bool file = false ) const ;
268- bool hasParam (const __FlashStringHelper* data, bool post = false , bool file = false ) const ;
271+ bool hasParam (std::string_view name, bool post = false , bool file = false ) const ;
269272
270- AsyncWebParameter* getParam (const String& name, bool post = false , bool file = false ) const ;
271- AsyncWebParameter* getParam (const __FlashStringHelper* data, bool post , bool file) const ;
273+ AsyncWebParameter* getParam (std::string_view name, bool post = false , bool file = false ) const ;
272274 AsyncWebParameter* getParam (size_t num) const ;
273275
274- size_t args () const { return params (); } // get arguments count
275- const String& arg (const String& name) const ; // get request argument value by name
276- const String& arg (const __FlashStringHelper* data) const ; // get request argument value by F(name)
277- const String& arg (size_t i) const ; // get request argument value by number
278- const String& argName (size_t i) const ; // get request argument name by number
279- bool hasArg (const char * name) const ; // check if argument exists
280- bool hasArg (const __FlashStringHelper* data) const ; // check if F(argument) exists
281-
282- const String& ASYNCWEBSERVER_REGEX_ATTRIBUTE pathArg (size_t i) const ;
283-
284- const String& header (const char * name) const ; // get request header value by name
285- const String& header (const __FlashStringHelper* data) const ; // get request header value by F(name)
286- const String& header (size_t i) const ; // get request header value by number
287- const String& headerName (size_t i) const ; // get request header name by number
288- String urlDecode (const String& text) const ;
276+ size_t args () const { return params (); } // get arguments count
277+ const std::string& arg (std::string_view name) const ; // get request argument value by name
278+ const std::string& arg (size_t i) const ; // get request argument value by number
279+ const std::string& argName (size_t i) const ; // get request argument name by number
280+ bool hasArg (const char * name) const ; // check if argument exists
281+
282+ const std::string& ASYNCWEBSERVER_REGEX_ATTRIBUTE pathArg (size_t i) const ;
283+
284+ const std::string& header (const char * name) const ; // get request header value by name
285+ const std::string& header (size_t i) const ; // get request header value by number
286+ const std::string& headerName (size_t i) const ; // get request header name by number
287+ String urlDecode (std::string_view text) const ;
289288};
290289
291290/*
@@ -318,7 +317,12 @@ class AsyncWebHandler {
318317 virtual bool canHandle (AsyncWebServerRequest* request __attribute__ ((unused))) { return false ; }
319318 virtual void handleRequest (AsyncWebServerRequest* request __attribute__ ((unused))) { }
320319 virtual void handleUpload (
321- AsyncWebServerRequest* request __attribute__ ((unused)), const String& filename __attribute__((unused)), size_t index __attribute__((unused)), uint8_t* data __attribute__((unused)), size_t len __attribute__((unused)), bool final __attribute__((unused))
320+ AsyncWebServerRequest* request __attribute__ ((unused)),
321+ std::string_view filename __attribute__((unused)),
322+ size_t index __attribute__((unused)),
323+ uint8_t* data __attribute__((unused)),
324+ size_t len __attribute__((unused)),
325+ bool final __attribute__((unused))
322326 )
323327 {
324328 }
@@ -343,7 +347,7 @@ class AsyncWebServerResponse {
343347protected:
344348 int _code;
345349 LinkedList<AsyncWebHeader*> _headers;
346- String _contentType;
350+ std::string _contentType;
347351 size_t _contentLength;
348352 bool _sendContentLength;
349353 bool _chunked;
@@ -359,9 +363,9 @@ class AsyncWebServerResponse {
359363 virtual ~AsyncWebServerResponse ();
360364 virtual void setCode (int code);
361365 virtual void setContentLength (size_t len);
362- virtual void setContentType (const String& type);
363- virtual void addHeader (const String& name, const String& value);
364- virtual String _assembleHead (uint8_t version);
366+ virtual void setContentType (std::string_view type);
367+ virtual void addHeader (std::string_view name, std::string_view value);
368+ virtual std::string _assembleHead (uint8_t version);
365369 virtual bool _started () const ;
366370 virtual bool _finished () const ;
367371 virtual bool _failed () const ;
@@ -375,7 +379,7 @@ class AsyncWebServerResponse {
375379 * */
376380
377381typedef std::function<void (AsyncWebServerRequest* request)> ArRequestHandlerFunction;
378- typedef std::function<void (AsyncWebServerRequest* request, const String& filename, size_t index, uint8_t * data, size_t len, bool final )> ArUploadHandlerFunction;
382+ typedef std::function<void (AsyncWebServerRequest* request, std::string_view filename, size_t index, uint8_t * data, size_t len, bool final )> ArUploadHandlerFunction;
379383typedef std::function<void (AsyncWebServerRequest* request, uint8_t * data, size_t len, size_t index, size_t total)> ArBodyHandlerFunction;
380384
381385class AsyncWebServer {
@@ -428,7 +432,7 @@ class DefaultHeaders {
428432public:
429433 using ConstIterator = headers_t ::ConstIterator;
430434
431- void addHeader (const String & name, const String & value) { _headers.add (new AsyncWebHeader (name, value)); }
435+ void addHeader (const std::string & name, const std::string & value) { _headers.add (new AsyncWebHeader (name, value)); }
432436
433437 ConstIterator begin () const { return _headers.begin (); }
434438 ConstIterator end () const { return _headers.end (); }
0 commit comments