@@ -239,18 +239,43 @@ void AsyncWebServerResponse::setContentType(const char* type) {
239
239
_contentType = type;
240
240
}
241
241
242
- void AsyncWebServerResponse::addHeader (const char * name, const char * value) {
242
+ bool AsyncWebServerResponse::removeHeader (const char * name) {
243
+ for (auto i = _headers.begin (); i != _headers.end (); ++i) {
244
+ if (i->name ().equalsIgnoreCase (name)) {
245
+ _headers.erase (i);
246
+ return true ;
247
+ }
248
+ }
249
+ return false ;
250
+ }
251
+
252
+ bool AsyncWebServerResponse::addHeader (const char * name, const char * value, bool replaceExisting) {
253
+ for (auto i = _headers.begin (); i != _headers.end (); ++i) {
254
+ if (i->name ().equalsIgnoreCase (name)) {
255
+ // header already set
256
+ if (replaceExisting) {
257
+ // remove, break and add the new one
258
+ _headers.erase (i);
259
+ break ;
260
+ } else {
261
+ // do not update
262
+ return false ;
263
+ }
264
+ }
265
+ }
266
+ // header was not found found, or existing one was removed
243
267
_headers.emplace_back (name, value);
268
+ return true ;
244
269
}
245
270
246
271
String AsyncWebServerResponse::_assembleHead (uint8_t version) {
247
272
if (version) {
248
- addHeader (T_Accept_Ranges, T_none);
273
+ addHeader (T_Accept_Ranges, T_none, false );
249
274
if (_chunked)
250
- addHeader (Transfer_Encoding , T_chunked);
275
+ addHeader (T_Transfer_Encoding , T_chunked, false );
251
276
}
252
277
String out;
253
- int bufSize = 300 ;
278
+ constexpr size_t bufSize = 300 ;
254
279
char buf[bufSize];
255
280
256
281
#ifndef ESP8266
@@ -307,7 +332,7 @@ AsyncBasicResponse::AsyncBasicResponse(int code, const char* contentType, const
307
332
if (!_contentType.length ())
308
333
_contentType = T_text_plain;
309
334
}
310
- addHeader (T_Connection, T_close);
335
+ addHeader (T_Connection, T_close, false );
311
336
}
312
337
313
338
void AsyncBasicResponse::_respond (AsyncWebServerRequest* request) {
@@ -385,7 +410,7 @@ AsyncAbstractResponse::AsyncAbstractResponse(AwsTemplateProcessor callback) : _c
385
410
}
386
411
387
412
void AsyncAbstractResponse::_respond (AsyncWebServerRequest* request) {
388
- addHeader (T_Connection, T_close);
413
+ addHeader (T_Connection, T_close, false );
389
414
_head = _assembleHead (request->version ());
390
415
_state = RESPONSE_HEADERS;
391
416
_ack (request, 0 , 0 );
@@ -663,7 +688,7 @@ AsyncFileResponse::AsyncFileResponse(FS& fs, const String& path, const char* con
663
688
664
689
if (!download && !fs.exists (_path) && fs.exists (_path + T__gz)) {
665
690
_path = _path + T__gz;
666
- addHeader (T_Content_Encoding, T_gzip);
691
+ addHeader (T_Content_Encoding, T_gzip, false );
667
692
_callback = nullptr ; // Unable to process zipped templates
668
693
_sendContentLength = true ;
669
694
_chunked = false ;
@@ -688,15 +713,15 @@ AsyncFileResponse::AsyncFileResponse(FS& fs, const String& path, const char* con
688
713
// set filename and force rendering
689
714
snprintf_P (buf, sizeof (buf), PSTR (" inline" ));
690
715
}
691
- addHeader (T_Content_Disposition, buf);
716
+ addHeader (T_Content_Disposition, buf, false );
692
717
}
693
718
694
719
AsyncFileResponse::AsyncFileResponse (File content, const String& path, const char * contentType, bool download, AwsTemplateProcessor callback) : AsyncAbstractResponse(callback) {
695
720
_code = 200 ;
696
721
_path = path;
697
722
698
723
if (!download && String (content.name ()).endsWith (T__gz) && !path.endsWith (T__gz)) {
699
- addHeader (T_Content_Encoding, T_gzip);
724
+ addHeader (T_Content_Encoding, T_gzip, false );
700
725
_callback = nullptr ; // Unable to process gzipped templates
701
726
_sendContentLength = true ;
702
727
_chunked = false ;
@@ -719,7 +744,7 @@ AsyncFileResponse::AsyncFileResponse(File content, const String& path, const cha
719
744
} else {
720
745
snprintf_P (buf, sizeof (buf), PSTR (" inline" ));
721
746
}
722
- addHeader (T_Content_Disposition, buf);
747
+ addHeader (T_Content_Disposition, buf, false );
723
748
}
724
749
725
750
size_t AsyncFileResponse::_fillBuffer (uint8_t * data, size_t len) {
0 commit comments