Skip to content

Commit daf9195

Browse files
Xiaofan TanXiaofan Tan
authored andcommitted
Fix send error header when url is like "http://github.com"(not end with '/').
Add collectAllHeaders() to support collecting all response headers. Old collectHeaders() can not handle two header with the same name.
1 parent 7b32e6a commit daf9195

File tree

2 files changed

+68
-10
lines changed

2 files changed

+68
-10
lines changed

libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,7 @@ HTTPClient::~HTTPClient()
8686
if(_tcp) {
8787
_tcp->stop();
8888
}
89-
if(_currentHeaders) {
90-
delete[] _currentHeaders;
91-
}
89+
collectNone();
9290
}
9391

9492
void HTTPClient::clear()
@@ -168,6 +166,8 @@ bool HTTPClient::beginInternal(String url, const char* expectedProtocol)
168166
_host = host;
169167
}
170168
_uri = url;
169+
if (_uri == "")
170+
_uri = "/";
171171
if (_protocol != expectedProtocol) {
172172
DEBUG_HTTPCLIENT("[HTTP-Client][begin] unexpected protocol: %s, expected %s\n", _protocol.c_str(), expectedProtocol);
173173
return false;
@@ -750,18 +750,43 @@ void HTTPClient::addHeader(const String& name, const String& value, bool first,
750750

751751
}
752752

753+
void HTTPClient::collectNone()
754+
{
755+
// clear collectAllHeaders() effect
756+
if (_responseHeader)
757+
{
758+
delete _responseHeader;
759+
_responseHeader = nullptr;
760+
}
761+
// clear collectHeaders() effect
762+
if (_currentHeaders)
763+
{
764+
delete[] _currentHeaders;
765+
_currentHeaders = nullptr;
766+
_headerKeysCount = 0;
767+
}
768+
}
769+
753770
void HTTPClient::collectHeaders(const char* headerKeys[], const size_t headerKeysCount)
754771
{
772+
collectNone();
755773
_headerKeysCount = headerKeysCount;
756-
if(_currentHeaders) {
757-
delete[] _currentHeaders;
774+
if (!_headerKeysCount) {
775+
_currentHeaders = nullptr;
776+
} else {
777+
_currentHeaders = new RequestArgument[_headerKeysCount];
758778
}
759-
_currentHeaders = new RequestArgument[_headerKeysCount];
760779
for(size_t i = 0; i < _headerKeysCount; i++) {
761780
_currentHeaders[i].key = headerKeys[i];
762781
}
763782
}
764783

784+
void HTTPClient::collectAllHeaders()
785+
{
786+
collectNone();
787+
_responseHeader = new std::vector<RequestArgument>;
788+
}
789+
765790
String HTTPClient::header(const char* name)
766791
{
767792
for(size_t i = 0; i < _headerKeysCount; ++i) {
@@ -777,6 +802,9 @@ String HTTPClient::header(size_t i)
777802
if(i < _headerKeysCount) {
778803
return _currentHeaders[i].value;
779804
}
805+
if (_responseHeader && i < _responseHeader->size()) {
806+
return (*_responseHeader)[i].value;
807+
}
780808
return String();
781809
}
782810

@@ -785,16 +813,28 @@ String HTTPClient::headerName(size_t i)
785813
if(i < _headerKeysCount) {
786814
return _currentHeaders[i].key;
787815
}
816+
if (_responseHeader && i < _responseHeader->size()) {
817+
return (*_responseHeader)[i].key;
818+
}
788819
return String();
789820
}
790821

791822
int HTTPClient::headers()
792823
{
824+
if (_responseHeader)
825+
return _responseHeader->size();
793826
return _headerKeysCount;
794827
}
795828

796829
bool HTTPClient::hasHeader(const char* name)
797830
{
831+
if (_responseHeader) {
832+
for(size_t i = 0; i < _responseHeader->size(); ++i) {
833+
if(((*_responseHeader)[i].key == name) && ((*_responseHeader)[i].value.length() > 0)) {
834+
return true;
835+
}
836+
}
837+
}
798838
for(size_t i = 0; i < _headerKeysCount; ++i) {
799839
if((_currentHeaders[i].key == name) && (_currentHeaders[i].value.length() > 0)) {
800840
return true;
@@ -904,11 +944,12 @@ bool HTTPClient::sendHeader(const char * type)
904944
*/
905945
int HTTPClient::handleHeaderResponse()
906946
{
907-
908947
if(!connected()) {
909948
return HTTPC_ERROR_NOT_CONNECTED;
910949
}
911-
950+
if (_responseHeader) {
951+
_responseHeader->clear();
952+
}
912953
String transferEncoding;
913954
_returnCode = -1;
914955
_size = -1;
@@ -943,8 +984,18 @@ int HTTPClient::handleHeaderResponse()
943984
if(headerName.equalsIgnoreCase("Transfer-Encoding")) {
944985
transferEncoding = headerValue;
945986
}
946-
947-
for(size_t i = 0; i < _headerKeysCount; i++) {
987+
988+
if (_responseHeader) {
989+
String key = headerName;
990+
key.trim();
991+
if (key != "") {
992+
_responseHeader->emplace_back();
993+
auto& lastone = (*_responseHeader)[_responseHeader->size()-1];
994+
lastone.key = key;
995+
lastone.value = headerValue;
996+
}
997+
}
998+
else for(size_t i = 0; i < _headerKeysCount; i++) {
948999
if(_currentHeaders[i].key.equalsIgnoreCase(headerName)) {
9491000
_currentHeaders[i].value = headerValue;
9501001
break;

libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <memory>
2929
#include <Arduino.h>
3030
#include <WiFiClient.h>
31+
#include <vector>
3132

3233
#ifdef DEBUG_ESP_HTTP_CLIENT
3334
#ifdef DEBUG_ESP_PORT
@@ -166,6 +167,8 @@ class HTTPClient
166167

167168
/// Response handling
168169
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);
170+
void collectAllHeaders();
171+
void collectNone();
169172
String header(const char* name); // get request header value by name
170173
String header(size_t i); // get request header value by number
171174
String headerName(size_t i); // get request header name by number
@@ -216,6 +219,10 @@ class HTTPClient
216219
/// Response handling
217220
RequestArgument* _currentHeaders = nullptr;
218221
size_t _headerKeysCount = 0;
222+
std::vector<RequestArgument>*
223+
_responseHeader = nullptr; // if _responseHeader is not nullptr, then save all response headers
224+
225+
219226

220227
int _returnCode = 0;
221228
int _size = -1;

0 commit comments

Comments
 (0)