sig
  module Session :
    sig
      type oauth1_context = { token : string; secret : string; }
      val token :
        (GapiConversation.Session.oauth1_context, string) GapiLens.t
      val secret :
        (GapiConversation.Session.oauth1_context, string) GapiLens.t
      type oauth2_context = {
        oauth2_token : string;
        refresh_token : string;
      }
      val oauth2_token :
        (GapiConversation.Session.oauth2_context, string) GapiLens.t
      val refresh_token :
        (GapiConversation.Session.oauth2_context, string) GapiLens.t
      type auth_context =
          NoAuth
        | ClientLogin of string
        | OAuth1 of GapiConversation.Session.oauth1_context
        | OAuth2 of GapiConversation.Session.oauth2_context
      val no_auth :
        (GapiConversation.Session.auth_context, unit option) GapiLens.t
      val client_login :
        (GapiConversation.Session.auth_context, string option) GapiLens.t
      val oauth1 :
        (GapiConversation.Session.auth_context,
         GapiConversation.Session.oauth1_context option)
        GapiLens.t
      val oauth2 :
        (GapiConversation.Session.auth_context,
         GapiConversation.Session.oauth2_context option)
        GapiLens.t
      type t = {
        curl : [ `Created ] GapiCurl.t;
        config : GapiConfig.t;
        auth : GapiConversation.Session.auth_context;
        cookies : string list;
        etag : string;
      }
      val curl :
        (GapiConversation.Session.t, [ `Created ] GapiCurl.t) GapiLens.t
      val config : (GapiConversation.Session.t, GapiConfig.t) GapiLens.t
      val auth :
        (GapiConversation.Session.t, GapiConversation.Session.auth_context)
        GapiLens.t
      val cookies : (GapiConversation.Session.t, string list) GapiLens.t
      val etag : (GapiConversation.Session.t, string) GapiLens.t
    end
  val request :
    ?header_list:GapiCore.Header.t list ->
    ?post_data:GapiCore.PostData.t ->
    ?media_download:GapiMediaResource.download ->
    GapiCore.HttpMethod.t ->
    GapiConversation.Session.t ->
    string ->
    (GapiPipe.OcamlnetPipe.t ->
     int -> GapiCore.Header.t list -> GapiConversation.Session.t -> 'a) ->
    'a * GapiConversation.Session.t
  val with_session :
    ?auth_context:GapiConversation.Session.auth_context ->
    GapiConfig.t ->
    [ `Initialized ] GapiCurl.t -> (GapiConversation.Session.t -> 'a) -> 'a
  val with_curl :
    ?auth_context:GapiConversation.Session.auth_context ->
    GapiConfig.t -> (GapiConversation.Session.t -> 'a) -> 'a
  val read_all : ?auto_close:bool -> GapiPipe.OcamlnetPipe.t -> string
  val parse_error :
    GapiPipe.OcamlnetPipe.t -> int -> GapiConversation.Session.t -> 'a
  exception ConversationException of string
  type ('a, 'b) iter =
      Done of 'b
    | Continue of ('-> ('a, 'b) GapiConversation.iter)
    | Error of string
  val loop : ('-> ('a, 'b) GapiConversation.iter) -> '-> 'b
end