class Rack::Lint::Wrapper

def check_headers(headers)

#
# === The Headers
#
def check_headers(headers)
  ## The headers must be a unfrozen Hash.
  unless headers.kind_of?(Hash)
    raise LintError, "headers object should be a hash, but isn't (got #{headers.class} as headers)"
  end
  if headers.frozen?
    raise LintError, "headers object should not be frozen, but is"
  end
  headers.each do |key, value|
    ## The header keys must be Strings.
    unless key.kind_of? String
      raise LintError, "header key must be a string, was #{key.class}"
    end
    ## Special headers starting "rack." are for communicating with the
    ## server, and must not be sent back to the client.
    next if key.start_with?("rack.")
    ## The header must not contain a +Status+ key.
    raise LintError, "header must not contain status" if key == "status"
    ## Header keys must conform to RFC7230 token specification, i.e. cannot
    ## contain non-printable ASCII, DQUOTE or "(),/:;<=>?@[\]{}".
    raise LintError, "invalid header name: #{key}" if key =~ /[\(\),\/:;<=>\?@\[\\\]{}[:cntrl:]]/
    ## Header keys must not contain uppercase ASCII characters (A-Z).
    raise LintError, "uppercase character in header name: #{key}" if key =~ /[A-Z]/
    ## Header values must be either a String instance,
    if value.kind_of?(String)
      check_header_value(key, value)
    elsif value.kind_of?(Array)
      ## or an Array of String instances,
      value.each{|value| check_header_value(key, value)}
    else
      raise LintError, "a header value must be a String or Array of Strings, but the value of '#{key}' is a #{value.class}"
    end
  end
end