# 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

new(app) click to toggle source

    # File lib/rack/chunked.rb, line 78
    def initialize(app)
      @app = app
    end

### Public Instance Methods

call(env) click to toggle source

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.

    # File lib/rack/chunked.rb, line 97
    def call(env)
      status, headers, body = @app.call(env)
      headers = HeaderHash[headers]

      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']
          body = TrailerBody.new(body)
        else
          body = Body.new(body)
        end
      end

      [status, headers, body]
    end

chunkable_version?(ver) click to toggle source

Whether the HTTP version supports chunked encoding (HTTP 1.1 does).

    # File lib/rack/chunked.rb, line 83
    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