class Rack::Lint

def check_hijack_response(headers, env)

# have been sent.
# It is also possible to hijack a response after the status and headers
# ==== Response (after headers)
def check_hijack_response(headers, env)
  # this check uses headers like a hash, but the spec only requires
  # headers respond to #each
  headers = Rack::Utils::HeaderHash[headers]
  ## In order to do this, an application may set the special header
  ## <tt>rack.hijack</tt> to an object that responds to <tt>call</tt>
  ## accepting an argument that conforms to the <tt>rack.hijack_io</tt>
  ## protocol.
  ##
  ## After the headers have been sent, and this hijack callback has been
  ## called, the application is now responsible for the remaining lifecycle
  ## of the IO. The application is also responsible for maintaining HTTP
  ## semantics. Of specific note, in almost all cases in the current SPEC,
  ## applications will have wanted to specify the header Connection:close in
  ## HTTP/1.1, and not Connection:keep-alive, as there is no protocol for
  ## returning hijacked sockets to the web server. For that purpose, use the
  ## body streaming API instead (progressively yielding strings via each).
  ##
  ## Servers must ignore the <tt>body</tt> part of the response tuple when
  ## the <tt>rack.hijack</tt> response API is in use.
  if env[RACK_IS_HIJACK] && headers[RACK_HIJACK]
    assert('rack.hijack header must respond to #call') {
      headers[RACK_HIJACK].respond_to? :call
    }
    original_hijack = headers[RACK_HIJACK]
    proc do |io|
      original_hijack.call HijackWrapper.new(io)
    end
  else
    ##
    ## The special response header <tt>rack.hijack</tt> must only be set
    ## if the request env has <tt>rack.hijack?</tt> <tt>true</tt>.
    assert('rack.hijack header must not be present if server does not support hijacking') {
      headers[RACK_HIJACK].nil?
    }
    nil
  end
end