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)))