Hi Chris,

On 21 Jul 2012, at 17:52, Chris <[email protected]> wrote:

> On 20/07/2012 18:30, Sven Van Caekenberghe wrote:
>> On 20 Jul 2012, at 18:22, Chris wrote:
>> 
>>> Thanks for that. I'm actually still having a bit of trouble when the file 
>>> is bigger than the chunk size. 
>>> ZnChunkedReadStream>>#readInto:startingAt:count: uses a limit variable 
>>> which is bigger than the collection and requestedCount.
>> I won't be able to do anything until the beginning of August.
>> 
>> It would be really helpful if you could provide me with an actual test case 
>> that fails.
> 
> Okay thanks Sven, I'll see what I can do. I am just working with a third 
> party server which is sending chunks of 1mb (which I assume is valid) and I 
> think Zinc just needs to support chunks bigger than the 16k in the above 
> method
> 
> Regards,
> Chris

The 16K buffer used in ZnUtils>>#streamFrom:to:[size:] is independent from the 
chunk buffer used in ZnChunkedReadStream, BUT you did find a serious problem. 
Actually the code of ZnChunkedReadStream>>#readInto:startingAt:count: was 
embarrassingly bad and wrong although it did work in all cases thrown to it up 
until now.

I added an extra test for the case where the buffer being used is smaller than 
the chunk size:

ZnChunkedReadStream>>#testReadingBuffered
        | data chunked plain buffer readStream |
        data := String withAll: ($a to: $z), ($A to: $Z).
        chunked := String streamContents: [ :stream |
                ZnUtils nextPutAll: data on: stream chunked: 16 ].
        readStream := ZnChunkedReadStream on: chunked readStream.
        buffer := String new: 11.
        plain := String streamContents: [ :output | | readCount |
                [ readStream atEnd ] whileFalse: [
                        readCount := readStream readInto: buffer startingAt: 1 
count: buffer size.
                        output next: readCount putAll: buffer ] ].
        self assert: plain equals: data

As usual, load the latest code to get the fix. I hope it now works for your 
particular case.

Thanks again for reporting this, being persistent about it and for pointing me 
in the right direction !

Regards,

Sven

Here are the actual commits:

===
Name: Zinc-HTTP-SvenVanCaekenberghe.291
Author: SvenVanCaekenberghe
Time: 2 August 2012, 11:26:02 am
UUID: 3d8c50cd-2d7b-459f-89f3-b77a23dccfdd
Ancestors: Zinc-HTTP-SvenVanCaekenberghe.290

various fixes to ZnChunkedReadStream>>#readInto:startingAt:count: (thx Chris 
Bailey for reporting the problem);
added ZnLimitedReadStream>>#nextInto: as it is used by Fuel
===
Name: Zinc-Tests-SvenVanCaekenberghe.151
Author: SvenVanCaekenberghe
Time: 2 August 2012, 11:27:58 am
UUID: 3da15e83-c0ca-4066-a496-71d91393db01
Ancestors: Zinc-Tests-SvenVanCaekenberghe.150

added new ZnChunkedReadStreamTests>>#testReadingBuffered to validate various 
fixes to ZnChunkedReadStream>>#readInto:startingAt:count: (thx Chris Bailey for 
reporting the problem)
===

--
Sven Van Caekenberghe
http://stfx.eu
Smalltalk is the Red Pill



Reply via email to