RFC7233 HTTP Ranges support for server
authorAndy Green <andy@warmcat.com>
Mon, 12 Dec 2016 05:36:25 +0000 (13:36 +0800)
committerAndy Green <andy@warmcat.com>
Tue, 20 Dec 2016 06:37:07 +0000 (14:37 +0800)
commited4acef481a402a8a34e2a523f8bd434b9064da9
tree93aea9f45cf5a7510da134d53ad68a46e62335a0
parentfdddf5af51ee00d9dc486a7206d77dc746eb534e
RFC7233 HTTP Ranges support for server

This adds a serverside implementation of RFC7233 HTTP ranges.

 - LWS_WITH_RANGES is on by default at cmake

 - Accept-Ranges: bytes is added if LWS_WITH_RANGES is enabled

 - Both single ranges and multipart (2+) ranges are supported

Test with curl like this

Single

$ $ curl -s -r 64-95  http://localhost:7681/libwebsockets.org-logo.png  | hexdump -C
00000000  2e 01 fd 9d 12 27 00 00  00 19 74 45 58 74 53 6f  |.....'....tEXtSo|
00000010  66 74 77 61 72 65 00 77  77 77 2e 69 6e 6b 73 63  |ftware.www.inksc|

Multipart

$ curl -s -r 64-95,128-143  http://localhost:7681/libwebsockets.org-logo.png  | hexdump -C

00000000  5f 6c 77 73 0d 0a 43 6f  6e 74 65 6e 74 2d 54 79  |_lws..Content-Ty|
00000010  70 65 3a 20 69 6d 61 67  65 2f 70 6e 67 0d 0a 43  |pe: image/png..C|
00000020  6f 6e 74 65 6e 74 2d 52  61 6e 67 65 3a 20 62 79  |ontent-Range: by|
00000030  74 65 73 20 36 34 2d 39  35 2f 37 30 32 39 0d 0a  |tes 64-95/7029..|
00000040  0d 0a 2e 01 fd 9d 12 27  00 00 00 19 74 45 58 74  |.......'....tEXt|
00000050  53 6f 66 74 77 61 72 65  00 77 77 77 2e 69 6e 6b  |Software.www.ink|
00000060  73 63 5f 6c 77 73 0d 0a  43 6f 6e 74 65 6e 74 2d  |sc_lws..Content-|
00000070  54 79 70 65 3a 20 69 6d  61 67 65 2f 70 6e 67 0d  |Type: image/png.|
00000080  0a 43 6f 6e 74 65 6e 74  2d 52 61 6e 67 65 3a 20  |.Content-Range: |
00000090  62 79 74 65 73 20 31 32  38 2d 31 34 33 2f 37 30  |bytes 128-143/70|
000000a0  32 39 0d 0a 0d 0a 05 14  50 40 05 15 a5 c4 60 43  |29......P@....`C|
000000b0  91 c4 4a d4 c4 fc 5f 6c  77 73 0d 00              |..J..._lws..|

The corresponding header part is like this

0x0030:            4854 5450 2f31 2e31 2032 3036      HTTP/1.1.206
0x0040:  200d 0a73 6572 7665 723a 206c 7773 7773  ...server:.lwsws
0x0050:  0d0a 636f 6e74 656e 742d 7479 7065 3a20  ..content-type:.
0x0060:  6d75 6c74 6970 6172 742f 6279 7465 7261  multipart/bytera
0x0070:  6e67 6573 0d0a 6163 6365 7074 2d72 616e  nges..accept-ran
0x0080:  6765 733a 2062 7974 6573 0d0a 636f 6e74  ges:.bytes..cont
0x0090:  656e 742d 6c65 6e67 7468 3a20 3138 380d  ent-length:.188.
0x00a0:  0a63 6163 6865 2d63 6f6e 7472 6f6c 3a20  .cache-control:.
0x00b0:  7072 6976 6174 6520 6d61 782d 6167 653a  private.max-age:
0x00c0:  2036 300d 0a63 6f6e 6e65 6374 696f 6e3a  .60..connection:
0x00d0:  206b 6565 702d 616c 6976 650d 0a65 7461  .keep-alive..eta
0x00e0:  673a 2030 3030 3031 4237 3535 3444 3433  g:.00001B7554D43
0x00f0:  3033 330d 0a0d 0a                        033....
20 files changed:
CMakeLists.txt
doc/html/group__form-parsing.html
doc/html/group__html-chunked-substitution.html
doc/html/group__sending-data.html
doc/html/group__smtp.html
doc/html/libwebsockets_8h.html
doc/html/libwebsockets_8h.js
doc/html/libwebsockets_8h_source.html
doc/html/navtreedata.js
doc/html/navtreeindex0.js
doc/html/navtreeindex1.js
doc/html/navtreeindex2.js
doc/html/navtreeindex3.js
doc/html/navtreeindex4.js
lib/libwebsockets.h
lib/output.c
lib/private-libwebsockets.h
lib/ranges.c [new file with mode: 0644]
lib/server.c
lws_config.h.in