sig
  type dict
  module Dict :
    sig
      type 'a key
      val key : unit -> 'Webs.Dict.key
      type t = Webs.dict
      val empty : Webs.dict
      val is_empty : Webs.dict -> bool
      val mem : 'Webs.Dict.key -> Webs.dict -> bool
      val add : 'Webs.Dict.key -> '-> Webs.dict -> Webs.dict
      val rem : 'Webs.Dict.key -> Webs.dict -> Webs.dict
      val find : 'Webs.Dict.key -> Webs.dict -> 'a option
      val get : 'Webs.Dict.key -> Webs.dict -> 'a
    end
  type req
  type resp
  type service = Webs.req -> Webs.resp
  type layer = Webs.service -> Webs.service
  module HTTP :
    sig
      type version = int * int
      val decode_version : string -> Webs.HTTP.version option
      val encode_version : Webs.HTTP.version -> string
      val pp_version : Format.formatter -> Webs.HTTP.version -> unit
      type meth =
          [ `CONNECT
          | `DELETE
          | `GET
          | `HEAD
          | `OPTIONS
          | `Other of string
          | `PATCH
          | `POST
          | `PUT
          | `TRACE ]
      val decode_meth : string -> Webs.HTTP.meth option
      val encode_meth : Webs.HTTP.meth -> string
      val pp_meth : Format.formatter -> Webs.HTTP.meth -> unit
      type headers
      val pp_headers : Format.formatter -> Webs.HTTP.headers -> unit
      module H :
        sig
          type name
          val name : string -> Webs.HTTP.H.name
          val name_equal : Webs.HTTP.H.name -> Webs.HTTP.H.name -> bool
          val decode_name : string -> Webs.HTTP.H.name option
          val encode_name : Webs.HTTP.H.name -> string
          val pp_name : Format.formatter -> Webs.HTTP.H.name -> unit
          val empty : Webs.HTTP.headers
          val is_empty : Webs.HTTP.headers -> bool
          val is_def : Webs.HTTP.H.name -> Webs.HTTP.headers -> bool
          val undef :
            Webs.HTTP.H.name -> Webs.HTTP.headers -> Webs.HTTP.headers
          val def :
            Webs.HTTP.H.name ->
            string -> Webs.HTTP.headers -> Webs.HTTP.headers
          val redef :
            Webs.HTTP.H.name ->
            (string option -> string option) ->
            Webs.HTTP.headers -> Webs.HTTP.headers
          val def_if_undef :
            Webs.HTTP.H.name ->
            string -> Webs.HTTP.headers -> Webs.HTTP.headers
          val find : Webs.HTTP.H.name -> Webs.HTTP.headers -> string option
          val get : Webs.HTTP.H.name -> Webs.HTTP.headers -> string
          val def_multi :
            Webs.HTTP.H.name ->
            string list -> Webs.HTTP.headers -> Webs.HTTP.headers
          val redef_multi :
            Webs.HTTP.H.name ->
            (string list option -> string list option) ->
            Webs.HTTP.headers -> Webs.HTTP.headers
          val def_if_undef_multi :
            Webs.HTTP.H.name ->
            string list -> Webs.HTTP.headers -> Webs.HTTP.headers
          val find_multi :
            Webs.HTTP.H.name -> Webs.HTTP.headers -> string list option
          val get_multi :
            Webs.HTTP.H.name -> Webs.HTTP.headers -> string list
          val fold :
            (Webs.HTTP.H.name -> string list -> '-> 'a) ->
            Webs.HTTP.headers -> '-> 'a
          val iter :
            (Webs.HTTP.H.name -> string list -> unit) ->
            Webs.HTTP.headers -> unit
          val for_all :
            (Webs.HTTP.H.name -> string list -> bool) ->
            Webs.HTTP.headers -> bool
          val exists :
            (Webs.HTTP.H.name -> string list -> bool) ->
            Webs.HTTP.headers -> bool
          val keep_if :
            (Webs.HTTP.H.name -> string list -> bool) ->
            Webs.HTTP.headers -> Webs.HTTP.headers
          val partition :
            (Webs.HTTP.H.name -> string list -> bool) ->
            Webs.HTTP.headers -> Webs.HTTP.headers * Webs.HTTP.headers
          val bindings :
            Webs.HTTP.headers -> (Webs.HTTP.H.name * string list) list
          val cardinal : Webs.HTTP.headers -> int
          val decode_multi_value : string -> string list
          val encode_multi_value : string list -> string
          val accept : Webs.HTTP.H.name
          val accept_charset : Webs.HTTP.H.name
          val accept_encoding : Webs.HTTP.H.name
          val accept_language : Webs.HTTP.H.name
          val accept_ranges : Webs.HTTP.H.name
          val age : Webs.HTTP.H.name
          val allow : Webs.HTTP.H.name
          val authorization : Webs.HTTP.H.name
          val cache_control : Webs.HTTP.H.name
          val connection : Webs.HTTP.H.name
          val content_encoding : Webs.HTTP.H.name
          val content_language : Webs.HTTP.H.name
          val content_length : Webs.HTTP.H.name
          val content_location : Webs.HTTP.H.name
          val content_range : Webs.HTTP.H.name
          val content_type : Webs.HTTP.H.name
          val cookie : Webs.HTTP.H.name
          val date : Webs.HTTP.H.name
          val etag : Webs.HTTP.H.name
          val expect : Webs.HTTP.H.name
          val expires : Webs.HTTP.H.name
          val from : Webs.HTTP.H.name
          val host : Webs.HTTP.H.name
          val if_match : Webs.HTTP.H.name
          val if_modified_since : Webs.HTTP.H.name
          val if_none_match : Webs.HTTP.H.name
          val if_range : Webs.HTTP.H.name
          val if_unmodified_since : Webs.HTTP.H.name
          val last_modified : Webs.HTTP.H.name
          val location : Webs.HTTP.H.name
          val max_forwards : Webs.HTTP.H.name
          val pragma : Webs.HTTP.H.name
          val proxy_authenticate : Webs.HTTP.H.name
          val proxy_authorization : Webs.HTTP.H.name
          val range : Webs.HTTP.H.name
          val referer : Webs.HTTP.H.name
          val retry_after : Webs.HTTP.H.name
          val server : Webs.HTTP.H.name
          val set_cookie : Webs.HTTP.H.name
          val te : Webs.HTTP.H.name
          val trailer : Webs.HTTP.H.name
          val transfer_encoding : Webs.HTTP.H.name
          val upgrade : Webs.HTTP.H.name
          val user_agent : Webs.HTTP.H.name
          val vary : Webs.HTTP.H.name
          val via : Webs.HTTP.H.name
          val warning : Webs.HTTP.H.name
          val www_authenticate : Webs.HTTP.H.name
        end
      type status = int
      val status_reason_phrase : Webs.HTTP.status -> string
      val pp_status : Format.formatter -> Webs.HTTP.status -> unit
      val s100_continue : Webs.HTTP.status
      val s101_switching_protocols : Webs.HTTP.status
      val s200_ok : Webs.HTTP.status
      val s201_created : Webs.HTTP.status
      val s202_accepted : Webs.HTTP.status
      val s203_non_authoritative_information : Webs.HTTP.status
      val s204_no_content : Webs.HTTP.status
      val s205_reset_content : Webs.HTTP.status
      val s206_partial_content : Webs.HTTP.status
      val s300_multiple_choices : Webs.HTTP.status
      val s301_moved_permanently : Webs.HTTP.status
      val s302_found : Webs.HTTP.status
      val s303_see_other : Webs.HTTP.status
      val s304_not_modified : Webs.HTTP.status
      val s305_use_proxy : Webs.HTTP.status
      val s307_temporary_redirect : Webs.HTTP.status
      val s400_bad_request : Webs.HTTP.status
      val s401_unauthorized : Webs.HTTP.status
      val s402_payement_required : Webs.HTTP.status
      val s403_forbidden : Webs.HTTP.status
      val s404_not_found : Webs.HTTP.status
      val s405_not_allowed : Webs.HTTP.status
      val s406_not_acceptable : Webs.HTTP.status
      val s407_proxy_authentication_required : Webs.HTTP.status
      val s408_request_time_out : Webs.HTTP.status
      val s409_conflict : Webs.HTTP.status
      val s410_gone : Webs.HTTP.status
      val s411_length_required : Webs.HTTP.status
      val s412_precondition_failed : Webs.HTTP.status
      val s413_payload_too_large : Webs.HTTP.status
      val s414_uri_too_long : Webs.HTTP.status
      val s415_unsupported_media_type : Webs.HTTP.status
      val s416_range_not_satisfiable : Webs.HTTP.status
      val s417_expectation_failed : Webs.HTTP.status
      val s426_upgrade_required : Webs.HTTP.status
      val s500_server_error : Webs.HTTP.status
      val s501_not_implemented : Webs.HTTP.status
      val s502_bad_gateway : Webs.HTTP.status
      val s503_service_unavailable : Webs.HTTP.status
      val s504_gateway_time_out : Webs.HTTP.status
      val s505_http_version_not_supported : Webs.HTTP.status
      type path = string list
      val decode_path : string -> Webs.HTTP.path option
      val encode_path : Webs.HTTP.path -> string
      val pp_path :
        ?human:bool -> unit -> Format.formatter -> Webs.HTTP.path -> unit
      val decode_digits : string -> int option
      val encode_digits : int -> string
      val is_token : string -> bool
    end
  module Req :
    sig
      type body = unit -> (bytes * int * int) option
      type t = Webs.req
      val v :
        ?dict:Webs.dict ->
        Webs.HTTP.version ->
        Webs.HTTP.meth ->
        path:Webs.HTTP.path ->
        ?query:string ->
        Webs.HTTP.headers -> ?body_len:int -> Webs.Req.body -> Webs.req
      val version : Webs.req -> Webs.HTTP.version
      val meth : Webs.req -> Webs.HTTP.meth
      val path : Webs.req -> Webs.HTTP.path
      val query : Webs.req -> string option
      val headers : Webs.req -> Webs.HTTP.headers
      val dict : Webs.req -> Webs.dict
      val body_len : Webs.req -> int option
      val body : Webs.req -> Webs.Req.body
      val with_headers : Webs.req -> Webs.HTTP.headers -> Webs.req
      val with_body :
        Webs.req -> body_len:int option -> Webs.Req.body -> Webs.req
      val with_path : Webs.req -> Webs.HTTP.path -> Webs.req
      val with_dict : Webs.req -> Webs.dict -> Webs.req
      val pp : Format.formatter -> Webs.req -> unit
    end
  module Resp :
    sig
      type consumer = (bytes * int * int) option -> unit
      type body =
          Stream of (Webs.Resp.consumer -> unit)
        | File of (int * int) option * string
      val stream_body : (Webs.Resp.consumer -> unit) -> Webs.Resp.body
      val string_body : string -> Webs.Resp.body
      val empty_body : Webs.Resp.body
      val file_body : ?range:int * int -> string -> Webs.Resp.body
      val pp_body : Format.formatter -> Webs.Resp.body -> unit
      type t = Webs.resp
      val v :
        ?version:Webs.HTTP.version ->
        Webs.HTTP.status -> Webs.HTTP.headers -> Webs.Resp.body -> Webs.resp
      val version : Webs.resp -> Webs.HTTP.version
      val status : Webs.resp -> Webs.HTTP.status
      val headers : Webs.resp -> Webs.HTTP.headers
      val body : Webs.resp -> Webs.Resp.body
      val with_status : Webs.resp -> Webs.HTTP.status -> Webs.resp
      val with_headers : Webs.resp -> Webs.HTTP.headers -> Webs.resp
      val with_body : Webs.resp -> Webs.Resp.body -> Webs.resp
      val pp : Format.formatter -> Webs.resp -> unit
    end
  module Connector :
    sig
      type error =
          [ `Connector of Rresult.R.msg
          | `Service of Rresult.R.exn_trap
          | `Webserver of Rresult.R.msg ]
      type conf = Webs.Dict.t
      type t =
          Webs.Connector.conf ->
          Webs.service -> (unit, Webs.Connector.error) Rresult.result
      val sendfile_header : string Webs.Dict.key
      val service_exn_log : Format.formatter Webs.Dict.key
      val pp_error : Format.formatter -> Webs.Connector.error -> unit
      val open_error :
        ('a, Webs.Connector.error) Rresult.result ->
        ('a, [> Webs.Connector.error ]) Rresult.result
      val error_to_msg :
        ('a, Webs.Connector.error) Rresult.result ->
        ('a, Rresult.R.msg) Rresult.result
    end
  type connector = Webs.Connector.t
end