module Network.Curl.Opts where
import Network.Curl.Types
import Network.Curl.Post
import Data.List
import Foreign.Ptr
import Foreign.C.Types
import Data.Bits
data CurlOption
= CurlFileObj (Ptr ())
| CurlURL URLString
| CurlPort Long
| CurlProxy String
| CurlUserPwd String
| CurlProxyUserPwd String
| CurlRange String
| CurlInFile FilePath
| CurlErrorBuffer (Ptr CChar)
| CurlWriteFunction WriteFunction
| CurlReadFunction ReadFunction
| CurlTimeout Long
| CurlInFileSize Long
| CurlPostFields [String]
| CurlReferer String
| CurlFtpPort String
| CurlUserAgent String
| CurlLowSpeed Long
| CurlLowSpeedTime Long
| CurlResumeFrom Long
| CurlCookie String
| CurlHttpHeaders [String]
| CurlHttpPost [HttpPost]
| CurlSSLCert FilePath
| CurlSSLPassword String
| CurlSSLKeyPassword String
| CurlCRLF Bool
| CurlQuote [String]
| CurlWriteHeader (Ptr ())
| CurlCookieFile FilePath
| CurlSSLVersion Long
| CurlTimeCondition TimeCond
| CurlTimeValue Long
| CurlCustomRequest String
| CurlPostQuote [String]
| CurlWriteInfo String
| CurlVerbose Bool
| CurlHeader Bool
| CurlNoProgress Bool
| CurlNoBody Bool
| CurlFailOnError Bool
| CurlUpload Bool
| CurlPost Bool
| CurlFtpListOnly Bool
| CurlFtpAppend Bool
| CurlUseNetRc NetRcOption
| CurlFollowLocation Bool
| CurlTransferTextASCII Bool
| CurlPut Bool
| CurlProgressFunction ProgressFunction
| CurlProgressData (Ptr ())
| CurlAutoReferer Bool
| CurlProxyPort Long
| CurlPostFieldSize Long
| CurlHttpProxyTunnel Bool
| CurlInterface String
| CurlKrb4Level String
| CurlSSLVerifyPeer Bool
| CurlCAInfo FilePath
| CurlMaxRedirs Long
| CurlFiletime Bool
| CurlTelnetOptions [String]
| CurlMaxConnects Long
| CurlClosePolicy Long
| CurlFreshConnect Bool
| CurlForbidReuse Bool
| CurlRandomFile FilePath
| CurlEgdSocket FilePath
| CurlConnectTimeout Long
| CurlHeaderFunction WriteFunction
| CurlHttpGet Bool
| CurlSSLVerifyHost Long
| CurlCookieJar FilePath
| CurlSSLCipherList String
| CurlHttpVersion HttpVersion
| CurlFtpUseEPSV Bool
| CurlSSLCertType String
| CurlSSLKey FilePath
| CurlSSLKeyType String
| CurlSSLEngine String
| CurlSSLEngineDefault
| CurlDNSUseGlobalCache Bool
| CurlDNSCacheTimeout Long
| CurlPreQuote [String]
| CurlDebugFunction DebugFunction
| CurlDebugData (Ptr ())
| CurlCookieSession Bool
| CurlCAPath FilePath
| CurlBufferSize Long
| CurlNoSignal Bool
| CurlShare (Ptr ())
| CurlProxyType Long
| CurlEncoding String
| CurlPrivate (Ptr ())
| CurlHttp200Aliases String
| CurlUnrestrictedAuth Bool
| CurlFtppUseEPRT Bool
| CurlHttpAuth [HttpAuth]
| CurlSSLCtxFunction SSLCtxtFunction
| CurlSSLCtxData (Ptr ())
| CurlFtpCreateMissingDirs Bool
| CurlProxyAuth [HttpAuth]
| CurlFtpResponseTimeout Long
| CurlIPResolve Long
| CurlMaxFileSize Long
| CurlInFileSizeLarge LLong
| CurlResumeFromLarge LLong
| CurlMaxFileSizeLarge LLong
| CurlNetrcFile FilePath
| CurlFtpSSL Long
| CurlPostFieldSizeLarge LLong
| CurlTCPNoDelay Bool
| CurlFtpSSLAuth Long
| CurlIOCTLFunction (Ptr ())
| CurlIOCTLData (Ptr ())
| CurlFtpAccount String
| CurlCookieList String
| CurlIgnoreContentLength Bool
| CurlFtpSkipPASVIP Bool
| CurlFtpFileMethod Long
| CurlLocalPort Port
| CurlLocalPortRange Port
| CurlConnectOnly Bool
| CurlConvFromNetworkFunction (Ptr ())
| CurlConvToNetworkFunction (Ptr ())
| CurlConvFromUtf8Function (Ptr ())
| CurlMaxSendSpeedLarge LLong
| CurlMaxRecvSpeedLarge LLong
| CurlFtpAlternativeToUser String
| CurlSockOptFunction (Ptr ())
| CurlSockOptData (Ptr ())
| CurlSSLSessionIdCache Bool
| CurlSSHAuthTypes [SSHAuthType]
| CurlSSHPublicKeyFile FilePath
| CurlSSHPrivateKeyFile FilePath
| CurlFtpSSLCCC Bool
| CurlTimeoutMS Long
| CurlConnectTimeoutMS Long
| CurlHttpTransferDecoding Bool
| CurlHttpContentDecoding Bool
data HttpVersion
= HttpVersionNone
| HttpVersion10
| HttpVersion11
deriving ( Enum )
data TimeCond
= TimeCondNone
| TimeCondIfModSince
| TimeCondIfUnmodSince
| TimeCondLastMode
deriving ( Enum )
data NetRcOption
= NetRcIgnored
| NetRcOptional
| NetRcRequired
deriving ( Enum )
data HttpAuth
= HttpAuthNone
| HttpAuthBasic
| HttpAuthDigest
| HttpAuthGSSNegotiate
| HttpAuthNTLM
| HttpAuthAny
| HttpAuthAnySafe
toHttpAuthMask :: [HttpAuth] -> Long
toHttpAuthMask [] = 0
toHttpAuthMask (x:xs) =
let vs = toHttpAuthMask xs in
case x of
HttpAuthNone -> vs
HttpAuthBasic -> 0x1 .|. vs
HttpAuthDigest -> 0x2 .|. vs
HttpAuthGSSNegotiate -> 0x4 .|. vs
HttpAuthNTLM -> 0x8 .|. vs
HttpAuthAny -> (complement 0) .|. vs
HttpAuthAnySafe -> (complement 1) .|. vs
data SSHAuthType
= SSHAuthAny
| SSHAuthNone
| SSHAuthPublickey
| SSHAuthPassword
| SSHAuthHost
| SSHAuthKeyboard
toSSHAuthMask :: [SSHAuthType] -> Long
toSSHAuthMask [] = 0
toSSHAuthMask (x:xs) =
let vs = toSSHAuthMask xs in
case x of
SSHAuthAny -> (complement 0) .|. vs
SSHAuthNone -> vs
SSHAuthPublickey -> 1 .|. vs
SSHAuthPassword -> 2 .|. vs
SSHAuthHost -> 4 .|. vs
SSHAuthKeyboard -> 8 .|. vs
type WriteFunction
= Ptr CChar
-> CInt
-> CInt
-> Ptr ()
-> IO CInt
type ReadFunction
= Ptr CChar
-> CInt
-> CInt
-> Ptr ()
-> IO (Maybe CInt)
type ReadFunctionPrim
= Ptr CChar
-> CInt
-> CInt
-> Ptr ()
-> IO CInt
type ProgressFunction
= Ptr ()
-> Double
-> Double
-> Double
-> Double
-> IO CInt
type DebugFunction
= Curl
-> DebugInfo
-> Ptr CChar
-> CInt
-> Ptr ()
-> IO ()
data DebugInfo
= InfoText
| InfoHeaderIn
| InfoHeaderOut
| InfoDataIn
| InfoDataOut
| InfoSslDataIn
| InfoSslDataOut
deriving ( Eq, Enum )
type DebugFunctionPrim
= CurlH
-> CInt
-> Ptr CChar
-> CInt
-> Ptr ()
-> IO CInt
type SSLCtxtFunction
= CurlH
-> Ptr ()
-> Ptr ()
-> IO CInt
curl_readfunc_abort :: CInt
curl_readfunc_abort = 0x10000000
baseLong :: Int
baseLong = 0
baseObject :: Int
baseObject = 10000
baseFunction :: Int
baseFunction = 20000
baseOffT :: Int
baseOffT = 30000
unmarshallOption :: Unmarshaller a -> CurlOption -> IO a
unmarshallOption um c =
let
l = (baseLong+)
o = (baseObject+)
f = (baseFunction+)
off = (baseOffT+)
in
case c of
CurlFileObj x -> u_ptr um (o 1) x
CurlURL x -> u_string um (o 2) x
CurlPort x -> u_long um (l 3) x
CurlProxy x -> u_string um (o 4) x
CurlUserPwd x -> u_string um (o 5) x
CurlProxyUserPwd x -> u_string um (o 6) x
CurlRange x -> u_string um (o 7) x
CurlInFile x -> u_string um (o 9) x
CurlErrorBuffer x -> u_cptr um (o 10) x
CurlWriteFunction x -> u_writeFun um (f 11) x
CurlReadFunction x -> u_readFun um (f 12) x
CurlTimeout x -> u_long um (l 13) x
CurlInFileSize x -> u_long um (l 14) x
CurlPostFields x -> u_string um (o 15) (concat $ intersperse "&" x)
CurlReferer x -> u_string um (o 16) x
CurlFtpPort x -> u_string um (o 17) x
CurlUserAgent x -> u_string um (o 18) x
CurlLowSpeed x -> u_long um (l 19) x
CurlLowSpeedTime x -> u_long um (l 20) x
CurlResumeFrom x -> u_long um (l 21) x
CurlCookie x -> u_string um (o 22) x
CurlHttpHeaders x -> u_strings um (o 23) x
CurlHttpPost x -> u_posts um (o 24) x
CurlSSLCert x -> u_string um (o 25) x
CurlSSLPassword x -> u_string um (o 26) x
CurlSSLKeyPassword x -> u_string um (o 26) x
CurlCRLF x -> u_bool um (l 27) x
CurlQuote x -> u_strings um (o 28) x
CurlWriteHeader x -> u_ptr um (o 29) x
CurlCookieFile x -> u_string um (o 31) x
CurlSSLVersion x -> u_long um (l 32) x
CurlTimeCondition x -> u_enum um (l 33) x
CurlTimeValue x -> u_long um (l 34) x
CurlCustomRequest x -> u_string um (o 36) x
CurlPostQuote x -> u_strings um (o 39) x
CurlWriteInfo x -> u_string um (o 40) x
CurlVerbose x -> u_bool um (l 41) x
CurlHeader x -> u_bool um (l 42) x
CurlNoProgress x -> u_bool um (l 43) x
CurlNoBody x -> u_bool um (l 44) x
CurlFailOnError x -> u_bool um (l 45) x
CurlUpload x -> u_bool um (l 46) x
CurlPost x -> u_bool um (l 47) x
CurlFtpListOnly x -> u_bool um (l 48) x
CurlFtpAppend x -> u_bool um (l 50) x
CurlUseNetRc x -> u_enum um (l 51) x
CurlFollowLocation x -> u_bool um (l 52) x
CurlTransferTextASCII x -> u_bool um (l 53) x
CurlPut x -> u_bool um (l 54) x
CurlProgressFunction x -> u_progressFun um (f 56) x
CurlProgressData x -> u_ptr um (o 57) x
CurlAutoReferer x -> u_bool um (l 58) x
CurlProxyPort x -> u_long um (l 59) x
CurlPostFieldSize x -> u_long um (l 60) x
CurlHttpProxyTunnel x -> u_bool um (l 61) x
CurlInterface x -> u_string um (o 62) x
CurlKrb4Level x -> u_string um (o 63) x
CurlSSLVerifyPeer x -> u_bool um (l 64) x
CurlCAInfo x -> u_string um (o 65) x
CurlMaxRedirs x -> u_long um (l 68) x
CurlFiletime x -> u_bool um (l 69) x
CurlTelnetOptions x -> u_strings um (o 70) x
CurlMaxConnects x -> u_long um (l 71) x
CurlClosePolicy x -> u_long um (l 72) x
CurlFreshConnect x -> u_bool um (l 74) x
CurlForbidReuse x -> u_bool um (l 75) x
CurlRandomFile x -> u_string um (o 76) x
CurlEgdSocket x -> u_string um (o 77) x
CurlConnectTimeout x -> u_long um (l 78) x
CurlHeaderFunction x -> u_writeFun um (f 79) x
CurlHttpGet x -> u_bool um (l 80) x
CurlSSLVerifyHost x -> u_long um (l 81) x
CurlCookieJar x -> u_string um (o 82) x
CurlSSLCipherList x -> u_string um (o 83) x
CurlHttpVersion x -> u_enum um (l 84) x
CurlFtpUseEPSV x -> u_bool um (l 85) x
CurlSSLCertType x -> u_string um (o 86) x
CurlSSLKey x -> u_string um (o 87) x
CurlSSLKeyType x -> u_string um (o 88) x
CurlSSLEngine x -> u_string um (o 89) x
CurlSSLEngineDefault -> u_bool um (l 90) True
CurlDNSUseGlobalCache x -> u_bool um (l 91) x
CurlDNSCacheTimeout x -> u_long um (l 92) x
CurlPreQuote x -> u_strings um (o 93) x
CurlDebugFunction x -> u_debugFun um (f 94) x
CurlDebugData x -> u_ptr um (o 95) x
CurlCookieSession x -> u_bool um (l 96) x
CurlCAPath x -> u_string um (o 97) x
CurlBufferSize x -> u_long um (l 98) x
CurlNoSignal x -> u_bool um (l 99) x
CurlShare x -> u_ptr um (o 100) x
CurlProxyType x -> u_enum um (l 101) x
CurlEncoding x -> u_string um (o 102) x
CurlPrivate x -> u_ptr um (o 103) x
CurlHttp200Aliases x -> u_string um (o 104) x
CurlUnrestrictedAuth x -> u_bool um (l 105) x
CurlFtppUseEPRT x -> u_bool um (l 106) x
CurlHttpAuth xs -> u_long um (l 107) (toHttpAuthMask xs)
CurlSSLCtxFunction x -> u_sslctxt um (f 108) x
CurlSSLCtxData x -> u_ptr um (o 109) x
CurlFtpCreateMissingDirs x -> u_bool um (l 110) x
CurlProxyAuth x -> u_long um (l 111) (toHttpAuthMask x)
CurlFtpResponseTimeout x -> u_long um (l 112) x
CurlIPResolve x -> u_long um (l 113) x
CurlMaxFileSize x -> u_long um (l 114) x
CurlInFileSizeLarge x -> u_llong um (off 115) x
CurlResumeFromLarge x -> u_llong um (off 116) x
CurlMaxFileSizeLarge x -> u_llong um (off 117) x
CurlNetrcFile x -> u_string um (o 118) x
CurlFtpSSL x -> u_enum um (l 119) x
CurlPostFieldSizeLarge x -> u_llong um (off 120) x
CurlTCPNoDelay x -> u_bool um (l 121) x
CurlFtpSSLAuth x -> u_enum um (l 129) x
CurlIOCTLFunction x -> u_ioctl_fun um (f 130) x
CurlIOCTLData x -> u_ptr um (o 131) x
CurlFtpAccount x -> u_string um (o 134) x
CurlCookieList x -> u_string um (o 135) x
CurlIgnoreContentLength x -> u_bool um (l 136) x
CurlFtpSkipPASVIP x -> u_bool um (l 137) x
CurlFtpFileMethod x -> u_enum um (l 138) x
CurlLocalPort x -> u_long um (l 139) x
CurlLocalPortRange x -> u_long um (l 140) x
CurlConnectOnly x -> u_bool um (l 141) x
CurlConvFromNetworkFunction x -> u_convFromNetwork um (f 142) x
CurlConvToNetworkFunction x -> u_convToNetwork um (f 143) x
CurlConvFromUtf8Function x -> u_convFromUtf8 um (f 144) x
CurlMaxSendSpeedLarge x -> u_llong um (off 145) x
CurlMaxRecvSpeedLarge x -> u_llong um (off 146) x
CurlFtpAlternativeToUser x -> u_string um (o 147) x
CurlSockOptFunction x -> u_sockoptFun um (f 148) x
CurlSockOptData x -> u_ptr um (o 149) x
CurlSSLSessionIdCache x -> u_bool um (l 150) x
CurlSSHAuthTypes xs -> u_long um (l 151) (toSSHAuthMask xs)
CurlSSHPublicKeyFile x -> u_string um (o 152) x
CurlSSHPrivateKeyFile x -> u_string um (o 153) x
CurlFtpSSLCCC x -> u_bool um (l 154) x
CurlTimeoutMS x -> u_long um (l 155) x
CurlConnectTimeoutMS x -> u_long um (l 156) x
CurlHttpTransferDecoding x -> u_bool um (l 157) x
CurlHttpContentDecoding x -> u_bool um (l 158) x
data Unmarshaller a
= Unmarshaller
{ u_long :: Int -> Long -> IO a
, u_llong :: Int -> LLong -> IO a
, u_string :: Int -> String -> IO a
, u_strings :: Int -> [String] -> IO a
, u_ptr :: Int -> Ptr () -> IO a
, u_writeFun :: Int -> WriteFunction -> IO a
, u_readFun :: Int -> ReadFunction -> IO a
, u_progressFun :: Int -> ProgressFunction -> IO a
, u_debugFun :: Int -> DebugFunction -> IO a
, u_posts :: Int -> [HttpPost] -> IO a
, u_sslctxt :: Int -> SSLCtxtFunction -> IO a
, u_ioctl_fun :: Int -> Ptr () -> IO a
, u_convFromNetwork :: Int -> Ptr () -> IO a
, u_convToNetwork :: Int -> Ptr () -> IO a
, u_convFromUtf8 :: Int -> Ptr () -> IO a
, u_sockoptFun :: Int -> Ptr () -> IO a
}
verboseUnmarshaller :: Unmarshaller a -> Unmarshaller a
verboseUnmarshaller u =
let two m f x y = putStrLn m >> f u x y
twoS m f x y = putStrLn (m ++ ": " ++ show (x,y)) >> f u x y
in u
{ u_long = twoS "u_long" u_long
, u_llong = twoS "u_llong" u_llong
, u_string = twoS "u_string" u_string
, u_strings = twoS "u_strings" u_strings
, u_ptr = twoS "u_ptr" u_ptr
, u_writeFun = two "u_writeFun" u_writeFun
, u_readFun = two "u_readFun" u_readFun
, u_progressFun = two "u_progressFun" u_progressFun
, u_debugFun = two "u_debugFun" u_debugFun
, u_posts = two "u_posts" u_posts
, u_sslctxt = two "u_sslctxt" u_sslctxt
, u_ioctl_fun = two "u_ioctl_fun" u_ioctl_fun
, u_convFromNetwork = twoS "u_convFromNetwork" u_convFromNetwork
, u_convToNetwork = twoS "u_convToNetwork" u_convToNetwork
, u_convFromUtf8 = twoS "u_convFromUtf8" u_convFromUtf8
, u_sockoptFun = twoS "u_sockoptFun" u_sockoptFun
}
u_bool :: Unmarshaller a -> Int -> Bool -> IO a
u_bool um x b = u_long um x (if b then 1 else 0)
u_enum :: Enum b => Unmarshaller a -> Int -> b -> IO a
u_enum um x b = u_long um x (fromIntegral $ fromEnum b)
u_cptr :: Unmarshaller a -> Int -> Ptr CChar -> IO a
u_cptr um x p = u_ptr um x (castPtr p)