class Rack::Lint

def check_hijack(env)

# ==== Request (before status)

output.
should not be removed. The whitespace creates paragraphs in the RDoc
AUTHORS: n.b. The trailing whitespace between paragraphs is important and

# === Hijacking
def check_hijack(env)
  if env[RACK_IS_HIJACK]
    ## If rack.hijack? is true then rack.hijack must respond to #call.
    original_hijack = env[RACK_HIJACK]
    raise LintError, "rack.hijack must respond to call" unless original_hijack.respond_to?(:call)
    env[RACK_HIJACK] = proc do
      ## rack.hijack must return the io that will also be assigned (or is
      ## already present, in rack.hijack_io.
      io = original_hijack.call
      HijackWrapper.new(io)
      ##
      ## rack.hijack_io must respond to:
      ## <tt>read, write, read_nonblock, write_nonblock, flush, close,
      ## close_read, close_write, closed?</tt>
      ##
      ## The semantics of these IO methods must be a best effort match to
      ## those of a normal ruby IO or Socket object, using standard
      ## arguments and raising standard exceptions. Servers are encouraged
      ## to simply pass on real IO objects, although it is recognized that
      ## this approach is not directly compatible with SPDY and HTTP 2.0.
      ##
      ## IO provided in rack.hijack_io should preference the
      ## IO::WaitReadable and IO::WaitWritable APIs wherever supported.
      ##
      ## There is a deliberate lack of full specification around
      ## rack.hijack_io, as semantics will change from server to server.
      ## Users are encouraged to utilize this API with a knowledge of their
      ## server choice, and servers may extend the functionality of
      ## hijack_io to provide additional features to users. The purpose of
      ## rack.hijack is for Rack to "get out of the way", as such, Rack only
      ## provides the minimum of specification and support.
      env[RACK_HIJACK_IO] = HijackWrapper.new(env[RACK_HIJACK_IO])
      io
    end
  else
    ##
    ## If rack.hijack? is false, then rack.hijack should not be set.
    raise LintError, "rack.hijack? is false, but rack.hijack is present" unless env[RACK_HIJACK].nil?
    ##
    ## If rack.hijack? is false, then rack.hijack_io should not be set.
    raise LintError, "rack.hijack? is false, but rack.hijack_io is present" unless env[RACK_HIJACK_IO].nil?
  end
end