@@ -41,6 +41,7 @@ const char * AUTHORIZATION_HEADER = "Authorization";
41
41
ESP8266WebServer::ESP8266WebServer (IPAddress addr, int port)
42
42
: _server(addr, port)
43
43
, _currentMethod(HTTP_ANY)
44
+ , _currentVersion(0 )
44
45
, _currentHandler(0 )
45
46
, _firstHandler(0 )
46
47
, _lastHandler(0 )
@@ -55,6 +56,7 @@ ESP8266WebServer::ESP8266WebServer(IPAddress addr, int port)
55
56
ESP8266WebServer::ESP8266WebServer (int port)
56
57
: _server(port)
57
58
, _currentMethod(HTTP_ANY)
59
+ , _currentVersion(0 )
58
60
, _currentHandler(0 )
59
61
, _firstHandler(0 )
60
62
, _lastHandler(0 )
@@ -246,7 +248,7 @@ void ESP8266WebServer::setContentLength(size_t contentLength) {
246
248
}
247
249
248
250
void ESP8266WebServer::_prepareHeader (String& response, int code, const char * content_type, size_t contentLength) {
249
- response = " HTTP/1.1 " ;
251
+ response = " HTTP/1." + String (_currentVersion)+ " " ;
250
252
response += String (code);
251
253
response += " " ;
252
254
response += _responseCodeToString (code);
@@ -260,9 +262,12 @@ void ESP8266WebServer::_prepareHeader(String& response, int code, const char* co
260
262
sendHeader (" Content-Length" , String (contentLength));
261
263
} else if (_contentLength != CONTENT_LENGTH_UNKNOWN) {
262
264
sendHeader (" Content-Length" , String (_contentLength));
265
+ } else if (_contentLength == CONTENT_LENGTH_UNKNOWN && _currentVersion){ // HTTP/1.1 or above client
266
+ // let's do chunked
267
+ sendHeader (" Accept-Ranges" ," none" );
268
+ sendHeader (" Transfer-Encoding" ," chunked" );
263
269
}
264
270
sendHeader (" Connection" , " close" );
265
- sendHeader (" Access-Control-Allow-Origin" , " *" );
266
271
267
272
response += _responseHeaders;
268
273
response += " \r\n " ;
@@ -271,9 +276,12 @@ void ESP8266WebServer::_prepareHeader(String& response, int code, const char* co
271
276
272
277
void ESP8266WebServer::send (int code, const char * content_type, const String& content) {
273
278
String header;
279
+ if (content.length () == 0 && _contentLength == CONTENT_LENGTH_NOT_SET)
280
+ _contentLength = CONTENT_LENGTH_UNKNOWN;
274
281
_prepareHeader (header, code, content_type, content.length ());
275
- sendContent (header);
276
- sendContent (content);
282
+ _currentClient.write (header.c_str (), header.length ());
283
+ if (content.length ())
284
+ sendContent (content);
277
285
}
278
286
279
287
void ESP8266WebServer::send_P (int code, PGM_P content_type, PGM_P content) {
@@ -287,7 +295,7 @@ void ESP8266WebServer::send_P(int code, PGM_P content_type, PGM_P content) {
287
295
char type[64 ];
288
296
memccpy_P ((void *)type, (PGM_VOID_P)content_type, 0 , sizeof (type));
289
297
_prepareHeader (header, code, (const char * )type, contentLength);
290
- sendContent (header);
298
+ _currentClient. write (header. c_str (), header. length () );
291
299
sendContent_P (content);
292
300
}
293
301
@@ -309,15 +317,40 @@ void ESP8266WebServer::send(int code, const String& content_type, const String&
309
317
}
310
318
311
319
void ESP8266WebServer::sendContent (const String& content) {
312
- _currentClient.write (content.c_str (), content.length ());
320
+ const char * footer = " \r\n " ;
321
+ size_t len = content.length ();
322
+ if (_contentLength == CONTENT_LENGTH_UNKNOWN && _currentVersion) {
323
+ char * chunkSize = (char *)malloc (11 );
324
+ if (chunkSize){
325
+ sprintf (chunkSize, " %x%s" , len, footer);
326
+ _currentClient.write (chunkSize, strlen (chunkSize));
327
+ free (chunkSize);
328
+ }
329
+ }
330
+ _currentClient.write (content.c_str (), len);
331
+ if (_contentLength == CONTENT_LENGTH_UNKNOWN && _currentVersion){
332
+ _currentClient.write (footer, 2 );
333
+ }
313
334
}
314
335
315
336
void ESP8266WebServer::sendContent_P (PGM_P content) {
316
- _currentClient. write_P (content, strlen_P (content));
337
+ sendContent_P (content, strlen_P (content));
317
338
}
318
339
319
340
void ESP8266WebServer::sendContent_P (PGM_P content, size_t size) {
341
+ const char * footer = " \r\n " ;
342
+ if (_contentLength == CONTENT_LENGTH_UNKNOWN && _currentVersion) {
343
+ char * chunkSize = (char *)malloc (11 );
344
+ if (chunkSize){
345
+ sprintf (chunkSize, " %x%s" , size, footer);
346
+ _currentClient.write (chunkSize, strlen (chunkSize));
347
+ free (chunkSize);
348
+ }
349
+ }
320
350
_currentClient.write_P (content, size);
351
+ if (_contentLength == CONTENT_LENGTH_UNKNOWN && _currentVersion){
352
+ _currentClient.write (footer, 2 );
353
+ }
321
354
}
322
355
323
356
0 commit comments