@@ -86,9 +86,7 @@ HTTPClient::~HTTPClient()
86
86
if (_tcp) {
87
87
_tcp->stop ();
88
88
}
89
- if (_currentHeaders) {
90
- delete[] _currentHeaders;
91
- }
89
+ collectNone ();
92
90
}
93
91
94
92
void HTTPClient::clear ()
@@ -168,6 +166,8 @@ bool HTTPClient::beginInternal(String url, const char* expectedProtocol)
168
166
_host = host;
169
167
}
170
168
_uri = url;
169
+ if (_uri == " " )
170
+ _uri = " /" ;
171
171
if (_protocol != expectedProtocol) {
172
172
DEBUG_HTTPCLIENT (" [HTTP-Client][begin] unexpected protocol: %s, expected %s\n " , _protocol.c_str (), expectedProtocol);
173
173
return false ;
@@ -750,18 +750,43 @@ void HTTPClient::addHeader(const String& name, const String& value, bool first,
750
750
751
751
}
752
752
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
+
753
770
void HTTPClient::collectHeaders (const char * headerKeys[], const size_t headerKeysCount)
754
771
{
772
+ collectNone ();
755
773
_headerKeysCount = headerKeysCount;
756
- if (_currentHeaders) {
757
- delete[] _currentHeaders;
774
+ if (!_headerKeysCount) {
775
+ _currentHeaders = nullptr ;
776
+ } else {
777
+ _currentHeaders = new RequestArgument[_headerKeysCount];
758
778
}
759
- _currentHeaders = new RequestArgument[_headerKeysCount];
760
779
for (size_t i = 0 ; i < _headerKeysCount; i++) {
761
780
_currentHeaders[i].key = headerKeys[i];
762
781
}
763
782
}
764
783
784
+ void HTTPClient::collectAllHeaders ()
785
+ {
786
+ collectNone ();
787
+ _responseHeader = new std::vector<RequestArgument>;
788
+ }
789
+
765
790
String HTTPClient::header (const char * name)
766
791
{
767
792
for (size_t i = 0 ; i < _headerKeysCount; ++i) {
@@ -777,6 +802,9 @@ String HTTPClient::header(size_t i)
777
802
if (i < _headerKeysCount) {
778
803
return _currentHeaders[i].value ;
779
804
}
805
+ if (_responseHeader && i < _responseHeader->size ()) {
806
+ return (*_responseHeader)[i].value ;
807
+ }
780
808
return String ();
781
809
}
782
810
@@ -785,16 +813,28 @@ String HTTPClient::headerName(size_t i)
785
813
if (i < _headerKeysCount) {
786
814
return _currentHeaders[i].key ;
787
815
}
816
+ if (_responseHeader && i < _responseHeader->size ()) {
817
+ return (*_responseHeader)[i].key ;
818
+ }
788
819
return String ();
789
820
}
790
821
791
822
int HTTPClient::headers ()
792
823
{
824
+ if (_responseHeader)
825
+ return _responseHeader->size ();
793
826
return _headerKeysCount;
794
827
}
795
828
796
829
bool HTTPClient::hasHeader (const char * name)
797
830
{
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
+ }
798
838
for (size_t i = 0 ; i < _headerKeysCount; ++i) {
799
839
if ((_currentHeaders[i].key == name) && (_currentHeaders[i].value .length () > 0 )) {
800
840
return true ;
@@ -904,11 +944,12 @@ bool HTTPClient::sendHeader(const char * type)
904
944
*/
905
945
int HTTPClient::handleHeaderResponse ()
906
946
{
907
-
908
947
if (!connected ()) {
909
948
return HTTPC_ERROR_NOT_CONNECTED;
910
949
}
911
-
950
+ if (_responseHeader) {
951
+ _responseHeader->clear ();
952
+ }
912
953
String transferEncoding;
913
954
_returnCode = -1 ;
914
955
_size = -1 ;
@@ -943,8 +984,18 @@ int HTTPClient::handleHeaderResponse()
943
984
if (headerName.equalsIgnoreCase (" Transfer-Encoding" )) {
944
985
transferEncoding = headerValue;
945
986
}
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++) {
948
999
if (_currentHeaders[i].key .equalsIgnoreCase (headerName)) {
949
1000
_currentHeaders[i].value = headerValue;
950
1001
break ;
0 commit comments