1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-27 21:16:50 +03:00

HTTPClient, HTTPUpdate: save some RAM by moving strings into flash

This commit is contained in:
Ivan Grokhotkov 2016-04-05 02:21:42 +03:00
parent bf7f33d918
commit a455f22587
3 changed files with 50 additions and 46 deletions

View File

@ -256,7 +256,7 @@ void HTTPClient::setReuse(bool reuse)
* set User Agent * set User Agent
* @param userAgent const char * * @param userAgent const char *
*/ */
void HTTPClient::setUserAgent(const char * userAgent) void HTTPClient::setUserAgent(const String& userAgent)
{ {
_userAgent = userAgent; _userAgent = userAgent;
} }
@ -359,7 +359,7 @@ int HTTPClient::sendRequest(const char * type, uint8_t * payload, size_t size)
} }
if(payload && size > 0) { if(payload && size > 0) {
addHeader("Content-Length", String(size)); addHeader(F("Content-Length"), String(size));
} }
// send Header // send Header
@ -644,8 +644,8 @@ String HTTPClient::getString(void)
if(_size) { if(_size) {
// try to reserve needed memmory // try to reserve needed memmory
if(!sstring.reserve((_size + 1))) { if(!sstring.reserve((_size + 1))) {
DEBUG_HTTPCLIENT("[HTTP-Client][getString] too less memory to reserve as string! need: %d\n", (_size + 1)); DEBUG_HTTPCLIENT("[HTTP-Client][getString] not enough memory to reserve a string! need: %d\n", (_size + 1));
return String("--too less memory--"); return "";
} }
} }
@ -662,27 +662,27 @@ String HTTPClient::errorToString(int error)
{ {
switch(error) { switch(error) {
case HTTPC_ERROR_CONNECTION_REFUSED: case HTTPC_ERROR_CONNECTION_REFUSED:
return String("connection refused"); return F("connection refused");
case HTTPC_ERROR_SEND_HEADER_FAILED: case HTTPC_ERROR_SEND_HEADER_FAILED:
return String("send header failed"); return F("send header failed");
case HTTPC_ERROR_SEND_PAYLOAD_FAILED: case HTTPC_ERROR_SEND_PAYLOAD_FAILED:
return String("send payload failed"); return F("send payload failed");
case HTTPC_ERROR_NOT_CONNECTED: case HTTPC_ERROR_NOT_CONNECTED:
return String("not connected"); return F("not connected");
case HTTPC_ERROR_CONNECTION_LOST: case HTTPC_ERROR_CONNECTION_LOST:
return String("connection lost"); return F("connection lost");
case HTTPC_ERROR_NO_STREAM: case HTTPC_ERROR_NO_STREAM:
return String("no stream"); return F("no stream");
case HTTPC_ERROR_NO_HTTP_SERVER: case HTTPC_ERROR_NO_HTTP_SERVER:
return String("no HTTP server"); return F("no HTTP server");
case HTTPC_ERROR_TOO_LESS_RAM: case HTTPC_ERROR_TOO_LESS_RAM:
return String("too less ram"); return F("too less ram");
case HTTPC_ERROR_ENCODING: case HTTPC_ERROR_ENCODING:
return String("Transfer-Encoding not supported"); return F("Transfer-Encoding not supported");
case HTTPC_ERROR_STREAM_WRITE: case HTTPC_ERROR_STREAM_WRITE:
return String("Stream write error"); return F("Stream write error");
case HTTPC_ERROR_READ_TIMEOUT: case HTTPC_ERROR_READ_TIMEOUT:
return String("read Timeout"); return F("read Timeout");
default: default:
return String(); return String();
} }
@ -698,7 +698,10 @@ void HTTPClient::addHeader(const String& name, const String& value, bool first)
{ {
// not allow set of Header handled by code // not allow set of Header handled by code
if(!name.equalsIgnoreCase("Connection") && !name.equalsIgnoreCase("User-Agent") && !name.equalsIgnoreCase("Host") && !(_base64Authorization.length() && name.equalsIgnoreCase("Authorization"))) { if(!name.equalsIgnoreCase(F("Connection")) &&
!name.equalsIgnoreCase(F("User-Agent")) &&
!name.equalsIgnoreCase(F("Host")) &&
!(name.equalsIgnoreCase(F("Authorization")) && _base64Authorization.length())){
String headerLine = name; String headerLine = name;
headerLine += ": "; headerLine += ": ";
headerLine += value; headerLine += value;
@ -821,7 +824,7 @@ bool HTTPClient::sendHeader(const char * type)
return false; return false;
} }
String header = String(type) + " " + _uri + " HTTP/1."; String header = String(type) + " " + _uri + F(" HTTP/1.");
if(_useHTTP10) { if(_useHTTP10) {
header += "0"; header += "0";
@ -829,24 +832,25 @@ bool HTTPClient::sendHeader(const char * type)
header += "1"; header += "1";
} }
header += "\r\n" header += String(F("\r\nHost: ")) + _host +
"Host: " + _host + "\r\n" F("\r\nUser-Agent: ") + _userAgent +
"User-Agent: " + _userAgent + "\r\n" F("\r\nConnection: ");
"Connection: ";
if(_reuse) { if(_reuse) {
header += "keep-alive"; header += F("keep-alive");
} else { } else {
header += "close"; header += F("close");
} }
header += "\r\n"; header += "\r\n";
if(!_useHTTP10) { if(!_useHTTP10) {
header += "Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0\r\n"; header += F("Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0\r\n");
} }
if(_base64Authorization.length()) { if(_base64Authorization.length()) {
header += "Authorization: Basic " + _base64Authorization + "\r\n"; header += F("Authorization: Basic ");
header += _base64Authorization;
header += "\r\n";
} }
header += _headers + "\r\n"; header += _headers + "\r\n";

View File

@ -145,7 +145,7 @@ public:
bool connected(void); bool connected(void);
void setReuse(bool reuse); /// keep-alive void setReuse(bool reuse); /// keep-alive
void setUserAgent(const char * userAgent); void setUserAgent(const String& userAgent);
void setAuthorization(const char * user, const char * password); void setAuthorization(const char * user, const char * password);
void setAuthorization(const char * auth); void setAuthorization(const char * auth);
void setTimeout(uint16_t timeout); void setTimeout(uint16_t timeout);

View File

@ -125,31 +125,31 @@ String ESP8266HTTPUpdate::getLastErrorString(void)
StreamString error; StreamString error;
Update.printError(error); Update.printError(error);
error.trim(); // remove line ending error.trim(); // remove line ending
return "Update error: " + error; return String(F("Update error: ")) + error;
} }
// error from http client // error from http client
if(_lastError > -100) { if(_lastError > -100) {
return "HTTP error: " + HTTPClient::errorToString(_lastError); return String(F("HTTP error: ")) + HTTPClient::errorToString(_lastError);
} }
switch(_lastError) { switch(_lastError) {
case HTTP_UE_TOO_LESS_SPACE: case HTTP_UE_TOO_LESS_SPACE:
return String("To less space"); return F("To less space");
case HTTP_UE_SERVER_NOT_REPORT_SIZE: case HTTP_UE_SERVER_NOT_REPORT_SIZE:
return String("Server not Report Size"); return F("Server not Report Size");
case HTTP_UE_SERVER_FILE_NOT_FOUND: case HTTP_UE_SERVER_FILE_NOT_FOUND:
return String("File not Found (404)"); return F("File not Found (404)");
case HTTP_UE_SERVER_FORBIDDEN: case HTTP_UE_SERVER_FORBIDDEN:
return String("Forbidden (403)"); return F("Forbidden (403)");
case HTTP_UE_SERVER_WRONG_HTTP_CODE: case HTTP_UE_SERVER_WRONG_HTTP_CODE:
return String("Wrong HTTP code"); return F("Wrong HTTP code");
case HTTP_UE_SERVER_FAULTY_MD5: case HTTP_UE_SERVER_FAULTY_MD5:
return String("Faulty MD5"); return F("Faulty MD5");
case HTTP_UE_BIN_VERIFY_HEADER_FAILED: case HTTP_UE_BIN_VERIFY_HEADER_FAILED:
return String("Verify bin header failed"); return F("Verify bin header failed");
case HTTP_UE_BIN_FOR_WRONG_FLASH: case HTTP_UE_BIN_FOR_WRONG_FLASH:
return String("bin for wrong flash size"); return F("bin for wrong flash size");
} }
return String(); return String();
@ -170,22 +170,22 @@ HTTPUpdateResult ESP8266HTTPUpdate::handleUpdate(HTTPClient& http, const String&
// use HTTP/1.0 for update since the update handler not support any transfer Encoding // use HTTP/1.0 for update since the update handler not support any transfer Encoding
http.useHTTP10(true); http.useHTTP10(true);
http.setTimeout(8000); http.setTimeout(8000);
http.setUserAgent("ESP8266-http-Update"); http.setUserAgent(F("ESP8266-http-Update"));
http.addHeader("x-ESP8266-STA-MAC", WiFi.macAddress()); http.addHeader(F("x-ESP8266-STA-MAC"), WiFi.macAddress());
http.addHeader("x-ESP8266-AP-MAC", WiFi.softAPmacAddress()); http.addHeader(F("x-ESP8266-AP-MAC"), WiFi.softAPmacAddress());
http.addHeader("x-ESP8266-free-space", String(ESP.getFreeSketchSpace())); http.addHeader(F("x-ESP8266-free-space"), String(ESP.getFreeSketchSpace()));
http.addHeader("x-ESP8266-sketch-size", String(ESP.getSketchSize())); http.addHeader(F("x-ESP8266-sketch-size"), String(ESP.getSketchSize()));
http.addHeader("x-ESP8266-chip-size", String(ESP.getFlashChipRealSize())); http.addHeader(F("x-ESP8266-chip-size"), String(ESP.getFlashChipRealSize()));
http.addHeader("x-ESP8266-sdk-version", ESP.getSdkVersion()); http.addHeader(F("x-ESP8266-sdk-version"), ESP.getSdkVersion());
if(spiffs) { if(spiffs) {
http.addHeader("x-ESP8266-mode", "spiffs"); http.addHeader(F("x-ESP8266-mode"), F("spiffs"));
} else { } else {
http.addHeader("x-ESP8266-mode", "sketch"); http.addHeader(F("x-ESP8266-mode"), F("sketch"));
} }
if(currentVersion && currentVersion[0] != 0x00) { if(currentVersion && currentVersion[0] != 0x00) {
http.addHeader("x-ESP8266-version", currentVersion); http.addHeader(F("x-ESP8266-version"), currentVersion);
} }
const char * headerkeys[] = { "x-MD5" }; const char * headerkeys[] = { "x-MD5" };