{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

A 'GI.Soup.Structs.ClientContext.ClientContext' provides additional information about the
client making a particular request. In particular, you can use
'GI.Soup.Structs.ClientContext.clientContextGetAuthDomain' and
'GI.Soup.Structs.ClientContext.clientContextGetAuthUser' to determine if HTTP
authentication was used successfully.

'GI.Soup.Structs.ClientContext.clientContextGetRemoteAddress' and\/or
'GI.Soup.Structs.ClientContext.clientContextGetHost' can be used to get information for
logging or debugging purposes. 'GI.Soup.Structs.ClientContext.clientContextGetGsocket' may
also be of use in some situations (eg, tracking when multiple
requests are made on the same connection).
-}

module GI.Soup.Structs.ClientContext
    ( 

-- * Exported types
    ClientContext(..)                       ,
    noClientContext                         ,


 -- * Methods
-- ** getAddress #method:getAddress#
    ClientContextGetAddressMethodInfo       ,
    clientContextGetAddress                 ,


-- ** getAuthDomain #method:getAuthDomain#
    ClientContextGetAuthDomainMethodInfo    ,
    clientContextGetAuthDomain              ,


-- ** getAuthUser #method:getAuthUser#
    ClientContextGetAuthUserMethodInfo      ,
    clientContextGetAuthUser                ,


-- ** getGsocket #method:getGsocket#
    ClientContextGetGsocketMethodInfo       ,
    clientContextGetGsocket                 ,


-- ** getHost #method:getHost#
    ClientContextGetHostMethodInfo          ,
    clientContextGetHost                    ,


-- ** getLocalAddress #method:getLocalAddress#
    ClientContextGetLocalAddressMethodInfo  ,
    clientContextGetLocalAddress            ,


-- ** getRemoteAddress #method:getRemoteAddress#
    ClientContextGetRemoteAddressMethodInfo ,
    clientContextGetRemoteAddress           ,


-- ** getSocket #method:getSocket#
    ClientContextGetSocketMethodInfo        ,
    clientContextGetSocket                  ,


-- ** stealConnection #method:stealConnection#
    ClientContextStealConnectionMethodInfo  ,
    clientContextStealConnection            ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP

import qualified GI.Gio.Objects.IOStream as Gio.IOStream
import qualified GI.Gio.Objects.Socket as Gio.Socket
import qualified GI.Gio.Objects.SocketAddress as Gio.SocketAddress
import {-# SOURCE #-} qualified GI.Soup.Objects.Address as Soup.Address
import {-# SOURCE #-} qualified GI.Soup.Objects.AuthDomain as Soup.AuthDomain
import {-# SOURCE #-} qualified GI.Soup.Objects.Socket as Soup.Socket

newtype ClientContext = ClientContext (ManagedPtr ClientContext)
foreign import ccall "soup_client_context_get_type" c_soup_client_context_get_type :: 
    IO GType

instance BoxedObject ClientContext where
    boxedType _ = c_soup_client_context_get_type

noClientContext :: Maybe ClientContext
noClientContext = Nothing


instance O.HasAttributeList ClientContext
type instance O.AttributeList ClientContext = ClientContextAttributeList
type ClientContextAttributeList = ('[ ] :: [(Symbol, *)])

-- method ClientContext::get_address
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "client", argType = TInterface (Name {namespace = "Soup", name = "ClientContext"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #SoupClientContext", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Soup", name = "Address"}))
-- throws : False
-- Skip return : False

foreign import ccall "soup_client_context_get_address" soup_client_context_get_address :: 
    Ptr ClientContext ->                    -- client : TInterface (Name {namespace = "Soup", name = "ClientContext"})
    IO (Ptr Soup.Address.Address)

{-# DEPRECATED clientContextGetAddress ["Use 'GI.Soup.Structs.ClientContext.clientContextGetRemoteAddress', which returns","a 'GI.Gio.Objects.SocketAddress.SocketAddress'."] #-}
{- |
Retrieves the 'GI.Soup.Objects.Address.Address' associated with the remote end
of a connection.
-}
clientContextGetAddress ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    ClientContext
    {- ^ /@client@/: a 'GI.Soup.Structs.ClientContext.ClientContext' -}
    -> m (Maybe Soup.Address.Address)
    {- ^ __Returns:__ the 'GI.Soup.Objects.Address.Address'
associated with the remote end of a connection, it may be
'Nothing' if you used 'GI.Soup.Objects.Server.serverAcceptIostream'. -}
clientContextGetAddress client = liftIO $ do
    client' <- unsafeManagedPtrGetPtr client
    result <- soup_client_context_get_address client'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (newObject Soup.Address.Address) result'
        return result''
    touchManagedPtr client
    return maybeResult

data ClientContextGetAddressMethodInfo
instance (signature ~ (m (Maybe Soup.Address.Address)), MonadIO m) => O.MethodInfo ClientContextGetAddressMethodInfo ClientContext signature where
    overloadedMethod _ = clientContextGetAddress

-- method ClientContext::get_auth_domain
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "client", argType = TInterface (Name {namespace = "Soup", name = "ClientContext"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #SoupClientContext", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Soup", name = "AuthDomain"}))
-- throws : False
-- Skip return : False

foreign import ccall "soup_client_context_get_auth_domain" soup_client_context_get_auth_domain :: 
    Ptr ClientContext ->                    -- client : TInterface (Name {namespace = "Soup", name = "ClientContext"})
    IO (Ptr Soup.AuthDomain.AuthDomain)

{- |
Checks whether the request associated with /@client@/ has been
authenticated, and if so returns the 'GI.Soup.Objects.AuthDomain.AuthDomain' that
authenticated it.
-}
clientContextGetAuthDomain ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    ClientContext
    {- ^ /@client@/: a 'GI.Soup.Structs.ClientContext.ClientContext' -}
    -> m (Maybe Soup.AuthDomain.AuthDomain)
    {- ^ __Returns:__ a 'GI.Soup.Objects.AuthDomain.AuthDomain', or
'Nothing' if the request was not authenticated. -}
clientContextGetAuthDomain client = liftIO $ do
    client' <- unsafeManagedPtrGetPtr client
    result <- soup_client_context_get_auth_domain client'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (newObject Soup.AuthDomain.AuthDomain) result'
        return result''
    touchManagedPtr client
    return maybeResult

data ClientContextGetAuthDomainMethodInfo
instance (signature ~ (m (Maybe Soup.AuthDomain.AuthDomain)), MonadIO m) => O.MethodInfo ClientContextGetAuthDomainMethodInfo ClientContext signature where
    overloadedMethod _ = clientContextGetAuthDomain

-- method ClientContext::get_auth_user
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "client", argType = TInterface (Name {namespace = "Soup", name = "ClientContext"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #SoupClientContext", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "soup_client_context_get_auth_user" soup_client_context_get_auth_user :: 
    Ptr ClientContext ->                    -- client : TInterface (Name {namespace = "Soup", name = "ClientContext"})
    IO CString

{- |
Checks whether the request associated with /@client@/ has been
authenticated, and if so returns the username that the client
authenticated as.
-}
clientContextGetAuthUser ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    ClientContext
    {- ^ /@client@/: a 'GI.Soup.Structs.ClientContext.ClientContext' -}
    -> m (Maybe T.Text)
    {- ^ __Returns:__ the authenticated-as user, or 'Nothing' if
the request was not authenticated. -}
clientContextGetAuthUser client = liftIO $ do
    client' <- unsafeManagedPtrGetPtr client
    result <- soup_client_context_get_auth_user client'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- cstringToText result'
        return result''
    touchManagedPtr client
    return maybeResult

data ClientContextGetAuthUserMethodInfo
instance (signature ~ (m (Maybe T.Text)), MonadIO m) => O.MethodInfo ClientContextGetAuthUserMethodInfo ClientContext signature where
    overloadedMethod _ = clientContextGetAuthUser

-- method ClientContext::get_gsocket
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "client", argType = TInterface (Name {namespace = "Soup", name = "ClientContext"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #SoupClientContext", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gio", name = "Socket"}))
-- throws : False
-- Skip return : False

foreign import ccall "soup_client_context_get_gsocket" soup_client_context_get_gsocket :: 
    Ptr ClientContext ->                    -- client : TInterface (Name {namespace = "Soup", name = "ClientContext"})
    IO (Ptr Gio.Socket.Socket)

{- |
Retrieves the 'GI.Gio.Objects.Socket.Socket' that /@client@/ is associated with.

If you are using this method to observe when multiple requests are
made on the same persistent HTTP connection (eg, as the ntlm-test
test program does), you will need to pay attention to socket
destruction as well (eg, by using weak references), so that you do
not get fooled when the allocator reuses the memory address of a
previously-destroyed socket to represent a new socket.

@since 2.48
-}
clientContextGetGsocket ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    ClientContext
    {- ^ /@client@/: a 'GI.Soup.Structs.ClientContext.ClientContext' -}
    -> m (Maybe Gio.Socket.Socket)
    {- ^ __Returns:__ the 'GI.Gio.Objects.Socket.Socket' that /@client@/ is
associated with, 'Nothing' if you used 'GI.Soup.Objects.Server.serverAcceptIostream'. -}
clientContextGetGsocket client = liftIO $ do
    client' <- unsafeManagedPtrGetPtr client
    result <- soup_client_context_get_gsocket client'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (newObject Gio.Socket.Socket) result'
        return result''
    touchManagedPtr client
    return maybeResult

data ClientContextGetGsocketMethodInfo
instance (signature ~ (m (Maybe Gio.Socket.Socket)), MonadIO m) => O.MethodInfo ClientContextGetGsocketMethodInfo ClientContext signature where
    overloadedMethod _ = clientContextGetGsocket

-- method ClientContext::get_host
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "client", argType = TInterface (Name {namespace = "Soup", name = "ClientContext"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #SoupClientContext", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "soup_client_context_get_host" soup_client_context_get_host :: 
    Ptr ClientContext ->                    -- client : TInterface (Name {namespace = "Soup", name = "ClientContext"})
    IO CString

{- |
Retrieves the IP address associated with the remote end of a
connection.
-}
clientContextGetHost ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    ClientContext
    {- ^ /@client@/: a 'GI.Soup.Structs.ClientContext.ClientContext' -}
    -> m (Maybe T.Text)
    {- ^ __Returns:__ the IP address associated with the remote
end of a connection, it may be 'Nothing' if you used
'GI.Soup.Objects.Server.serverAcceptIostream'. -}
clientContextGetHost client = liftIO $ do
    client' <- unsafeManagedPtrGetPtr client
    result <- soup_client_context_get_host client'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- cstringToText result'
        return result''
    touchManagedPtr client
    return maybeResult

data ClientContextGetHostMethodInfo
instance (signature ~ (m (Maybe T.Text)), MonadIO m) => O.MethodInfo ClientContextGetHostMethodInfo ClientContext signature where
    overloadedMethod _ = clientContextGetHost

-- method ClientContext::get_local_address
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "client", argType = TInterface (Name {namespace = "Soup", name = "ClientContext"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #SoupClientContext", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gio", name = "SocketAddress"}))
-- throws : False
-- Skip return : False

foreign import ccall "soup_client_context_get_local_address" soup_client_context_get_local_address :: 
    Ptr ClientContext ->                    -- client : TInterface (Name {namespace = "Soup", name = "ClientContext"})
    IO (Ptr Gio.SocketAddress.SocketAddress)

{- |
Retrieves the 'GI.Gio.Objects.SocketAddress.SocketAddress' associated with the local end
of a connection.

@since 2.48
-}
clientContextGetLocalAddress ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    ClientContext
    {- ^ /@client@/: a 'GI.Soup.Structs.ClientContext.ClientContext' -}
    -> m (Maybe Gio.SocketAddress.SocketAddress)
    {- ^ __Returns:__ the 'GI.Gio.Objects.SocketAddress.SocketAddress'
associated with the local end of a connection, it may be
'Nothing' if you used 'GI.Soup.Objects.Server.serverAcceptIostream'. -}
clientContextGetLocalAddress client = liftIO $ do
    client' <- unsafeManagedPtrGetPtr client
    result <- soup_client_context_get_local_address client'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (newObject Gio.SocketAddress.SocketAddress) result'
        return result''
    touchManagedPtr client
    return maybeResult

data ClientContextGetLocalAddressMethodInfo
instance (signature ~ (m (Maybe Gio.SocketAddress.SocketAddress)), MonadIO m) => O.MethodInfo ClientContextGetLocalAddressMethodInfo ClientContext signature where
    overloadedMethod _ = clientContextGetLocalAddress

-- method ClientContext::get_remote_address
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "client", argType = TInterface (Name {namespace = "Soup", name = "ClientContext"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #SoupClientContext", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gio", name = "SocketAddress"}))
-- throws : False
-- Skip return : False

foreign import ccall "soup_client_context_get_remote_address" soup_client_context_get_remote_address :: 
    Ptr ClientContext ->                    -- client : TInterface (Name {namespace = "Soup", name = "ClientContext"})
    IO (Ptr Gio.SocketAddress.SocketAddress)

{- |
Retrieves the 'GI.Gio.Objects.SocketAddress.SocketAddress' associated with the remote end
of a connection.

@since 2.48
-}
clientContextGetRemoteAddress ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    ClientContext
    {- ^ /@client@/: a 'GI.Soup.Structs.ClientContext.ClientContext' -}
    -> m (Maybe Gio.SocketAddress.SocketAddress)
    {- ^ __Returns:__ the 'GI.Gio.Objects.SocketAddress.SocketAddress'
associated with the remote end of a connection, it may be
'Nothing' if you used 'GI.Soup.Objects.Server.serverAcceptIostream'. -}
clientContextGetRemoteAddress client = liftIO $ do
    client' <- unsafeManagedPtrGetPtr client
    result <- soup_client_context_get_remote_address client'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (newObject Gio.SocketAddress.SocketAddress) result'
        return result''
    touchManagedPtr client
    return maybeResult

data ClientContextGetRemoteAddressMethodInfo
instance (signature ~ (m (Maybe Gio.SocketAddress.SocketAddress)), MonadIO m) => O.MethodInfo ClientContextGetRemoteAddressMethodInfo ClientContext signature where
    overloadedMethod _ = clientContextGetRemoteAddress

-- method ClientContext::get_socket
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "client", argType = TInterface (Name {namespace = "Soup", name = "ClientContext"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #SoupClientContext", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Soup", name = "Socket"}))
-- throws : False
-- Skip return : False

foreign import ccall "soup_client_context_get_socket" soup_client_context_get_socket :: 
    Ptr ClientContext ->                    -- client : TInterface (Name {namespace = "Soup", name = "ClientContext"})
    IO (Ptr Soup.Socket.Socket)

{-# DEPRECATED clientContextGetSocket ["use 'GI.Soup.Structs.ClientContext.clientContextGetGsocket', which returns","a 'GI.Gio.Objects.Socket.Socket'."] #-}
{- |
Retrieves the 'GI.Soup.Objects.Socket.Socket' that /@client@/ is associated with.

If you are using this method to observe when multiple requests are
made on the same persistent HTTP connection (eg, as the ntlm-test
test program does), you will need to pay attention to socket
destruction as well (either by using weak references, or by
connecting to the 'GI.Soup.Objects.Socket.Socket'::@/disconnected/@ signal), so that you do
not get fooled when the allocator reuses the memory address of a
previously-destroyed socket to represent a new socket.
-}
clientContextGetSocket ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    ClientContext
    {- ^ /@client@/: a 'GI.Soup.Structs.ClientContext.ClientContext' -}
    -> m Soup.Socket.Socket
    {- ^ __Returns:__ the 'GI.Soup.Objects.Socket.Socket' that /@client@/ is
associated with. -}
clientContextGetSocket client = liftIO $ do
    client' <- unsafeManagedPtrGetPtr client
    result <- soup_client_context_get_socket client'
    checkUnexpectedReturnNULL "clientContextGetSocket" result
    result' <- (newObject Soup.Socket.Socket) result
    touchManagedPtr client
    return result'

data ClientContextGetSocketMethodInfo
instance (signature ~ (m Soup.Socket.Socket), MonadIO m) => O.MethodInfo ClientContextGetSocketMethodInfo ClientContext signature where
    overloadedMethod _ = clientContextGetSocket

-- method ClientContext::steal_connection
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "client", argType = TInterface (Name {namespace = "Soup", name = "ClientContext"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #SoupClientContext", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gio", name = "IOStream"}))
-- throws : False
-- Skip return : False

foreign import ccall "soup_client_context_steal_connection" soup_client_context_steal_connection :: 
    Ptr ClientContext ->                    -- client : TInterface (Name {namespace = "Soup", name = "ClientContext"})
    IO (Ptr Gio.IOStream.IOStream)

{- |
\"Steals\" the HTTP connection associated with /@client@/ from its
'GI.Soup.Objects.Server.Server'. This happens immediately, regardless of the current
state of the connection; if the response to the current
'GI.Soup.Objects.Message.Message' has not yet finished being sent, then it will be
discarded; you can steal the connection from a
'GI.Soup.Objects.Message.Message':@/wrote-informational/@ or 'GI.Soup.Objects.Message.Message':@/wrote-body/@ signal
handler if you need to wait for part or all of the response to be
sent.

Note that when calling this function from C, /@client@/ will most
likely be freed as a side effect.

@since 2.50
-}
clientContextStealConnection ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    ClientContext
    {- ^ /@client@/: a 'GI.Soup.Structs.ClientContext.ClientContext' -}
    -> m Gio.IOStream.IOStream
    {- ^ __Returns:__ the 'GI.Gio.Objects.IOStream.IOStream' formerly associated
  with /@client@/ (or 'Nothing' if /@client@/ was no longer associated with a
  connection). No guarantees are made about what kind of 'GI.Gio.Objects.IOStream.IOStream'
  is returned. -}
clientContextStealConnection client = liftIO $ do
    client' <- unsafeManagedPtrGetPtr client
    result <- soup_client_context_steal_connection client'
    checkUnexpectedReturnNULL "clientContextStealConnection" result
    result' <- (wrapObject Gio.IOStream.IOStream) result
    touchManagedPtr client
    return result'

data ClientContextStealConnectionMethodInfo
instance (signature ~ (m Gio.IOStream.IOStream), MonadIO m) => O.MethodInfo ClientContextStealConnectionMethodInfo ClientContext signature where
    overloadedMethod _ = clientContextStealConnection

type family ResolveClientContextMethod (t :: Symbol) (o :: *) :: * where
    ResolveClientContextMethod "stealConnection" o = ClientContextStealConnectionMethodInfo
    ResolveClientContextMethod "getAddress" o = ClientContextGetAddressMethodInfo
    ResolveClientContextMethod "getAuthDomain" o = ClientContextGetAuthDomainMethodInfo
    ResolveClientContextMethod "getAuthUser" o = ClientContextGetAuthUserMethodInfo
    ResolveClientContextMethod "getGsocket" o = ClientContextGetGsocketMethodInfo
    ResolveClientContextMethod "getHost" o = ClientContextGetHostMethodInfo
    ResolveClientContextMethod "getLocalAddress" o = ClientContextGetLocalAddressMethodInfo
    ResolveClientContextMethod "getRemoteAddress" o = ClientContextGetRemoteAddressMethodInfo
    ResolveClientContextMethod "getSocket" o = ClientContextGetSocketMethodInfo
    ResolveClientContextMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveClientContextMethod t ClientContext, O.MethodInfo info ClientContext p) => O.IsLabelProxy t (ClientContext -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveClientContextMethod t ClientContext, O.MethodInfo info ClientContext p) => O.IsLabel t (ClientContext -> p) where
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif