@@ -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 )
@@ -49,12 +50,14 @@ ESP8266WebServer::ESP8266WebServer(IPAddress addr, int port)
49
50
, _headerKeysCount(0 )
50
51
, _currentHeaders(0 )
51
52
, _contentLength(0 )
53
+ , _chunked(false )
52
54
{
53
55
}
54
56
55
57
ESP8266WebServer::ESP8266WebServer (int port)
56
58
: _server(port)
57
59
, _currentMethod(HTTP_ANY)
60
+ , _currentVersion(0 )
58
61
, _currentHandler(0 )
59
62
, _firstHandler(0 )
60
63
, _lastHandler(0 )
@@ -63,6 +66,7 @@ ESP8266WebServer::ESP8266WebServer(int port)
63
66
, _headerKeysCount(0 )
64
67
, _currentHeaders(0 )
65
68
, _contentLength(0 )
69
+ , _chunked(false )
66
70
{
67
71
}
68
72
@@ -246,7 +250,7 @@ void ESP8266WebServer::setContentLength(size_t contentLength) {
246
250
}
247
251
248
252
void ESP8266WebServer::_prepareHeader (String& response, int code, const char * content_type, size_t contentLength) {
249
- response = " HTTP/1.1 " ;
253
+ response = " HTTP/1." + String (_currentVersion)+ " " ;
250
254
response += String (code);
251
255
response += " " ;
252
256
response += _responseCodeToString (code);
@@ -260,9 +264,13 @@ void ESP8266WebServer::_prepareHeader(String& response, int code, const char* co
260
264
sendHeader (" Content-Length" , String (contentLength));
261
265
} else if (_contentLength != CONTENT_LENGTH_UNKNOWN) {
262
266
sendHeader (" Content-Length" , String (_contentLength));
267
+ } else if (_contentLength == CONTENT_LENGTH_UNKNOWN && _currentVersion){ // HTTP/1.1 or above client
268
+ // let's do chunked
269
+ _chunked = true ;
270
+ sendHeader (" Accept-Ranges" ," none" );
271
+ sendHeader (" Transfer-Encoding" ," chunked" );
263
272
}
264
273
sendHeader (" Connection" , " close" );
265
- sendHeader (" Access-Control-Allow-Origin" , " *" );
266
274
267
275
response += _responseHeaders;
268
276
response += " \r\n " ;
@@ -271,9 +279,13 @@ void ESP8266WebServer::_prepareHeader(String& response, int code, const char* co
271
279
272
280
void ESP8266WebServer::send (int code, const char * content_type, const String& content) {
273
281
String header;
282
+ // Can we asume the following?
283
+ // if(code == 200 && content.length() == 0 && _contentLength == CONTENT_LENGTH_NOT_SET)
284
+ // _contentLength = CONTENT_LENGTH_UNKNOWN;
274
285
_prepareHeader (header, code, content_type, content.length ());
275
- sendContent (header);
276
- sendContent (content);
286
+ _currentClient.write (header.c_str (), header.length ());
287
+ if (content.length ())
288
+ sendContent (content);
277
289
}
278
290
279
291
void ESP8266WebServer::send_P (int code, PGM_P content_type, PGM_P content) {
@@ -287,7 +299,7 @@ void ESP8266WebServer::send_P(int code, PGM_P content_type, PGM_P content) {
287
299
char type[64 ];
288
300
memccpy_P ((void *)type, (PGM_VOID_P)content_type, 0 , sizeof (type));
289
301
_prepareHeader (header, code, (const char * )type, contentLength);
290
- sendContent (header);
302
+ _currentClient. write (header. c_str (), header. length () );
291
303
sendContent_P (content);
292
304
}
293
305
@@ -309,15 +321,40 @@ void ESP8266WebServer::send(int code, const String& content_type, const String&
309
321
}
310
322
311
323
void ESP8266WebServer::sendContent (const String& content) {
312
- _currentClient.write (content.c_str (), content.length ());
324
+ const char * footer = " \r\n " ;
325
+ size_t len = content.length ();
326
+ if (_chunked) {
327
+ char * chunkSize = (char *)malloc (11 );
328
+ if (chunkSize){
329
+ sprintf (chunkSize, " %x%s" , len, footer);
330
+ _currentClient.write (chunkSize, strlen (chunkSize));
331
+ free (chunkSize);
332
+ }
333
+ }
334
+ _currentClient.write (content.c_str (), len);
335
+ if (_chunked){
336
+ _currentClient.write (footer, 2 );
337
+ }
313
338
}
314
339
315
340
void ESP8266WebServer::sendContent_P (PGM_P content) {
316
- _currentClient. write_P (content, strlen_P (content));
341
+ sendContent_P (content, strlen_P (content));
317
342
}
318
343
319
344
void ESP8266WebServer::sendContent_P (PGM_P content, size_t size) {
345
+ const char * footer = " \r\n " ;
346
+ if (_chunked) {
347
+ char * chunkSize = (char *)malloc (11 );
348
+ if (chunkSize){
349
+ sprintf (chunkSize, " %x%s" , size, footer);
350
+ _currentClient.write (chunkSize, strlen (chunkSize));
351
+ free (chunkSize);
352
+ }
353
+ }
320
354
_currentClient.write_P (content, size);
355
+ if (_chunked){
356
+ _currentClient.write (footer, 2 );
357
+ }
321
358
}
322
359
323
360
0 commit comments