Skip to content

Commit 54a5bb4

Browse files
authored
Fix ContentLengthReader. (#136)
1 parent d1aba5a commit 54a5bb4

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

src/connection.toit

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ class ContentLengthReader extends ContentLengthReader_:
301301
class ContentLengthReader_ extends io.Reader:
302302
connection_/Connection
303303
reader_/io.Reader
304+
read-from-wrapped_/int := 0
304305

305306
content-size/int
306307

@@ -313,13 +314,14 @@ class ContentLengthReader_ extends io.Reader:
313314
return content-size
314315

315316
read_ -> ByteArray?:
316-
if processed >= content-size:
317+
if read-from-wrapped_ >= content-size:
317318
connection_.reading_done_ this
318319
return null
319320
data := reader_.read --max_size=(content-size - processed)
320321
if not data:
321322
connection_.close
322323
throw io.Reader.UNEXPECTED_END_OF_READER
324+
read-from-wrapped_ += data.size
323325
return data
324326

325327
/**
@@ -363,14 +365,17 @@ class ContentLengthWriter_ extends io.CloseableWriter implements BodyWriter:
363365
connection_/Connection? := null
364366
writer_/io.Writer
365367
content_length_/int := ?
368+
written-to-wrapped_/int := 0
366369

367370
constructor .connection_ .writer_ .content_length_:
368371

369372
is_done -> bool:
370-
return processed >= content_length_
373+
return written-to-wrapped_ >= content_length_
371374

372375
try_write_ data/io.Data from/int to/int -> int:
373-
return writer_.try_write data from to
376+
result := writer_.try_write data from to
377+
written-to-wrapped_ += result
378+
return result
374379

375380
close_ -> none:
376381
if connection_:

tests/http_standalone_test.toit

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,32 @@ run_client network port/int -> none:
8383
expect_json response:
8484
expect_equals 123 it["foo"]
8585

86-
response := client.get --uri="http://localhost:$port/redirect_back"
86+
// Try to buffer the whole response.
87+
response := client.get --host="localhost" --port=port --path="/foo.json"
88+
expect_equals 200 response.status_code
89+
response.body.buffer-all
90+
bytes := response.body.read-all
91+
decoded := json.decode bytes
92+
expect_equals 123 decoded["foo"]
93+
94+
response = client.get --uri="http://localhost:$port/content-length.json"
95+
expect_equals 200 response.status_code
96+
expect_equals "application/json"
97+
response.headers.single "Content-Type"
98+
content-length := response.headers.single "Content-Length"
99+
expect_not_null content-length
100+
expect_json response:
101+
expect_equals 123 it["foo"]
102+
103+
// Try to buffer the whole response.
104+
response = client.get --uri="http://localhost:$port/content-length.json"
105+
expect_equals 200 response.status_code
106+
response.body.buffer-all
107+
bytes = response.body.read-all
108+
decoded = json.decode bytes
109+
expect_equals 123 decoded["foo"]
110+
111+
response = client.get --uri="http://localhost:$port/redirect_back"
87112
expect connection != client.connection_ // Because of the redirect we had to make a new connection.
88113
expect_equals "application/json"
89114
response.headers.single "Content-Type"
@@ -256,6 +281,11 @@ listen server server_socket my_port other_port:
256281
response_writer.headers.set "Content-Type" "application/json"
257282
writer.write
258283
json.encode {"foo": 123, "bar": 1.0/3, "fizz": [1, 42, 103]}
284+
else if resource == "/content-length.json":
285+
data := json.encode {"foo": 123, "bar": 1.0/3, "fizz": [1, 42, 103]}
286+
response_writer.headers.set "Content-Type" "application/json"
287+
response_writer.headers.set "Content-Length" "$data.size"
288+
writer.write data
259289
else if resource == "/cat.png":
260290
response_writer.headers.set "Content-Type" "image/png"
261291
writer.write CAT

0 commit comments

Comments
 (0)