module WEBrick

class HTTPResponse
  @buffer_size: Integer

  @logger: Log

  @chunked: bool

  @bodytempfile: File | Tempfile | nil

  class InvalidHeader < StandardError
  end

  attr_reader http_version: HTTPVersion

  attr_reader status: Integer

  attr_reader header: Hash[String, String]

  attr_reader cookies: Array[Cookie]

  attr_accessor reason_phrase: String

  interface _CallableBody
    def call: (_Writer) -> void
  end

  attr_accessor body: String | _ReaderPartial | _CallableBody

  attr_accessor request_method: String?

  attr_accessor request_uri: URI::Generic?

  attr_accessor request_http_version: HTTPVersion?

  attr_accessor filename: String?

  attr_accessor keep_alive: bool

  attr_reader config: Hash[Symbol, untyped]

  attr_reader sent_size: Integer

  attr_accessor upgrade: String?

  def initialize: (Hash[Symbol, untyped] config) -> void

  def status_line: () -> String

  def status=: (Integer status) -> Integer

  def []: (String field) -> String?

  def []=: (String field, _ToS value) -> _ToS

  def content_length: () -> Integer?

  def content_length=: (Integer len) -> Integer

  def content_type: () -> String?

  def content_type=: (String type) -> String

  def each: () { (String, String) -> void } -> void

  def chunked?: () -> bool

  def chunked=: (boolish val) -> boolish

  def keep_alive?: () -> bool

  def upgrade!: (String protocol) -> void

  def send_response: (_Writer socket) -> void

  def setup_header: () -> void

  def make_body_tempfile: () -> void

  def remove_body_tempfile: () -> void

  def send_header: (_Writer socket) -> void

  def send_body: (_Writer socket) -> void

  def set_redirect: (singleton(WEBrick::HTTPStatus::Redirect) status, URI::Generic | String url) -> bot

  def set_error: (singleton(Exception) ex, ?bool backtrace) -> void

  private

  def check_header: (_ToS header_value) -> String

  def error_body: (bool backtrace, singleton(Exception) ex, String? host, Integer? port) -> void

  def send_body_io: (_Writer socket) -> void

  def send_body_string: (_Writer socket) -> void

  def send_body_proc: (_Writer socket) -> void

  class ChunkedWrapper
    @socket: _Writer

    @resp: HTTPResponse

    def initialize: (_Writer socket, HTTPResponse resp) -> void

    def write: (_ToS buf) -> Integer

    def <<: (*_ToS buf) -> self
  end

  # preserved for compatibility with some 3rd-party handlers
  def _write_data: [T] (T socket, _ToS data) -> T
end

end