[racket] "Streaming" gunzip-through-ports hangs?

From: Greg Hendershott (greghendershott at gmail.com)
Date: Tue Jan 22 14:57:15 EST 2013

> You may want to add a call to close-output-port after the gunzip;
> otherwise, the pipe's still open, and  blocking for additional
> content.

Doh.

Thank you!

On Tue, Jan 22, 2013 at 2:47 PM, Danny Yoo <dyoo at hashcollision.org> wrote:
> On Tue, Jan 22, 2013 at 12:40 PM, Greg Hendershott
> <greghendershott at gmail.com> wrote:
>> I'd like to take an input-port that I know has gzip encoded bytes, and
>> return a new input-port port that will return the decoded bytes. I
>> don't want to suck the entire bytes into memory. Instead I want to
>> "stream" them as-needed.
>>
>> It _seems_ like I could do this is with a combination of `make-pipe`
>> and `gunzip-through-ports`.
>>
>> But at the end, instead of getting `eof` the program hangs.
>>
>> Does anyone see what I'm doing wrong?
>
> You may want to add a call to close-output-port after the gunzip;
> otherwise, the pipe's still open, and  blocking for additional
> content.
>
> ;;;;;;;;;;;;;;
> (define (make-gzip-decoding-input-port in [limit #f])
>   (define-values (pin pout) (make-pipe limit 'gunzip-pipe 'gunzip-pipe))
>   (thread (lambda ()
>             (gunzip-through-ports in pout)
>             (close-output-port pout)))    ;; <--- here
>   pin)
> ;;;;;;;;;;;;;;
>
>
> Best of wishes!

Posted on the users mailing list.