1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-21 10:26:06 +03:00

rework sendRequest stream too

This commit is contained in:
Markus Sattler 2015-12-31 12:14:46 +01:00
parent bd7d915bcd
commit 53287f4573

View File

@ -331,12 +331,12 @@ int HTTPClient::sendRequest(const char * type, uint8_t * payload, size_t size) {
int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) { int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) {
if(!stream) { if(!stream) {
return HTTPC_ERROR_NO_STREAM; return returnError(HTTPC_ERROR_NO_STREAM);
} }
// connect to server // connect to server
if(!connect()) { if(!connect()) {
return HTTPC_ERROR_CONNECTION_REFUSED; return returnError(HTTPC_ERROR_CONNECTION_REFUSED);
} }
if(size > 0) { if(size > 0) {
@ -345,7 +345,7 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) {
// send Header // send Header
if(!sendHeader(type)) { if(!sendHeader(type)) {
return HTTPC_ERROR_SEND_HEADER_FAILED; return returnError(HTTPC_ERROR_SEND_HEADER_FAILED);
} }
int buff_size = HTTP_TCP_BUFFER_SIZE; int buff_size = HTTP_TCP_BUFFER_SIZE;
@ -371,25 +371,68 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) {
while(connected() && (stream->available() > -1) && (len > 0 || len == -1)) { while(connected() && (stream->available() > -1) && (len > 0 || len == -1)) {
// get available data size // get available data size
int s = stream->available(); int sizeAvailable = stream->available();
if(len) { if(sizeAvailable) {
s = ((s > len) ? len : s);
}
if(s) { int readBytes = sizeAvailable;
int c = stream->readBytes(buff, ((s > buff_size) ? buff_size : s));
// write it to Stream // read only the asked bytes
int w = _tcp->write((const uint8_t *) buff, c); if(len > 0 && readBytes > len) {
bytesWritten += w; readBytes = len;
if(w != c) {
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] short write asked for %d but got %d\n", c, w);
break;
} }
// not read more the buffer can handle
if(readBytes > buff_size) {
readBytes = buff_size;
}
// read data
int bytesRead = stream->readBytes(buff, readBytes);
// write it to Stream
int bytesWrite = _tcp->write((const uint8_t *) buff, bytesRead);
bytesWritten += bytesWrite;
// are all Bytes a writen to stream ?
if(bytesWrite != bytesRead) {
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] short write, asked for %d but got %d retry...\n", bytesRead, bytesWrite);
// check for write error
if(_tcp->getWriteError()) {
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] stream write error %d\n", _tcp->getWriteError());
//reset write error for retry
_tcp->clearWriteError();
}
// some time for the stream
delay(1);
int leftBytes = (readBytes - bytesWrite);
// retry to send the missed bytes
bytesWrite = _tcp->write((const uint8_t *) (buff + bytesWrite), leftBytes);
bytesWritten += bytesWrite;
if(bytesWrite != leftBytes) {
// failed again
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] short write, asked for %d but got %d failed.\n", leftBytes, bytesWrite);
free(buff);
return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED);
}
}
// check for write error
if(_tcp->getWriteError()) {
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] stream write error %d\n", _tcp->getWriteError());
free(buff);
return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED);
}
// count bytes to read left
if(len > 0) { if(len > 0) {
len -= c; len -= readBytes;
} }
delay(0); delay(0);
@ -403,18 +446,18 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) {
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!");
return HTTPC_ERROR_SEND_PAYLOAD_FAILED; return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED);
} else { } else {
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload written: %d\n", bytesWritten); DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload written: %d\n", bytesWritten);
} }
} else { } else {
DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] too less ram! need %d\n", HTTP_TCP_BUFFER_SIZE); DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] too less ram! need %d\n", HTTP_TCP_BUFFER_SIZE);
return HTTPC_ERROR_TOO_LESS_RAM; return returnError(HTTPC_ERROR_TOO_LESS_RAM);
} }
// handle Server Response (Header) // handle Server Response (Header)
return handleHeaderResponse(); return returnError(handleHeaderResponse());
} }
/** /**
@ -851,7 +894,7 @@ int HTTPClient::writeToStreamDataBlock(Stream * stream, int size) {
int readBytes = sizeAvailable; int readBytes = sizeAvailable;
// read only the asked bytes // read only the asked bytes
if(readBytes > len) { if(len > 0 && readBytes > len) {
readBytes = len; readBytes = len;
} }
@ -899,6 +942,7 @@ int HTTPClient::writeToStreamDataBlock(Stream * stream, int size) {
// check for write error // check for write error
if(stream->getWriteError()) { if(stream->getWriteError()) {
DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] stream write error %d\n", stream->getWriteError()); DEBUG_HTTPCLIENT("[HTTP-Client][writeToStreamDataBlock] stream write error %d\n", stream->getWriteError());
free(buff);
return HTTPC_ERROR_STREAM_WRITE; return HTTPC_ERROR_STREAM_WRITE;
} }