type t

module Body : sig
  type t

  val empty : t
  val of_string : string -> t

  val make :
     Cohttp.Transfer.encoding
    -> ((string -> unit Lwt.t) -> unit Lwt.t)
    -> t
  (** [make writer] makes a reponse body whose content is generated by
      [writer write]. [write str] blocks until [str] is fully written. *)

  val of_cohttp : encoding:Cohttp.Transfer.encoding -> Cohttp_lwt.Body.t -> t
  val write : t -> (string -> unit Lwt.t) -> unit Lwt.t
  val transfer_encoding : t -> Cohttp.Transfer.encoding
end

val make :
   ?body:Body.t
  -> ?cookies:Ocsigen_cookie_map.t
  -> Cohttp.Response.t
  -> t
(** Make a response from a [Cohttp.Response.t]. Note that the
    [transfer-encoding] header is not taken into account if it is set to
    [chunked], use {!add_header}. This is because [Cohttp.Response.make] sets
    this header by default, which interferes with the transfer-encoding carried
    by the [body]. *)

val respond :
   ?headers:Cohttp.Header.t
  -> status:Http.Status.t
  -> ?body:Body.t
  -> unit
  -> t
(** Like [make] but with an interface similar to
    [Cohttp_lwt_unix.Server.respond]. *)

val respond_string :
   ?headers:Cohttp.Header.t
  -> status:Http.Status.t
  -> body:string
  -> unit
  -> t
(** Like [respond] but with a fixed string body. *)

val respond_error :
   ?headers:Cohttp.Header.t
  -> ?status:Http.Status.t
  -> body:string
  -> unit
  -> t
(** Like [respond_string] with ["Error: "] appended to the body. The default
    status is [`Internal_server_error].

    @deprecated Use [respond_string] with a [~status] argument instead. *)

val respond_file :
   ?headers:Cohttp.Header.t
  -> ?status:Http.Status.t
  -> string
  -> t Lwt.t
(** Respond with the content of a file. The content type is guessed using
    [Magic_mime]. *)

val update :
   ?response:Cohttp.Response.t
  -> ?body:Body.t
  -> ?cookies:Ocsigen_cookie_map.t
  -> t
  -> t

val of_cohttp :
   ?cookies:Ocsigen_cookie_map.t
  -> Cohttp.Response.t * Cohttp_lwt.Body.t
  -> t

val to_response_expert :
   t
  -> Cohttp.Response.t * ('ic -> Lwt_io.output_channel -> unit Lwt.t)
(** Response for [Cohttp_lwt_unix.Server.make_expert]. Set cookie headers. *)

val response : t -> Cohttp.Response.t
(** Raw response without cookie headers set. *)

val body : t -> Body.t
val status : t -> Cohttp.Code.status
val set_status : t -> Cohttp.Code.status -> t
val cookies : t -> Ocsigen_cookie_map.t
val add_cookies : t -> Ocsigen_cookie_map.t -> t
val header : t -> Ocsigen_header.Name.t -> string option
val header_multi : t -> Ocsigen_header.Name.t -> string list
val add_header : t -> Ocsigen_header.Name.t -> string -> t
val add_header_multi : t -> Ocsigen_header.Name.t -> string list -> t
val replace_header : t -> Ocsigen_header.Name.t -> string -> t
val replace_headers : t -> (Ocsigen_header.Name.t * string) list -> t
val remove_header : t -> Ocsigen_header.Name.t -> t
