1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-07 16:23:38 +03:00

HTTP Client move buffer (1460 Byte) from stack to heap.

This commit is contained in:
Markus Sattler 2015-12-16 00:32:17 +01:00
parent 3940b35491
commit b8769bf5eb
3 changed files with 63 additions and 47 deletions

View File

@ -60,7 +60,6 @@ void loop() {
} }
http.end(); http.end();
} }
delay(1000); delay(1000);

View File

@ -30,7 +30,6 @@
#include "ESP8266HTTPClient.h" #include "ESP8266HTTPClient.h"
/** /**
* constractor * constractor
*/ */
@ -117,7 +116,7 @@ void HTTPClient::begin(String url, String httpsFingerprint) {
if(index >= 0) { if(index >= 0) {
// auth info // auth info
String auth = host.substring(0, index); String auth = host.substring(0, index);
host.remove(0, index +1); // remove auth part including @ host.remove(0, index + 1); // remove auth part including @
_base64Authorization = base64::encode(auth); _base64Authorization = base64::encode(auth);
} }
@ -336,7 +335,7 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) {
} }
// create buffer for read // create buffer for read
uint8_t buff[1460] = { 0 }; uint8_t * buff = (uint8_t *) malloc(HTTP_TCP_BUFFER_SIZE);
int len = size; int len = size;
int bytesWritten = 0; int bytesWritten = 0;
@ -345,34 +344,40 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) {
len = -1; len = -1;
} }
// read all data from stream and send it to server if(buff) {
while(connected() && stream->available() && (len > 0 || len == -1)) { // read all data from stream and send it to server
while(connected() && stream->available() && (len > 0 || len == -1)) {
// get available data size // get available data size
size_t s = stream->available(); size_t s = stream->available();
if(s) { if(s) {
int c = stream->readBytes(buff, ((s > sizeof(buff)) ? sizeof(buff) : s)); int c = stream->readBytes(buff, ((s > HTTP_TCP_BUFFER_SIZE) ? HTTP_TCP_BUFFER_SIZE : s));
// write it to Stream // write it to Stream
bytesWritten += _tcp->write((const uint8_t *)buff, c); bytesWritten += _tcp->write((const uint8_t *) buff, c);
if(len > 0) { if(len > 0) {
len -= c; len -= c;
}
delay(0);
} else {
delay(1);
} }
delay(0);
} else {
delay(1);
} }
}
if(size && (int)size != bytesWritten) { if(size && (int) size != bytesWritten) {
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload bytesWritten %d and size %d mismatch!.\n", bytesWritten, _size); DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload bytesWritten %d and size %d mismatch!.\n", bytesWritten, _size); DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] ERROR SEND PAYLOAD FAILED!");
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] ERROR SEND PAYLOAD FAILED!"); free(buff);
return HTTPC_ERROR_SEND_PAYLOAD_FAILED; return HTTPC_ERROR_SEND_PAYLOAD_FAILED;
} else {
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload written: %d\n", bytesWritten);
}
free(buff);
} else { } else {
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload written: %d\n", bytesWritten); DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] too less ram! need " HTTP_TCP_BUFFER_SIZE);
return HTTPC_ERROR_TOO_LESS_RAM;
} }
// handle Server Response (Header) // handle Server Response (Header)
@ -434,37 +439,44 @@ int HTTPClient::writeToStream(Stream * stream) {
int len = _size; int len = _size;
int bytesWritten = 0; int bytesWritten = 0;
// create buffer for read // create buffer for read
uint8_t buff[1460] = { 0 }; uint8_t * buff = (uint8_t *) malloc(HTTP_TCP_BUFFER_SIZE);
// read all data from server if(buff) {
while(connected() && (len > 0 || len == -1)) { // read all data from server
while(connected() && (len > 0 || len == -1)) {
// get available data size // get available data size
size_t size = _tcp->available(); size_t size = _tcp->available();
if(size) { if(size) {
int c = _tcp->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size)); int c = _tcp->readBytes(buff, ((size > HTTP_TCP_BUFFER_SIZE) ? HTTP_TCP_BUFFER_SIZE : size));
// write it to Stream // write it to Stream
bytesWritten += stream->write(buff, c); bytesWritten += stream->write(buff, c);
if(len > 0) { if(len > 0) {
len -= c; len -= c;
}
delay(0);
} else {
delay(1);
} }
delay(0);
} else {
delay(1);
} }
free(buff);
DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] connection closed or file end (written: %d).\n", bytesWritten);
if(_size && _size != bytesWritten) {
DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] bytesWritten %d and size %d mismatch!.\n", bytesWritten, _size);
}
} else {
DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] too less ram! need " HTTP_TCP_BUFFER_SIZE);
} }
DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] connection closed or file end (written: %d).\n", bytesWritten);
if(_size && _size != bytesWritten) {
DEBUG_HTTPCLIENT("[HTTP-Client][writeToStream] bytesWritten %d and size %d mismatch!.\n", bytesWritten, _size);
}
end(); end();
return bytesWritten; return bytesWritten;
} }
@ -509,12 +521,13 @@ String HTTPClient::errorToString(int error) {
return String("no stream"); return String("no stream");
case HTTPC_ERROR_NO_HTTP_SERVER: case HTTPC_ERROR_NO_HTTP_SERVER:
return String("no HTTP server"); return String("no HTTP server");
case HTTPC_ERROR_TOO_LESS_RAM:
return String("too less ram");
default: default:
return String(); return String();
} }
} }
/** /**
* adds Header to the request * adds Header to the request
* @param name * @param name

View File

@ -41,6 +41,10 @@
#define HTTPC_ERROR_CONNECTION_LOST (-5) #define HTTPC_ERROR_CONNECTION_LOST (-5)
#define HTTPC_ERROR_NO_STREAM (-6) #define HTTPC_ERROR_NO_STREAM (-6)
#define HTTPC_ERROR_NO_HTTP_SERVER (-7) #define HTTPC_ERROR_NO_HTTP_SERVER (-7)
#define HTTPC_ERROR_TOO_LESS_RAM (-8)
/// size for the stream handling
#define HTTP_TCP_BUFFER_SIZE (1460)
/// HTTP codes see RFC7231 /// HTTP codes see RFC7231
typedef enum { typedef enum {