sig
  type readyState = UNSENT | OPENED | HEADERS_RECEIVED | LOADING | DONE
  type _ response =
      ArrayBuffer :
        Typed_array.arrayBuffer Js.t Js.Opt.t XmlHttpRequest.response
    | Blob : #File.blob Js.t Js.Opt.t XmlHttpRequest.response
    | Document :
        Dom.element Dom.document Js.t Js.Opt.t XmlHttpRequest.response
    | JSON : 'Js.Opt.t XmlHttpRequest.response
    | Text : Js.js_string Js.t XmlHttpRequest.response
    | Default : string XmlHttpRequest.response
  class type xmlHttpRequest =
    object ('a)
      method _open :
        Js.js_string Js.t -> Js.js_string Js.t -> bool Js.t -> unit Js.meth
      method _open_full :
        Js.js_string Js.t ->
        Js.js_string Js.t ->
        bool Js.t ->
        Js.js_string Js.t Js.opt -> Js.js_string Js.t Js.opt -> unit Js.meth
      method abort : unit Js.meth
      method getAllResponseHeaders : Js.js_string Js.t Js.meth
      method getResponseHeader :
        Js.js_string Js.t -> Js.js_string Js.t Js.opt Js.meth
      method onabort :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onerror :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onload :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onloadend :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onloadstart :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onprogress :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onreadystatechange :
        (unit -> unit) Js.callback Js.writeonly_prop
      method ontimeout :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method overrideMimeType : Js.js_string Js.t -> unit Js.meth
      method readyState : XmlHttpRequest.readyState Js.readonly_prop
      method response : File.file_any Js.readonly_prop
      method responseText : Js.js_string Js.t Js.readonly_prop
      method responseType : Js.js_string Js.t Js.prop
      method responseXML :
        Dom.element Dom.document Js.t Js.opt Js.readonly_prop
      method send : Js.js_string Js.t Js.opt -> unit Js.meth
      method send_blob : #File.blob Js.t -> unit Js.meth
      method send_document : Dom.element Dom.document Js.t -> unit Js.meth
      method send_formData : Form.formData Js.t -> unit Js.meth
      method setRequestHeader :
        Js.js_string Js.t -> Js.js_string Js.t -> unit Js.meth
      method status : int Js.readonly_prop
      method statusText : Js.js_string Js.t Js.readonly_prop
      method upload :
        XmlHttpRequest.xmlHttpRequestUpload Js.t Js.optdef Js.readonly_prop
      method withCredentials : bool Js.t Js.writeonly_prop
    end
  and xmlHttpRequestUpload =
    object ('a)
      method onabort :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onerror :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onload :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onloadend :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onloadstart :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
      method onprogress :
        ('Js.t, 'File.progressEvent Js.t) Dom.event_listener
        Js.writeonly_prop
    end
  val create : unit -> XmlHttpRequest.xmlHttpRequest Js.t
  module Event :
    sig
      type typ =
          XmlHttpRequest.xmlHttpRequest File.progressEvent Js.t Dom.Event.typ
      val readystatechange :
        XmlHttpRequest.xmlHttpRequest Dom.event Js.t Dom.Event.typ
      val loadstart : XmlHttpRequest.Event.typ
      val progress : XmlHttpRequest.Event.typ
      val abort : XmlHttpRequest.Event.typ
      val error : XmlHttpRequest.Event.typ
      val load : XmlHttpRequest.Event.typ
      val timeout : XmlHttpRequest.Event.typ
      val loadend : XmlHttpRequest.Event.typ
    end
  type 'response generic_http_frame = {
    url : string;
    code : int;
    headers : string -> string option;
    content : 'response;
    content_xml : unit -> Dom.element Dom.document Js.t option;
  }
  type http_frame = string XmlHttpRequest.generic_http_frame
  exception Wrong_headers of (int * (string -> string option))
  val perform_raw :
    ?headers:(string * string) list ->
    ?content_type:string ->
    ?post_args:(string * Form.form_elt) list ->
    ?get_args:(string * string) list ->
    ?form_arg:Form.form_contents ->
    ?check_headers:(int -> (string -> string option) -> bool) ->
    ?progress:(int -> int -> unit) ->
    ?upload_progress:(int -> int -> unit) ->
    ?override_mime_type:string ->
    ?override_method:[< `DELETE
                      | `GET
                      | `HEAD
                      | `OPTIONS
                      | `PATCH
                      | `POST
                      | `PUT ] ->
    ?with_credentials:bool ->
    response_type:'XmlHttpRequest.response ->
    string -> 'XmlHttpRequest.generic_http_frame Lwt.t
  val perform_raw_url :
    ?headers:(string * string) list ->
    ?content_type:string ->
    ?post_args:(string * Form.form_elt) list ->
    ?get_args:(string * string) list ->
    ?form_arg:Form.form_contents ->
    ?check_headers:(int -> (string -> string option) -> bool) ->
    ?progress:(int -> int -> unit) ->
    ?upload_progress:(int -> int -> unit) ->
    ?override_mime_type:string ->
    ?override_method:[< `DELETE
                      | `GET
                      | `HEAD
                      | `OPTIONS
                      | `PATCH
                      | `POST
                      | `PUT ] ->
    ?with_credentials:bool -> string -> XmlHttpRequest.http_frame Lwt.t
  val perform :
    ?headers:(string * string) list ->
    ?content_type:string ->
    ?post_args:(string * Form.form_elt) list ->
    ?get_args:(string * string) list ->
    ?form_arg:Form.form_contents ->
    ?check_headers:(int -> (string -> string option) -> bool) ->
    ?progress:(int -> int -> unit) ->
    ?upload_progress:(int -> int -> unit) ->
    ?override_mime_type:string ->
    ?override_method:[< `DELETE
                      | `GET
                      | `HEAD
                      | `OPTIONS
                      | `PATCH
                      | `POST
                      | `PUT ] ->
    ?with_credentials:bool -> Url.url -> XmlHttpRequest.http_frame Lwt.t
  val get : string -> XmlHttpRequest.http_frame Lwt.t
end