@@ -36,49 +36,49 @@ void* memchr(void* ptr, int ch, size_t count)
36
36
/*
37
37
* Abstract Response
38
38
* */
39
- const char * AsyncWebServerResponse::_responseCodeToString (int code) {
39
+ const __FlashStringHelper * AsyncWebServerResponse::_responseCodeToString (int code) {
40
40
switch (code) {
41
- case 100 : return " Continue" ;
42
- case 101 : return " Switching Protocols" ;
43
- case 200 : return " OK" ;
44
- case 201 : return " Created" ;
45
- case 202 : return " Accepted" ;
46
- case 203 : return " Non-Authoritative Information" ;
47
- case 204 : return " No Content" ;
48
- case 205 : return " Reset Content" ;
49
- case 206 : return " Partial Content" ;
50
- case 300 : return " Multiple Choices" ;
51
- case 301 : return " Moved Permanently" ;
52
- case 302 : return " Found" ;
53
- case 303 : return " See Other" ;
54
- case 304 : return " Not Modified" ;
55
- case 305 : return " Use Proxy" ;
56
- case 307 : return " Temporary Redirect" ;
57
- case 400 : return " Bad Request" ;
58
- case 401 : return " Unauthorized" ;
59
- case 402 : return " Payment Required" ;
60
- case 403 : return " Forbidden" ;
61
- case 404 : return " Not Found" ;
62
- case 405 : return " Method Not Allowed" ;
63
- case 406 : return " Not Acceptable" ;
64
- case 407 : return " Proxy Authentication Required" ;
65
- case 408 : return " Request Time-out" ;
66
- case 409 : return " Conflict" ;
67
- case 410 : return " Gone" ;
68
- case 411 : return " Length Required" ;
69
- case 412 : return " Precondition Failed" ;
70
- case 413 : return " Request Entity Too Large" ;
71
- case 414 : return " Request-URI Too Large" ;
72
- case 415 : return " Unsupported Media Type" ;
73
- case 416 : return " Requested range not satisfiable" ;
74
- case 417 : return " Expectation Failed" ;
75
- case 500 : return " Internal Server Error" ;
76
- case 501 : return " Not Implemented" ;
77
- case 502 : return " Bad Gateway" ;
78
- case 503 : return " Service Unavailable" ;
79
- case 504 : return " Gateway Time-out" ;
80
- case 505 : return " HTTP Version not supported" ;
81
- default : return " " ;
41
+ case 100 : return F ( " Continue" ) ;
42
+ case 101 : return F ( " Switching Protocols" ) ;
43
+ case 200 : return F ( " OK" ) ;
44
+ case 201 : return F ( " Created" ) ;
45
+ case 202 : return F ( " Accepted" ) ;
46
+ case 203 : return F ( " Non-Authoritative Information" ) ;
47
+ case 204 : return F ( " No Content" ) ;
48
+ case 205 : return F ( " Reset Content" ) ;
49
+ case 206 : return F ( " Partial Content" ) ;
50
+ case 300 : return F ( " Multiple Choices" ) ;
51
+ case 301 : return F ( " Moved Permanently" ) ;
52
+ case 302 : return F ( " Found" ) ;
53
+ case 303 : return F ( " See Other" ) ;
54
+ case 304 : return F ( " Not Modified" ) ;
55
+ case 305 : return F ( " Use Proxy" ) ;
56
+ case 307 : return F ( " Temporary Redirect" ) ;
57
+ case 400 : return F ( " Bad Request" ) ;
58
+ case 401 : return F ( " Unauthorized" ) ;
59
+ case 402 : return F ( " Payment Required" ) ;
60
+ case 403 : return F ( " Forbidden" ) ;
61
+ case 404 : return F ( " Not Found" ) ;
62
+ case 405 : return F ( " Method Not Allowed" ) ;
63
+ case 406 : return F ( " Not Acceptable" ) ;
64
+ case 407 : return F ( " Proxy Authentication Required" ) ;
65
+ case 408 : return F ( " Request Time-out" ) ;
66
+ case 409 : return F ( " Conflict" ) ;
67
+ case 410 : return F ( " Gone" ) ;
68
+ case 411 : return F ( " Length Required" ) ;
69
+ case 412 : return F ( " Precondition Failed" ) ;
70
+ case 413 : return F ( " Request Entity Too Large" ) ;
71
+ case 414 : return F ( " Request-URI Too Large" ) ;
72
+ case 415 : return F ( " Unsupported Media Type" ) ;
73
+ case 416 : return F ( " Requested range not satisfiable" ) ;
74
+ case 417 : return F ( " Expectation Failed" ) ;
75
+ case 500 : return F ( " Internal Server Error" ) ;
76
+ case 501 : return F ( " Not Implemented" ) ;
77
+ case 502 : return F ( " Bad Gateway" ) ;
78
+ case 503 : return F ( " Service Unavailable" ) ;
79
+ case 504 : return F ( " Gateway Time-out" ) ;
80
+ case 505 : return F ( " HTTP Version not supported" ) ;
81
+ default : return F ( " " ) ;
82
82
}
83
83
}
84
84
@@ -125,33 +125,35 @@ void AsyncWebServerResponse::addHeader(const String& name, const String& value){
125
125
126
126
String AsyncWebServerResponse::_assembleHead (uint8_t version){
127
127
if (version){
128
- addHeader (" Accept-Ranges" , " none" );
128
+ addHeader (F ( " Accept-Ranges" ), F ( " none" ) );
129
129
if (_chunked)
130
- addHeader (" Transfer-Encoding" , " chunked" );
130
+ addHeader (F ( " Transfer-Encoding" ), F ( " chunked" ) );
131
131
}
132
132
String out = String ();
133
133
int bufSize = 300 ;
134
134
char buf[bufSize];
135
135
136
- snprintf (buf, bufSize, " HTTP/1.%d %d %s \r\n " , version, _code, _responseCodeToString (_code) );
136
+ snprintf_P (buf, bufSize, PSTR ( " HTTP/1.%d %d " ) , version, _code);
137
137
out.concat (buf);
138
+ out.concat (_responseCodeToString (_code));
139
+ out.concat (F (" \r\n " ));
138
140
139
141
if (_sendContentLength) {
140
- snprintf (buf, bufSize, " Content-Length: %d\r\n " , _contentLength);
142
+ snprintf_P (buf, bufSize, PSTR ( " Content-Length: %d\r\n " ) , _contentLength);
141
143
out.concat (buf);
142
144
}
143
145
if (_contentType.length ()) {
144
- snprintf (buf, bufSize, " Content-Type: %s\r\n " , _contentType.c_str ());
146
+ snprintf_P (buf, bufSize, PSTR ( " Content-Type: %s\r\n " ) , _contentType.c_str ());
145
147
out.concat (buf);
146
148
}
147
149
148
150
for (const auto & header: _headers){
149
- snprintf (buf, bufSize, " %s: %s\r\n " , header->name ().c_str (), header->value ().c_str ());
151
+ snprintf_P (buf, bufSize, PSTR ( " %s: %s\r\n " ) , header->name ().c_str (), header->value ().c_str ());
150
152
out.concat (buf);
151
153
}
152
154
_headers.free ();
153
155
154
- out.concat (" \r\n " );
156
+ out.concat (F ( " \r\n " ) );
155
157
_headLength = out.length ();
156
158
return out;
157
159
}
@@ -254,7 +256,7 @@ AsyncAbstractResponse::AsyncAbstractResponse(AwsTemplateProcessor callback): _ca
254
256
}
255
257
256
258
void AsyncAbstractResponse::_respond (AsyncWebServerRequest *request){
257
- addHeader (" Connection" , " close" );
259
+ addHeader (F ( " Connection" ), F ( " close" ) );
258
260
_head = _assembleHead (request->version ());
259
261
_state = RESPONSE_HEADERS;
260
262
_ack (request, 0 , 0 );
@@ -480,25 +482,25 @@ AsyncFileResponse::~AsyncFileResponse(){
480
482
}
481
483
482
484
void AsyncFileResponse::_setContentType (const String& path){
483
- if (path.endsWith (" .html" )) _contentType = " text/html" ;
484
- else if (path.endsWith (" .htm" )) _contentType = " text/html" ;
485
- else if (path.endsWith (" .css" )) _contentType = " text/css" ;
486
- else if (path.endsWith (" .json" )) _contentType = " application/json" ;
487
- else if (path.endsWith (" .js" )) _contentType = " application/javascript" ;
488
- else if (path.endsWith (" .png" )) _contentType = " image/png" ;
489
- else if (path.endsWith (" .gif" )) _contentType = " image/gif" ;
490
- else if (path.endsWith (" .jpg" )) _contentType = " image/jpeg" ;
491
- else if (path.endsWith (" .ico" )) _contentType = " image/x-icon" ;
492
- else if (path.endsWith (" .svg" )) _contentType = " image/svg+xml" ;
493
- else if (path.endsWith (" .eot" )) _contentType = " font/eot" ;
494
- else if (path.endsWith (" .woff" )) _contentType = " font/woff" ;
495
- else if (path.endsWith (" .woff2" )) _contentType = " font/woff2" ;
496
- else if (path.endsWith (" .ttf" )) _contentType = " font/ttf" ;
497
- else if (path.endsWith (" .xml" )) _contentType = " text/xml" ;
498
- else if (path.endsWith (" .pdf" )) _contentType = " application/pdf" ;
499
- else if (path.endsWith (" .zip" )) _contentType = " application/zip" ;
500
- else if (path.endsWith (" .gz" )) _contentType = " application/x-gzip" ;
501
- else _contentType = " text/plain" ;
485
+ if (path.endsWith (F ( " .html" ))) _contentType = F ( " text/html" ) ;
486
+ else if (path.endsWith (F ( " .htm" ))) _contentType = F ( " text/html" ) ;
487
+ else if (path.endsWith (F ( " .css" ))) _contentType = F ( " text/css" ) ;
488
+ else if (path.endsWith (F ( " .json" ))) _contentType = F ( " application/json" ) ;
489
+ else if (path.endsWith (F ( " .js" ))) _contentType = F ( " application/javascript" ) ;
490
+ else if (path.endsWith (F ( " .png" ))) _contentType = F ( " image/png" ) ;
491
+ else if (path.endsWith (F ( " .gif" ))) _contentType = F ( " image/gif" ) ;
492
+ else if (path.endsWith (F ( " .jpg" ))) _contentType = F ( " image/jpeg" ) ;
493
+ else if (path.endsWith (F ( " .ico" ))) _contentType = F ( " image/x-icon" ) ;
494
+ else if (path.endsWith (F ( " .svg" ))) _contentType = F ( " image/svg+xml" ) ;
495
+ else if (path.endsWith (F ( " .eot" ))) _contentType = F ( " font/eot" ) ;
496
+ else if (path.endsWith (F ( " .woff" ))) _contentType = F ( " font/woff" ) ;
497
+ else if (path.endsWith (F ( " .woff2" ))) _contentType = F ( " font/woff2" ) ;
498
+ else if (path.endsWith (F ( " .ttf" ))) _contentType = F ( " font/ttf" ) ;
499
+ else if (path.endsWith (F ( " .xml" ))) _contentType = F ( " text/xml" ) ;
500
+ else if (path.endsWith (F ( " .pdf" ))) _contentType = F ( " application/pdf" ) ;
501
+ else if (path.endsWith (F ( " .zip" ))) _contentType = F ( " application/zip" ) ;
502
+ else if (path.endsWith (F ( " .gz" ))) _contentType = F ( " application/x-gzip" ) ;
503
+ else _contentType = F ( " text/plain" ) ;
502
504
}
503
505
504
506
AsyncFileResponse::AsyncFileResponse (FS &fs, const String& path, const String& contentType, bool download, AwsTemplateProcessor callback): AsyncAbstractResponse(callback){
@@ -507,7 +509,7 @@ AsyncFileResponse::AsyncFileResponse(FS &fs, const String& path, const String& c
507
509
508
510
if (!download && !fs.exists (_path) && fs.exists (_path+" .gz" )){
509
511
_path = _path+" .gz" ;
510
- addHeader (" Content-Encoding" , " gzip" );
512
+ addHeader (F ( " Content-Encoding" ), F ( " gzip" ) );
511
513
_callback = nullptr ; // Unable to process zipped templates
512
514
_sendContentLength = true ;
513
515
_chunked = false ;
@@ -527,20 +529,20 @@ AsyncFileResponse::AsyncFileResponse(FS &fs, const String& path, const String& c
527
529
528
530
if (download) {
529
531
// set filename and force download
530
- snprintf (buf, sizeof (buf), " attachment; filename=\" %s\" " , filename);
532
+ snprintf_P (buf, sizeof (buf), PSTR ( " attachment; filename=\" %s\" " ) , filename);
531
533
} else {
532
534
// force rendering
533
- snprintf (buf, sizeof (buf), " inline" );
535
+ snprintf_P (buf, sizeof (buf), PSTR ( " inline" ) );
534
536
}
535
- addHeader (" Content-Disposition" , buf);
537
+ addHeader (F ( " Content-Disposition" ) , buf);
536
538
}
537
539
538
540
AsyncFileResponse::AsyncFileResponse (File content, const String& path, const String& contentType, bool download, AwsTemplateProcessor callback): AsyncAbstractResponse(callback){
539
541
_code = 200 ;
540
542
_path = path;
541
543
542
- if (!download && String (content.name ()).endsWith (" .gz" ) && !path.endsWith (" .gz" )){
543
- addHeader (" Content-Encoding" , " gzip" );
544
+ if (!download && String (content.name ()).endsWith (F ( " .gz" )) && !path.endsWith (F ( " .gz" ) )){
545
+ addHeader (F ( " Content-Encoding" ), F ( " gzip" ) );
544
546
_callback = nullptr ; // Unable to process gzipped templates
545
547
_sendContentLength = true ;
546
548
_chunked = false ;
@@ -559,11 +561,11 @@ AsyncFileResponse::AsyncFileResponse(File content, const String& path, const Str
559
561
char * filename = (char *)path.c_str () + filenameStart;
560
562
561
563
if (download) {
562
- snprintf (buf, sizeof (buf), " attachment; filename=\" %s\" " , filename);
564
+ snprintf_P (buf, sizeof (buf), PSTR ( " attachment; filename=\" %s\" " ) , filename);
563
565
} else {
564
- snprintf (buf, sizeof (buf), " inline" );
566
+ snprintf_P (buf, sizeof (buf), PSTR ( " inline" ) );
565
567
}
566
- addHeader (" Content-Disposition" , buf);
568
+ addHeader (F ( " Content-Disposition" ) , buf);
567
569
}
568
570
569
571
size_t AsyncFileResponse::_fillBuffer (uint8_t *data, size_t len){
0 commit comments