[racket] webserver : "chunked tail no NL" error in varnish

From: Greg Hendershott (greghendershott at gmail.com)
Date: Tue Mar 11 11:53:46 EDT 2014

> The code in webserver-lib seems alright though :
> (define (output-response-body/chunked conn bresp)
>   (define-values (from-servlet to-chunker) (make-pipe))
>   (define to-client (connection-o-port conn))
>   (define to-chunker-t
>     (thread (λ ()
>               ((response-output bresp) to-chunker)
>               (close-output-port to-chunker))))
>   (define buffer (make-bytes 1024))
>   (define total-size
>     (let loop ([total-size 0])
>       (define bytes-read-or-eof
>         (read-bytes-avail! buffer from-servlet))
>       (if (eof-object? bytes-read-or-eof)
>         total-size
>         (begin
>           (fprintf to-client "~a\r\n" (number->string bytes-read-or-eof 16))
>           (write-bytes buffer to-client 0 bytes-read-or-eof)
>           (fprintf to-client "\r\n")
>           (loop (+ total-size bytes-read-or-eof))))))
>   (thread-wait to-chunker-t)
>   (fprintf to-client "0\r\n")
>   (print-headers
>    to-client
>    (list (header #"Content-Length"
>                  (string->bytes/utf-8 (number->string total-size)))))
>   (flush-output to-client))

Apologies in advance if I'm confused, but I'm not sure that the
`print-headers` near the end is correct.

My understanding:

1. Trailing headers should only be sent if there was a TE request
header (I don't see that checked for.)

2. Trailing headers should be listed in a Trailer response header (I
don't see one sent here.)

3. A few headers "MUST NOT" be trailing headers: Trailer,
Transfer-Encoding, and Content-Length (but the last _is_ sent here).

Source: http://tools.ietf.org/html/rfc2616#section-14.40

Assuming that's correct the `(print-headers ... #"Content-Length"
...)` should simply be deleted, I think?

Maybe the trailing Content-Length header is what Varnish is being strict about.

I haven't studied web-server code, so again, apologies if I'm misunderstanding!

Posted on the users mailing list.