class Rack::Chunked
Middleware that applies chunked transfer encoding to response bodies when the response does not include a content-length header.
This supports the trailer response header to allow the use of trailing headers in the chunked encoding. However, using this requires you manually specify a response body that supports a trailers
method. Example:
[200, { 'trailer' => 'expires'}, ["Hello", "World"]] # error raised body = ["Hello", "World"] def body.trailers { 'expires' => Time.now.to_s } end [200, { 'trailer' => 'expires'}, body] # No exception raised
Public Class Methods
Public Instance Methods
Source
# File lib/rack/chunked.rb, line 101 def call(env) status, headers, body = response = @app.call(env) if chunkable_version?(env[SERVER_PROTOCOL]) && !STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) && !headers[CONTENT_LENGTH] && !headers[TRANSFER_ENCODING] headers[TRANSFER_ENCODING] = 'chunked' if headers['trailer'] response[2] = TrailerBody.new(body) else response[2] = Body.new(body) end end response end
If the rack app returns a response that should have a body, but does not have content-length or transfer-encoding headers, modify the response to use chunked transfer-encoding.
Source
# File lib/rack/chunked.rb, line 87 def chunkable_version?(ver) case ver # pre-HTTP/1.0 (informally "HTTP/0.9") HTTP requests did not have # a version (nor response headers) when 'HTTP/1.0', nil, 'HTTP/0.9' false else true end end
Whether the HTTP version supports chunked encoding (HTTP 1.1 does).