@@ -51,7 +51,6 @@ AsyncWebServerRequest::AsyncWebServerRequest(AsyncWebServer* s, AsyncClient* c)
51
51
, _expectingContinue(false )
52
52
, _contentLength(0 )
53
53
, _parsedLength(0 )
54
- , _headers(LinkedList<AsyncWebHeader *>([](AsyncWebHeader *h){ delete h; }))
55
54
, _params(LinkedList<AsyncWebParameter *>([](AsyncWebParameter *p){ delete p; }))
56
55
, _pathParams(LinkedList<String *>([](String *p){ delete p; }))
57
56
, _multiParseState(0 )
@@ -76,12 +75,12 @@ AsyncWebServerRequest::AsyncWebServerRequest(AsyncWebServer* s, AsyncClient* c)
76
75
}
77
76
78
77
AsyncWebServerRequest::~AsyncWebServerRequest (){
79
- _headers.free ();
78
+ _headers.clear ();
80
79
81
80
_params.free ();
82
81
_pathParams.free ();
83
82
84
- _interestingHeaders.free ();
83
+ _interestingHeaders.clear ();
85
84
86
85
if (_response != NULL ){
87
86
delete _response;
@@ -182,20 +181,19 @@ void AsyncWebServerRequest::_onData(void *buf, size_t len){
182
181
}
183
182
184
183
void AsyncWebServerRequest::_removeNotInterestingHeaders (){
185
- if (_interestingHeaders.containsIgnoreCase (F (" ANY" ))) {
186
- return ; // nothing to do
187
- }
188
- // When removing items from the list, we must increase the iterator first
189
- // before removing the current item, otherwise the iterator is invalidated
190
- // So, no for(;;) loop can be used, see: https://stackoverflow.com/q/596162
191
- auto i_header = _headers.begin ();
192
- const auto i_end = _headers.end ();
193
- while (i_header != i_end){
194
- const auto header = *i_header;
195
- ++i_header;
196
- if (!_interestingHeaders.containsIgnoreCase (header->name ().c_str ())){
197
- _headers.remove (header);
198
- }
184
+ if (std::any_of (std::begin (_interestingHeaders), std::end (_interestingHeaders),
185
+ [](const String &str){ return str.equalsIgnoreCase (F (" ANY" )); }))
186
+ return ; // nothing to do
187
+
188
+ for (auto iter = std::begin (_headers); iter != std::end (_headers); )
189
+ {
190
+ const auto name = iter->name ();
191
+
192
+ if (std::none_of (std::begin (_interestingHeaders), std::end (_interestingHeaders),
193
+ [&name](const String &str){ return str.equalsIgnoreCase (name); }))
194
+ iter = _headers.erase (iter);
195
+ else
196
+ iter++;
199
197
}
200
198
}
201
199
@@ -370,7 +368,7 @@ bool AsyncWebServerRequest::_parseReqHeader(){
370
368
}
371
369
}
372
370
}
373
- _headers.add ( new AsyncWebHeader ( name, value) );
371
+ _headers.emplace_back ( name, value);
374
372
}
375
373
_temp = String ();
376
374
return true ;
@@ -611,12 +609,12 @@ void AsyncWebServerRequest::_parseLine(){
611
609
}
612
610
613
611
size_t AsyncWebServerRequest::headers () const {
614
- return _headers.length ();
612
+ return _headers.size ();
615
613
}
616
614
617
615
bool AsyncWebServerRequest::hasHeader (const String& name) const {
618
616
for (const auto & h: _headers){
619
- if (h-> name ().equalsIgnoreCase (name)){
617
+ if (h. name ().equalsIgnoreCase (name)){
620
618
return true ;
621
619
}
622
620
}
@@ -627,22 +625,64 @@ bool AsyncWebServerRequest::hasHeader(const __FlashStringHelper * data) const {
627
625
return hasHeader (String (data));
628
626
}
629
627
630
- AsyncWebHeader* AsyncWebServerRequest::getHeader (const String& name) const {
631
- for (const auto & h: _headers){
632
- if (h->name ().equalsIgnoreCase (name)){
633
- return h;
634
- }
628
+ AsyncWebHeader* AsyncWebServerRequest::getHeader (const String& name) {
629
+ auto iter = std::find_if (std::begin (_headers), std::end (_headers),
630
+ [&name](const AsyncWebHeader &header){ return header.name ().equalsIgnoreCase (name); });
631
+
632
+ if (iter == std::end (_headers))
633
+ return nullptr ;
634
+
635
+ return &(*iter);
636
+ }
637
+
638
+ const AsyncWebHeader* AsyncWebServerRequest::getHeader (const String& name) const {
639
+ auto iter = std::find_if (std::begin (_headers), std::end (_headers),
640
+ [&name](const AsyncWebHeader &header){ return header.name ().equalsIgnoreCase (name); });
641
+
642
+ if (iter == std::end (_headers))
643
+ return nullptr ;
644
+
645
+ return &(*iter);
646
+ }
647
+
648
+ AsyncWebHeader* AsyncWebServerRequest::getHeader (const __FlashStringHelper * data) {
649
+ PGM_P p = reinterpret_cast <PGM_P>(data);
650
+ size_t n = strlen_P (p);
651
+ char * name = (char *) malloc (n+1 );
652
+ if (name) {
653
+ strcpy_P (name, p);
654
+ AsyncWebHeader* result = getHeader ( String (name));
655
+ free (name);
656
+ return result;
657
+ } else {
658
+ return nullptr ;
659
+ }
660
+ }
661
+
662
+ const AsyncWebHeader* AsyncWebServerRequest::getHeader (const __FlashStringHelper * data) const {
663
+ PGM_P p = reinterpret_cast <PGM_P>(data);
664
+ size_t n = strlen_P (p);
665
+ char * name = (char *) malloc (n+1 );
666
+ if (name) {
667
+ strcpy_P (name, p);
668
+ const AsyncWebHeader* result = getHeader ( String (name));
669
+ free (name);
670
+ return result;
671
+ } else {
672
+ return nullptr ;
635
673
}
636
- return nullptr ;
637
674
}
638
675
639
- AsyncWebHeader* AsyncWebServerRequest::getHeader (const __FlashStringHelper * data) const {
640
- return getHeader (String (data));
676
+ AsyncWebHeader* AsyncWebServerRequest::getHeader (size_t num) {
677
+ if (num >= _headers.size ())
678
+ return nullptr ;
679
+ return &(*std::next (std::begin (_headers), num));
641
680
}
642
681
643
- AsyncWebHeader* AsyncWebServerRequest::getHeader (size_t num) const {
644
- auto header = _headers.nth (num);
645
- return header ? *header : nullptr ;
682
+ const AsyncWebHeader* AsyncWebServerRequest::getHeader (size_t num) const {
683
+ if (num >= _headers.size ())
684
+ return nullptr ;
685
+ return &(*std::next (std::begin (_headers), num));
646
686
}
647
687
648
688
size_t AsyncWebServerRequest::params () const {
@@ -681,8 +721,9 @@ AsyncWebParameter* AsyncWebServerRequest::getParam(size_t num) const {
681
721
}
682
722
683
723
void AsyncWebServerRequest::addInterestingHeader (const String& name){
684
- if (!_interestingHeaders.containsIgnoreCase (name))
685
- _interestingHeaders.add (name);
724
+ if (std::none_of (std::begin (_interestingHeaders), std::end (_interestingHeaders),
725
+ [&name](const String &str){ return str.equalsIgnoreCase (name); }))
726
+ _interestingHeaders.push_back (name);
686
727
}
687
728
688
729
void AsyncWebServerRequest::send (AsyncWebServerResponse *response){
@@ -879,7 +920,7 @@ const String& AsyncWebServerRequest::pathArg(size_t i) const {
879
920
}
880
921
881
922
const String& AsyncWebServerRequest::header (const char * name) const {
882
- AsyncWebHeader* h = getHeader (String (name));
923
+ const AsyncWebHeader* h = getHeader (String (name));
883
924
return h ? h->value () : emptyString;
884
925
}
885
926
@@ -889,12 +930,12 @@ const String& AsyncWebServerRequest::header(const __FlashStringHelper * data) co
889
930
890
931
891
932
const String& AsyncWebServerRequest::header (size_t i) const {
892
- AsyncWebHeader* h = getHeader (i);
933
+ const AsyncWebHeader* h = getHeader (i);
893
934
return h ? h->value () : emptyString;
894
935
}
895
936
896
937
const String& AsyncWebServerRequest::headerName (size_t i) const {
897
- AsyncWebHeader* h = getHeader (i);
938
+ const AsyncWebHeader* h = getHeader (i);
898
939
return h ? h->name () : emptyString;
899
940
}
900
941
0 commit comments