Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/ESPAsyncWebServer.h
Original file line number Diff line number Diff line change
Expand Up @@ -1367,7 +1367,8 @@ class AsyncWebServerResponse {
static bool headerMustBePresentOnce(const String &name);

public:
static const char *responseCodeToString(int code);
// Return type changes based on platform (const char* or __FlashStringHelper*)
static STR_RETURN_TYPE responseCodeToString(int code);

public:
AsyncWebServerResponse();
Expand Down
86 changes: 43 additions & 43 deletions src/WebResponses.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,50 +25,50 @@ using namespace asyncsrv;
*
*/

const char *AsyncWebServerResponse::responseCodeToString(int code) {
STR_RETURN_TYPE AsyncWebServerResponse::responseCodeToString(int code) {
switch (code) {
case 100: return T_HTTP_CODE_100;
case 101: return T_HTTP_CODE_101;
case 200: return T_HTTP_CODE_200;
case 201: return T_HTTP_CODE_201;
case 202: return T_HTTP_CODE_202;
case 203: return T_HTTP_CODE_203;
case 204: return T_HTTP_CODE_204;
case 205: return T_HTTP_CODE_205;
case 206: return T_HTTP_CODE_206;
case 300: return T_HTTP_CODE_300;
case 301: return T_HTTP_CODE_301;
case 302: return T_HTTP_CODE_302;
case 303: return T_HTTP_CODE_303;
case 304: return T_HTTP_CODE_304;
case 305: return T_HTTP_CODE_305;
case 307: return T_HTTP_CODE_307;
case 400: return T_HTTP_CODE_400;
case 401: return T_HTTP_CODE_401;
case 402: return T_HTTP_CODE_402;
case 403: return T_HTTP_CODE_403;
case 404: return T_HTTP_CODE_404;
case 405: return T_HTTP_CODE_405;
case 406: return T_HTTP_CODE_406;
case 407: return T_HTTP_CODE_407;
case 408: return T_HTTP_CODE_408;
case 409: return T_HTTP_CODE_409;
case 410: return T_HTTP_CODE_410;
case 411: return T_HTTP_CODE_411;
case 412: return T_HTTP_CODE_412;
case 413: return T_HTTP_CODE_413;
case 414: return T_HTTP_CODE_414;
case 415: return T_HTTP_CODE_415;
case 416: return T_HTTP_CODE_416;
case 417: return T_HTTP_CODE_417;
case 429: return T_HTTP_CODE_429;
case 500: return T_HTTP_CODE_500;
case 501: return T_HTTP_CODE_501;
case 502: return T_HTTP_CODE_502;
case 503: return T_HTTP_CODE_503;
case 504: return T_HTTP_CODE_504;
case 505: return T_HTTP_CODE_505;
default: return T_HTTP_CODE_ANY;
case 100: return STR(T_HTTP_CODE_100);
case 101: return STR(T_HTTP_CODE_101);
case 200: return STR(T_HTTP_CODE_200);
case 201: return STR(T_HTTP_CODE_201);
case 202: return STR(T_HTTP_CODE_202);
case 203: return STR(T_HTTP_CODE_203);
case 204: return STR(T_HTTP_CODE_204);
case 205: return STR(T_HTTP_CODE_205);
case 206: return STR(T_HTTP_CODE_206);
case 300: return STR(T_HTTP_CODE_300);
case 301: return STR(T_HTTP_CODE_301);
case 302: return STR(T_HTTP_CODE_302);
case 303: return STR(T_HTTP_CODE_303);
case 304: return STR(T_HTTP_CODE_304);
case 305: return STR(T_HTTP_CODE_305);
case 307: return STR(T_HTTP_CODE_307);
case 400: return STR(T_HTTP_CODE_400);
case 401: return STR(T_HTTP_CODE_401);
case 402: return STR(T_HTTP_CODE_402);
case 403: return STR(T_HTTP_CODE_403);
case 404: return STR(T_HTTP_CODE_404);
case 405: return STR(T_HTTP_CODE_405);
case 406: return STR(T_HTTP_CODE_406);
case 407: return STR(T_HTTP_CODE_407);
case 408: return STR(T_HTTP_CODE_408);
case 409: return STR(T_HTTP_CODE_409);
case 410: return STR(T_HTTP_CODE_410);
case 411: return STR(T_HTTP_CODE_411);
case 412: return STR(T_HTTP_CODE_412);
case 413: return STR(T_HTTP_CODE_413);
case 414: return STR(T_HTTP_CODE_414);
case 415: return STR(T_HTTP_CODE_415);
case 416: return STR(T_HTTP_CODE_416);
case 417: return STR(T_HTTP_CODE_417);
case 429: return STR(T_HTTP_CODE_429);
case 500: return STR(T_HTTP_CODE_500);
case 501: return STR(T_HTTP_CODE_501);
case 502: return STR(T_HTTP_CODE_502);
case 503: return STR(T_HTTP_CODE_503);
case 504: return STR(T_HTTP_CODE_504);
case 505: return STR(T_HTTP_CODE_505);
default: return STR(T_HTTP_CODE_ANY);
}
}

Expand Down
105 changes: 62 additions & 43 deletions src/literals.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,25 @@

#pragma once

// Include WString.h for F() macro support on Arduino platforms
#ifdef ARDUINO
#include <WString.h>
#endif

// Platform-specific string storage and return type
#ifdef ARDUINO_ARCH_ESP8266
// On ESP8266, use PROGMEM storage and return __FlashStringHelper*
#include <pgmspace.h>
#define DECLARE_STR(name, value) static const char name##_PROGMEM[] PROGMEM = value
#define STR(name) (reinterpret_cast<const __FlashStringHelper *>(name##_PROGMEM))
#define STR_RETURN_TYPE const __FlashStringHelper *
#else
// On other platforms, use regular constexpr for compile-time optimization
#define DECLARE_STR(name, value) static constexpr const char *name = value
#define STR(name) name
#define STR_RETURN_TYPE const char *
#endif

namespace asyncsrv {

static constexpr const char empty[] = "";
Expand Down Expand Up @@ -154,49 +173,49 @@ static constexpr const char T_text_xml[] = "text/xml";
static constexpr const char T_video_mp4[] = "video/mp4";
static constexpr const char T_video_webm[] = "video/webm";

// Response codes
static constexpr const char T_HTTP_CODE_100[] = "Continue";
static constexpr const char T_HTTP_CODE_101[] = "Switching Protocols";
static constexpr const char T_HTTP_CODE_200[] = "OK";
static constexpr const char T_HTTP_CODE_201[] = "Created";
static constexpr const char T_HTTP_CODE_202[] = "Accepted";
static constexpr const char T_HTTP_CODE_203[] = "Non-Authoritative Information";
static constexpr const char T_HTTP_CODE_204[] = "No Content";
static constexpr const char T_HTTP_CODE_205[] = "Reset Content";
static constexpr const char T_HTTP_CODE_206[] = "Partial Content";
static constexpr const char T_HTTP_CODE_300[] = "Multiple Choices";
static constexpr const char T_HTTP_CODE_301[] = "Moved Permanently";
static constexpr const char T_HTTP_CODE_302[] = "Found";
static constexpr const char T_HTTP_CODE_303[] = "See Other";
static constexpr const char T_HTTP_CODE_304[] = "Not Modified";
static constexpr const char T_HTTP_CODE_305[] = "Use Proxy";
static constexpr const char T_HTTP_CODE_307[] = "Temporary Redirect";
static constexpr const char T_HTTP_CODE_400[] = "Bad Request";
static constexpr const char T_HTTP_CODE_401[] = "Unauthorized";
static constexpr const char T_HTTP_CODE_402[] = "Payment Required";
static constexpr const char T_HTTP_CODE_403[] = "Forbidden";
static constexpr const char T_HTTP_CODE_404[] = "Not Found";
static constexpr const char T_HTTP_CODE_405[] = "Method Not Allowed";
static constexpr const char T_HTTP_CODE_406[] = "Not Acceptable";
static constexpr const char T_HTTP_CODE_407[] = "Proxy Authentication Required";
static constexpr const char T_HTTP_CODE_408[] = "Request Time-out";
static constexpr const char T_HTTP_CODE_409[] = "Conflict";
static constexpr const char T_HTTP_CODE_410[] = "Gone";
static constexpr const char T_HTTP_CODE_411[] = "Length Required";
static constexpr const char T_HTTP_CODE_412[] = "Precondition Failed";
static constexpr const char T_HTTP_CODE_413[] = "Request Entity Too Large";
static constexpr const char T_HTTP_CODE_414[] = "Request-URI Too Large";
static constexpr const char T_HTTP_CODE_415[] = "Unsupported Media Type";
static constexpr const char T_HTTP_CODE_416[] = "Requested Range Not Satisfiable";
static constexpr const char T_HTTP_CODE_417[] = "Expectation Failed";
static constexpr const char T_HTTP_CODE_429[] = "Too Many Requests";
static constexpr const char T_HTTP_CODE_500[] = "Internal Server Error";
static constexpr const char T_HTTP_CODE_501[] = "Not Implemented";
static constexpr const char T_HTTP_CODE_502[] = "Bad Gateway";
static constexpr const char T_HTTP_CODE_503[] = "Service Unavailable";
static constexpr const char T_HTTP_CODE_504[] = "Gateway Time-out";
static constexpr const char T_HTTP_CODE_505[] = "HTTP Version Not Supported";
static constexpr const char T_HTTP_CODE_ANY[] = "Unknown code";
// Response codes - using DECLARE_STR macro for platform-specific storage
DECLARE_STR(T_HTTP_CODE_100, "Continue");
DECLARE_STR(T_HTTP_CODE_101, "Switching Protocols");
DECLARE_STR(T_HTTP_CODE_200, "OK");
DECLARE_STR(T_HTTP_CODE_201, "Created");
DECLARE_STR(T_HTTP_CODE_202, "Accepted");
DECLARE_STR(T_HTTP_CODE_203, "Non-Authoritative Information");
DECLARE_STR(T_HTTP_CODE_204, "No Content");
DECLARE_STR(T_HTTP_CODE_205, "Reset Content");
DECLARE_STR(T_HTTP_CODE_206, "Partial Content");
DECLARE_STR(T_HTTP_CODE_300, "Multiple Choices");
DECLARE_STR(T_HTTP_CODE_301, "Moved Permanently");
DECLARE_STR(T_HTTP_CODE_302, "Found");
DECLARE_STR(T_HTTP_CODE_303, "See Other");
DECLARE_STR(T_HTTP_CODE_304, "Not Modified");
DECLARE_STR(T_HTTP_CODE_305, "Use Proxy");
DECLARE_STR(T_HTTP_CODE_307, "Temporary Redirect");
DECLARE_STR(T_HTTP_CODE_400, "Bad Request");
DECLARE_STR(T_HTTP_CODE_401, "Unauthorized");
DECLARE_STR(T_HTTP_CODE_402, "Payment Required");
DECLARE_STR(T_HTTP_CODE_403, "Forbidden");
DECLARE_STR(T_HTTP_CODE_404, "Not Found");
DECLARE_STR(T_HTTP_CODE_405, "Method Not Allowed");
DECLARE_STR(T_HTTP_CODE_406, "Not Acceptable");
DECLARE_STR(T_HTTP_CODE_407, "Proxy Authentication Required");
DECLARE_STR(T_HTTP_CODE_408, "Request Time-out");
DECLARE_STR(T_HTTP_CODE_409, "Conflict");
DECLARE_STR(T_HTTP_CODE_410, "Gone");
DECLARE_STR(T_HTTP_CODE_411, "Length Required");
DECLARE_STR(T_HTTP_CODE_412, "Precondition Failed");
DECLARE_STR(T_HTTP_CODE_413, "Request Entity Too Large");
DECLARE_STR(T_HTTP_CODE_414, "Request-URI Too Large");
DECLARE_STR(T_HTTP_CODE_415, "Unsupported Media Type");
DECLARE_STR(T_HTTP_CODE_416, "Requested Range Not Satisfiable");
DECLARE_STR(T_HTTP_CODE_417, "Expectation Failed");
DECLARE_STR(T_HTTP_CODE_429, "Too Many Requests");
DECLARE_STR(T_HTTP_CODE_500, "Internal Server Error");
DECLARE_STR(T_HTTP_CODE_501, "Not Implemented");
DECLARE_STR(T_HTTP_CODE_502, "Bad Gateway");
DECLARE_STR(T_HTTP_CODE_503, "Service Unavailable");
DECLARE_STR(T_HTTP_CODE_504, "Gateway Time-out");
DECLARE_STR(T_HTTP_CODE_505, "HTTP Version Not Supported");
DECLARE_STR(T_HTTP_CODE_ANY, "Unknown code");

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