Mercurial > repos > tabletprog
changeset 159:d81de309a51f
Add support for chunked encoding to HTTP client
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 10 Aug 2013 15:51:31 -0700 |
parents | 38140b7dbe3d |
children | 729dc894e61c |
files | modules/http.tp |
diffstat | 1 files changed, 34 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/modules/http.tp Sat Aug 10 15:20:38 2013 -0700 +++ b/modules/http.tp Sat Aug 10 15:51:31 2013 -0700 @@ -1,4 +1,6 @@ { + parseHex <- :text { + } response <- :_headers _status _sock _data { _open? <- true _body <- "" @@ -12,7 +14,38 @@ body <- { if: _open? { if: _chunked? { - + chunkSize <- 0 + while: { + canReceive <- true + while: { + pos <- _data find: "\r\n" else: { -1 } + if: pos >= 0 { + chunkSize <- (_data from: 0 withLength: pos) parseHex32 + _data <- _data from: pos + 2 + false + } else: { + canReceive + } + } do: { + r <- (_sock recv: 4096) + if: (r length) > 0 { + _data <- _data . r + } else: { + canReceive <- false + } + } + chunkSize > 0 + } do: { + while: { (_data length) < chunkSize } do: { + r <- _sock recv: 4096 + if: (r length) > 0 { + _data <- _data . r + } else: { + chunkSize <- _data length + } + } + _body <- _body . (_data from: 0 withLength: chunkSize) + } } else: { if: _length >= 0 { _body <- _data . (_sock recvAll: (_length - (_data byte_length)))