Skip to content

Commit 660730a

Browse files
Store HTTP response strings in PROGMEM on ESP8266 (#372)
* Store HTTP response strings in PROGMEM on ESP8266 * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent c96f80d commit 660730a

File tree

3 files changed

+107
-87
lines changed

3 files changed

+107
-87
lines changed

src/ESPAsyncWebServer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1367,7 +1367,8 @@ class AsyncWebServerResponse {
13671367
static bool headerMustBePresentOnce(const String &name);
13681368

13691369
public:
1370-
static const char *responseCodeToString(int code);
1370+
// Return type changes based on platform (const char* or __FlashStringHelper*)
1371+
static STR_RETURN_TYPE responseCodeToString(int code);
13711372

13721373
public:
13731374
AsyncWebServerResponse();

src/WebResponses.cpp

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -25,50 +25,50 @@ using namespace asyncsrv;
2525
*
2626
*/
2727

28-
const char *AsyncWebServerResponse::responseCodeToString(int code) {
28+
STR_RETURN_TYPE AsyncWebServerResponse::responseCodeToString(int code) {
2929
switch (code) {
30-
case 100: return T_HTTP_CODE_100;
31-
case 101: return T_HTTP_CODE_101;
32-
case 200: return T_HTTP_CODE_200;
33-
case 201: return T_HTTP_CODE_201;
34-
case 202: return T_HTTP_CODE_202;
35-
case 203: return T_HTTP_CODE_203;
36-
case 204: return T_HTTP_CODE_204;
37-
case 205: return T_HTTP_CODE_205;
38-
case 206: return T_HTTP_CODE_206;
39-
case 300: return T_HTTP_CODE_300;
40-
case 301: return T_HTTP_CODE_301;
41-
case 302: return T_HTTP_CODE_302;
42-
case 303: return T_HTTP_CODE_303;
43-
case 304: return T_HTTP_CODE_304;
44-
case 305: return T_HTTP_CODE_305;
45-
case 307: return T_HTTP_CODE_307;
46-
case 400: return T_HTTP_CODE_400;
47-
case 401: return T_HTTP_CODE_401;
48-
case 402: return T_HTTP_CODE_402;
49-
case 403: return T_HTTP_CODE_403;
50-
case 404: return T_HTTP_CODE_404;
51-
case 405: return T_HTTP_CODE_405;
52-
case 406: return T_HTTP_CODE_406;
53-
case 407: return T_HTTP_CODE_407;
54-
case 408: return T_HTTP_CODE_408;
55-
case 409: return T_HTTP_CODE_409;
56-
case 410: return T_HTTP_CODE_410;
57-
case 411: return T_HTTP_CODE_411;
58-
case 412: return T_HTTP_CODE_412;
59-
case 413: return T_HTTP_CODE_413;
60-
case 414: return T_HTTP_CODE_414;
61-
case 415: return T_HTTP_CODE_415;
62-
case 416: return T_HTTP_CODE_416;
63-
case 417: return T_HTTP_CODE_417;
64-
case 429: return T_HTTP_CODE_429;
65-
case 500: return T_HTTP_CODE_500;
66-
case 501: return T_HTTP_CODE_501;
67-
case 502: return T_HTTP_CODE_502;
68-
case 503: return T_HTTP_CODE_503;
69-
case 504: return T_HTTP_CODE_504;
70-
case 505: return T_HTTP_CODE_505;
71-
default: return T_HTTP_CODE_ANY;
30+
case 100: return STR(T_HTTP_CODE_100);
31+
case 101: return STR(T_HTTP_CODE_101);
32+
case 200: return STR(T_HTTP_CODE_200);
33+
case 201: return STR(T_HTTP_CODE_201);
34+
case 202: return STR(T_HTTP_CODE_202);
35+
case 203: return STR(T_HTTP_CODE_203);
36+
case 204: return STR(T_HTTP_CODE_204);
37+
case 205: return STR(T_HTTP_CODE_205);
38+
case 206: return STR(T_HTTP_CODE_206);
39+
case 300: return STR(T_HTTP_CODE_300);
40+
case 301: return STR(T_HTTP_CODE_301);
41+
case 302: return STR(T_HTTP_CODE_302);
42+
case 303: return STR(T_HTTP_CODE_303);
43+
case 304: return STR(T_HTTP_CODE_304);
44+
case 305: return STR(T_HTTP_CODE_305);
45+
case 307: return STR(T_HTTP_CODE_307);
46+
case 400: return STR(T_HTTP_CODE_400);
47+
case 401: return STR(T_HTTP_CODE_401);
48+
case 402: return STR(T_HTTP_CODE_402);
49+
case 403: return STR(T_HTTP_CODE_403);
50+
case 404: return STR(T_HTTP_CODE_404);
51+
case 405: return STR(T_HTTP_CODE_405);
52+
case 406: return STR(T_HTTP_CODE_406);
53+
case 407: return STR(T_HTTP_CODE_407);
54+
case 408: return STR(T_HTTP_CODE_408);
55+
case 409: return STR(T_HTTP_CODE_409);
56+
case 410: return STR(T_HTTP_CODE_410);
57+
case 411: return STR(T_HTTP_CODE_411);
58+
case 412: return STR(T_HTTP_CODE_412);
59+
case 413: return STR(T_HTTP_CODE_413);
60+
case 414: return STR(T_HTTP_CODE_414);
61+
case 415: return STR(T_HTTP_CODE_415);
62+
case 416: return STR(T_HTTP_CODE_416);
63+
case 417: return STR(T_HTTP_CODE_417);
64+
case 429: return STR(T_HTTP_CODE_429);
65+
case 500: return STR(T_HTTP_CODE_500);
66+
case 501: return STR(T_HTTP_CODE_501);
67+
case 502: return STR(T_HTTP_CODE_502);
68+
case 503: return STR(T_HTTP_CODE_503);
69+
case 504: return STR(T_HTTP_CODE_504);
70+
case 505: return STR(T_HTTP_CODE_505);
71+
default: return STR(T_HTTP_CODE_ANY);
7272
}
7373
}
7474

src/literals.h

Lines changed: 62 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,25 @@
33

44
#pragma once
55

6+
// Include WString.h for F() macro support on Arduino platforms
7+
#ifdef ARDUINO
8+
#include <WString.h>
9+
#endif
10+
11+
// Platform-specific string storage and return type
12+
#ifdef ARDUINO_ARCH_ESP8266
13+
// On ESP8266, use PROGMEM storage and return __FlashStringHelper*
14+
#include <pgmspace.h>
15+
#define DECLARE_STR(name, value) static const char name##_PROGMEM[] PROGMEM = value
16+
#define STR(name) (reinterpret_cast<const __FlashStringHelper *>(name##_PROGMEM))
17+
#define STR_RETURN_TYPE const __FlashStringHelper *
18+
#else
19+
// On other platforms, use regular constexpr for compile-time optimization
20+
#define DECLARE_STR(name, value) static constexpr const char *name = value
21+
#define STR(name) name
22+
#define STR_RETURN_TYPE const char *
23+
#endif
24+
625
namespace asyncsrv {
726

827
static constexpr const char empty[] = "";
@@ -154,49 +173,49 @@ static constexpr const char T_text_xml[] = "text/xml";
154173
static constexpr const char T_video_mp4[] = "video/mp4";
155174
static constexpr const char T_video_webm[] = "video/webm";
156175

157-
// Response codes
158-
static constexpr const char T_HTTP_CODE_100[] = "Continue";
159-
static constexpr const char T_HTTP_CODE_101[] = "Switching Protocols";
160-
static constexpr const char T_HTTP_CODE_200[] = "OK";
161-
static constexpr const char T_HTTP_CODE_201[] = "Created";
162-
static constexpr const char T_HTTP_CODE_202[] = "Accepted";
163-
static constexpr const char T_HTTP_CODE_203[] = "Non-Authoritative Information";
164-
static constexpr const char T_HTTP_CODE_204[] = "No Content";
165-
static constexpr const char T_HTTP_CODE_205[] = "Reset Content";
166-
static constexpr const char T_HTTP_CODE_206[] = "Partial Content";
167-
static constexpr const char T_HTTP_CODE_300[] = "Multiple Choices";
168-
static constexpr const char T_HTTP_CODE_301[] = "Moved Permanently";
169-
static constexpr const char T_HTTP_CODE_302[] = "Found";
170-
static constexpr const char T_HTTP_CODE_303[] = "See Other";
171-
static constexpr const char T_HTTP_CODE_304[] = "Not Modified";
172-
static constexpr const char T_HTTP_CODE_305[] = "Use Proxy";
173-
static constexpr const char T_HTTP_CODE_307[] = "Temporary Redirect";
174-
static constexpr const char T_HTTP_CODE_400[] = "Bad Request";
175-
static constexpr const char T_HTTP_CODE_401[] = "Unauthorized";
176-
static constexpr const char T_HTTP_CODE_402[] = "Payment Required";
177-
static constexpr const char T_HTTP_CODE_403[] = "Forbidden";
178-
static constexpr const char T_HTTP_CODE_404[] = "Not Found";
179-
static constexpr const char T_HTTP_CODE_405[] = "Method Not Allowed";
180-
static constexpr const char T_HTTP_CODE_406[] = "Not Acceptable";
181-
static constexpr const char T_HTTP_CODE_407[] = "Proxy Authentication Required";
182-
static constexpr const char T_HTTP_CODE_408[] = "Request Time-out";
183-
static constexpr const char T_HTTP_CODE_409[] = "Conflict";
184-
static constexpr const char T_HTTP_CODE_410[] = "Gone";
185-
static constexpr const char T_HTTP_CODE_411[] = "Length Required";
186-
static constexpr const char T_HTTP_CODE_412[] = "Precondition Failed";
187-
static constexpr const char T_HTTP_CODE_413[] = "Request Entity Too Large";
188-
static constexpr const char T_HTTP_CODE_414[] = "Request-URI Too Large";
189-
static constexpr const char T_HTTP_CODE_415[] = "Unsupported Media Type";
190-
static constexpr const char T_HTTP_CODE_416[] = "Requested Range Not Satisfiable";
191-
static constexpr const char T_HTTP_CODE_417[] = "Expectation Failed";
192-
static constexpr const char T_HTTP_CODE_429[] = "Too Many Requests";
193-
static constexpr const char T_HTTP_CODE_500[] = "Internal Server Error";
194-
static constexpr const char T_HTTP_CODE_501[] = "Not Implemented";
195-
static constexpr const char T_HTTP_CODE_502[] = "Bad Gateway";
196-
static constexpr const char T_HTTP_CODE_503[] = "Service Unavailable";
197-
static constexpr const char T_HTTP_CODE_504[] = "Gateway Time-out";
198-
static constexpr const char T_HTTP_CODE_505[] = "HTTP Version Not Supported";
199-
static constexpr const char T_HTTP_CODE_ANY[] = "Unknown code";
176+
// Response codes - using DECLARE_STR macro for platform-specific storage
177+
DECLARE_STR(T_HTTP_CODE_100, "Continue");
178+
DECLARE_STR(T_HTTP_CODE_101, "Switching Protocols");
179+
DECLARE_STR(T_HTTP_CODE_200, "OK");
180+
DECLARE_STR(T_HTTP_CODE_201, "Created");
181+
DECLARE_STR(T_HTTP_CODE_202, "Accepted");
182+
DECLARE_STR(T_HTTP_CODE_203, "Non-Authoritative Information");
183+
DECLARE_STR(T_HTTP_CODE_204, "No Content");
184+
DECLARE_STR(T_HTTP_CODE_205, "Reset Content");
185+
DECLARE_STR(T_HTTP_CODE_206, "Partial Content");
186+
DECLARE_STR(T_HTTP_CODE_300, "Multiple Choices");
187+
DECLARE_STR(T_HTTP_CODE_301, "Moved Permanently");
188+
DECLARE_STR(T_HTTP_CODE_302, "Found");
189+
DECLARE_STR(T_HTTP_CODE_303, "See Other");
190+
DECLARE_STR(T_HTTP_CODE_304, "Not Modified");
191+
DECLARE_STR(T_HTTP_CODE_305, "Use Proxy");
192+
DECLARE_STR(T_HTTP_CODE_307, "Temporary Redirect");
193+
DECLARE_STR(T_HTTP_CODE_400, "Bad Request");
194+
DECLARE_STR(T_HTTP_CODE_401, "Unauthorized");
195+
DECLARE_STR(T_HTTP_CODE_402, "Payment Required");
196+
DECLARE_STR(T_HTTP_CODE_403, "Forbidden");
197+
DECLARE_STR(T_HTTP_CODE_404, "Not Found");
198+
DECLARE_STR(T_HTTP_CODE_405, "Method Not Allowed");
199+
DECLARE_STR(T_HTTP_CODE_406, "Not Acceptable");
200+
DECLARE_STR(T_HTTP_CODE_407, "Proxy Authentication Required");
201+
DECLARE_STR(T_HTTP_CODE_408, "Request Time-out");
202+
DECLARE_STR(T_HTTP_CODE_409, "Conflict");
203+
DECLARE_STR(T_HTTP_CODE_410, "Gone");
204+
DECLARE_STR(T_HTTP_CODE_411, "Length Required");
205+
DECLARE_STR(T_HTTP_CODE_412, "Precondition Failed");
206+
DECLARE_STR(T_HTTP_CODE_413, "Request Entity Too Large");
207+
DECLARE_STR(T_HTTP_CODE_414, "Request-URI Too Large");
208+
DECLARE_STR(T_HTTP_CODE_415, "Unsupported Media Type");
209+
DECLARE_STR(T_HTTP_CODE_416, "Requested Range Not Satisfiable");
210+
DECLARE_STR(T_HTTP_CODE_417, "Expectation Failed");
211+
DECLARE_STR(T_HTTP_CODE_429, "Too Many Requests");
212+
DECLARE_STR(T_HTTP_CODE_500, "Internal Server Error");
213+
DECLARE_STR(T_HTTP_CODE_501, "Not Implemented");
214+
DECLARE_STR(T_HTTP_CODE_502, "Bad Gateway");
215+
DECLARE_STR(T_HTTP_CODE_503, "Service Unavailable");
216+
DECLARE_STR(T_HTTP_CODE_504, "Gateway Time-out");
217+
DECLARE_STR(T_HTTP_CODE_505, "HTTP Version Not Supported");
218+
DECLARE_STR(T_HTTP_CODE_ANY, "Unknown code");
200219

201220
static constexpr const char *T_only_once_headers[] = {
202221
T_Accept_Ranges, T_Content_Length, T_Content_Type, T_Connection, T_CORS_ACAC, T_CORS_ACAH, T_CORS_ACAM, T_CORS_ACAO,

0 commit comments

Comments
 (0)