Skip to content

Commit bea9cfc

Browse files
dirkmuellerdevyte
authored andcommitted
PROGMEM footprint cleanup for responseCodeToString (#6950)
* PROGMEM footprint cleanup for responseCodeToString Doing returns with String/FlashStringHelper conversion for every case means that the code for doing that is duplicated, which is wasteful. doing it only once saves about 250 bytes (50%) of code size. * Remove "I'm a teapot" error code * Add inline code comment to explain rationale
1 parent 698ffc3 commit bea9cfc

File tree

2 files changed

+133
-46
lines changed

2 files changed

+133
-46
lines changed

libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h

+132-45
Original file line numberDiff line numberDiff line change
@@ -695,49 +695,136 @@ void ESP8266WebServerTemplate<ServerType>::_finalizeResponse() {
695695
}
696696

697697
template <typename ServerType>
698-
const String ESP8266WebServerTemplate<ServerType>::responseCodeToString(const int code) {
699-
switch (code) {
700-
case 100: return F("Continue");
701-
case 101: return F("Switching Protocols");
702-
case 200: return F("OK");
703-
case 201: return F("Created");
704-
case 202: return F("Accepted");
705-
case 203: return F("Non-Authoritative Information");
706-
case 204: return F("No Content");
707-
case 205: return F("Reset Content");
708-
case 206: return F("Partial Content");
709-
case 300: return F("Multiple Choices");
710-
case 301: return F("Moved Permanently");
711-
case 302: return F("Found");
712-
case 303: return F("See Other");
713-
case 304: return F("Not Modified");
714-
case 305: return F("Use Proxy");
715-
case 307: return F("Temporary Redirect");
716-
case 400: return F("Bad Request");
717-
case 401: return F("Unauthorized");
718-
case 402: return F("Payment Required");
719-
case 403: return F("Forbidden");
720-
case 404: return F("Not Found");
721-
case 405: return F("Method Not Allowed");
722-
case 406: return F("Not Acceptable");
723-
case 407: return F("Proxy Authentication Required");
724-
case 408: return F("Request Time-out");
725-
case 409: return F("Conflict");
726-
case 410: return F("Gone");
727-
case 411: return F("Length Required");
728-
case 412: return F("Precondition Failed");
729-
case 413: return F("Request Entity Too Large");
730-
case 414: return F("Request-URI Too Large");
731-
case 415: return F("Unsupported Media Type");
732-
case 416: return F("Requested range not satisfiable");
733-
case 417: return F("Expectation Failed");
734-
case 418: return F("I'm a teapot");
735-
case 500: return F("Internal Server Error");
736-
case 501: return F("Not Implemented");
737-
case 502: return F("Bad Gateway");
738-
case 503: return F("Service Unavailable");
739-
case 504: return F("Gateway Time-out");
740-
case 505: return F("HTTP Version not supported");
741-
default: return F("");
742-
}
698+
String ESP8266WebServerTemplate<ServerType>::responseCodeToString(const int code) {
699+
// By first determining the pointer to the flash stored string in the switch
700+
// statement and then doing String(FlashStringHelper) return reduces the total code
701+
// size of this function by over 50%.
702+
const __FlashStringHelper *r;
703+
switch (code)
704+
{
705+
case 100:
706+
r = F("Continue");
707+
break;
708+
case 101:
709+
r = F("Switching Protocols");
710+
break;
711+
case 200:
712+
r = F("OK");
713+
break;
714+
case 201:
715+
r = F("Created");
716+
break;
717+
case 202:
718+
r = F("Accepted");
719+
break;
720+
case 203:
721+
r = F("Non-Authoritative Information");
722+
break;
723+
case 204:
724+
r = F("No Content");
725+
break;
726+
case 205:
727+
r = F("Reset Content");
728+
break;
729+
case 206:
730+
r = F("Partial Content");
731+
break;
732+
case 300:
733+
r = F("Multiple Choices");
734+
break;
735+
case 301:
736+
r = F("Moved Permanently");
737+
break;
738+
case 302:
739+
r = F("Found");
740+
break;
741+
case 303:
742+
r = F("See Other");
743+
break;
744+
case 304:
745+
r = F("Not Modified");
746+
break;
747+
case 305:
748+
r = F("Use Proxy");
749+
break;
750+
case 307:
751+
r = F("Temporary Redirect");
752+
break;
753+
case 400:
754+
r = F("Bad Request");
755+
break;
756+
case 401:
757+
r = F("Unauthorized");
758+
break;
759+
case 402:
760+
r = F("Payment Required");
761+
break;
762+
case 403:
763+
r = F("Forbidden");
764+
break;
765+
case 404:
766+
r = F("Not Found");
767+
break;
768+
case 405:
769+
r = F("Method Not Allowed");
770+
break;
771+
case 406:
772+
r = F("Not Acceptable");
773+
break;
774+
case 407:
775+
r = F("Proxy Authentication Required");
776+
break;
777+
case 408:
778+
r = F("Request Timeout");
779+
break;
780+
case 409:
781+
r = F("Conflict");
782+
break;
783+
case 410:
784+
r = F("Gone");
785+
break;
786+
case 411:
787+
r = F("Length Required");
788+
break;
789+
case 412:
790+
r = F("Precondition Failed");
791+
break;
792+
case 413:
793+
r = F("Request Entity Too Large");
794+
break;
795+
case 414:
796+
r = F("URI Too Long");
797+
break;
798+
case 415:
799+
r = F("Unsupported Media Type");
800+
break;
801+
case 416:
802+
r = F("Range not satisfiable");
803+
break;
804+
case 417:
805+
r = F("Expectation Failed");
806+
break;
807+
case 500:
808+
r = F("Internal Server Error");
809+
break;
810+
case 501:
811+
r = F("Not Implemented");
812+
break;
813+
case 502:
814+
r = F("Bad Gateway");
815+
break;
816+
case 503:
817+
r = F("Service Unavailable");
818+
break;
819+
case 504:
820+
r = F("Gateway Timeout");
821+
break;
822+
case 505:
823+
r = F("HTTP Version not supported");
824+
break;
825+
default:
826+
r = F("");
827+
break;
828+
}
829+
return String(r);
743830
}

libraries/ESP8266WebServer/src/ESP8266WebServer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ class ESP8266WebServerTemplate
169169
return contentLength;
170170
}
171171

172-
static const String responseCodeToString(const int code);
172+
static String responseCodeToString(const int code);
173173

174174
protected:
175175
void _addRequestHandler(RequestHandlerType* handler);

0 commit comments

Comments
 (0)