Skip to content

Commit fc96312

Browse files
yoursunnyd-a-v
authored andcommitted
ESP8266HTTPClient: allow getString() more than once (esp8266#5091)
fixes esp8266#4951
1 parent e93e9f6 commit fc96312

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

Diff for: libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp

+23-8
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
class TransportTraits
3434
{
3535
public:
36-
virtual ~TransportTraits()
36+
virtual ~TransportTraits()
3737
{
3838
}
3939

@@ -126,6 +126,7 @@ void HTTPClient::clear()
126126
_returnCode = 0;
127127
_size = -1;
128128
_headers = "";
129+
_payload.reset();
129130
}
130131

131132

@@ -281,6 +282,16 @@ bool HTTPClient::begin(String host, uint16_t port, String uri, const uint8_t htt
281282
* called after the payload is handled
282283
*/
283284
void HTTPClient::end(void)
285+
{
286+
disconnect();
287+
clear();
288+
}
289+
290+
/**
291+
* disconnect
292+
* close the TCP socket
293+
*/
294+
void HTTPClient::disconnect()
284295
{
285296
if(connected()) {
286297
if(_tcp->available() > 0) {
@@ -734,28 +745,32 @@ int HTTPClient::writeToStream(Stream * stream)
734745
return returnError(HTTPC_ERROR_ENCODING);
735746
}
736747

737-
end();
748+
disconnect();
738749
return ret;
739750
}
740751

741752
/**
742753
* return all payload as String (may need lot of ram or trigger out of memory!)
743754
* @return String
744755
*/
745-
String HTTPClient::getString(void)
756+
const String& HTTPClient::getString(void)
746757
{
747-
StreamString sstring;
758+
if (_payload) {
759+
return *_payload;
760+
}
761+
762+
_payload.reset(new StreamString());
748763

749764
if(_size) {
750765
// try to reserve needed memmory
751-
if(!sstring.reserve((_size + 1))) {
766+
if(!_payload->reserve((_size + 1))) {
752767
DEBUG_HTTPCLIENT("[HTTP-Client][getString] not enough memory to reserve a string! need: %d\n", (_size + 1));
753-
return "";
768+
return *_payload;
754769
}
755770
}
756771

757-
writeToStream(&sstring);
758-
return sstring;
772+
writeToStream(_payload.get());
773+
return *_payload;
759774
}
760775

761776
/**

Diff for: libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ typedef enum {
127127
class TransportTraits;
128128
typedef std::unique_ptr<TransportTraits> TransportTraitsPtr;
129129

130+
class StreamString;
131+
130132
class HTTPClient
131133
{
132134
public:
@@ -185,7 +187,7 @@ class HTTPClient
185187
WiFiClient& getStream(void);
186188
WiFiClient* getStreamPtr(void);
187189
int writeToStream(Stream* stream);
188-
String getString(void);
190+
const String& getString(void);
189191

190192
static String errorToString(int error);
191193

@@ -196,6 +198,7 @@ class HTTPClient
196198
};
197199

198200
bool beginInternal(String url, const char* expectedProtocol);
201+
void disconnect();
199202
void clear();
200203
int returnError(int error);
201204
bool connect(void);
@@ -228,6 +231,7 @@ class HTTPClient
228231
int _size = -1;
229232
bool _canReuse = false;
230233
transferEncoding_t _transferEncoding = HTTPC_TE_IDENTITY;
234+
std::unique_ptr<StreamString> _payload;
231235
};
232236

233237

0 commit comments

Comments
 (0)