packages feed

curlhs-0.0.2: Network/Curlhs/Setopt.hsc

-------------------------------------------------------------------------------
-- |
-- Module      :  Network.Curlhs.Setopt
-- Copyright   :  Copyright © 2012 Krzysztof Kardzis
-- License     :  ISC License (MIT/BSD-style, see LICENSE file for details)
-- 
-- Maintainer  :  Krzysztof Kardzis <kkardzis@gmail.com>
-- Stability   :  experimental
-- Portability :  non-portable
--
-------------------------------------------------------------------------------

module Network.Curlhs.Setopt
  ( curl_easy_setopt
  , freeCallbacks
  ) where

import Foreign.Marshal.Utils (copyBytes, fromBool)
import Foreign.C.Types       (CLong)
import Foreign.Ptr           (FunPtr, nullFunPtr, freeHaskellFunPtr)

import Data.Time.Clock.POSIX (utcTimeToPOSIXSeconds)
import Data.Time.Clock       (UTCTime)
import Data.Bits             ((.|.))
import Data.List             (foldl')
import Data.IORef            (IORef, atomicModifyIORef)

import qualified Data.ByteString as BS
import Data.ByteString.Unsafe (unsafeUseAsCStringLen)
import Data.ByteString        (ByteString, useAsCString, packCStringLen)

import Network.Curlhs.Errors
import Network.Curlhs.Types
import Network.Curlhs.Base


-------------------------------------------------------------------------------
freeCallbacks :: CURL -> IO ()
freeCallbacks curl = do
  keepCallback (cb_write curl) Nothing
  keepCallback (cb_read  curl) Nothing

keepCallback :: IORef (Maybe (FunPtr a)) -> Maybe (FunPtr a) -> IO ()
keepCallback r mf =
  atomicModifyIORef r (\v -> (mf, v)) >>= maybe (return ()) freeHaskellFunPtr

makeCallback :: Maybe cb -> IORef (Maybe (FunPtr a))
             -> (FunPtr a -> IO CCURLcode) -> (cb -> IO (FunPtr a)) -> IO ()
makeCallback (Just cb) ref setcb wrapcb = withCODE $ do
  fptr <- wrapcb cb
  code <- setcb fptr
  if (code == cCURLE_OK)
    then keepCallback ref (Just fptr)
    else freeHaskellFunPtr fptr
  return code
makeCallback Nothing ref setcb _ = withCODE $ do
  code <- setcb nullFunPtr
  keepCallback ref Nothing
  return code


-------------------------------------------------------------------------------
#{let setopt opt, fun = #opt " x -> " #fun " c" #opt " x"}

-------------------------------------------------------------------------------
-- | Set options for a curl easy handle
--   (<http://curl.haxx.se/libcurl/c/curl_easy_setopt.html>).
-------------------------------------------------------------------------------
curl_easy_setopt :: CURL -> [CURLoption] -> IO ()
curl_easy_setopt curl opts = flip mapM_ opts $ \opt -> case opt of

  ---- CALLBACK OPTIONS -------------------------------------------------------
  CURLOPT_WRITEFUNCTION f -> so'FWRITE curl f
  CURLOPT_READFUNCTION  f -> so'FREAD  curl f

  ---- BEHAVIOR OPTIONS -------------------------------------------------------
  #{setopt CURLOPT_VERBOSE                , bool     }
  #{setopt CURLOPT_HEADER                 , bool     }
  #{setopt CURLOPT_NOPROGRESS             , bool     }
  #{setopt CURLOPT_NOSIGNAL               , bool     }
  #{setopt CURLOPT_WILDCARDMATCH          , bool     } |7210:----|

  ---- ERROR OPTIONS ----------------------------------------------------------
  -- CURLOPT_ERRORBUFFER
  -- CURLOPT_STDERR
  #{setopt CURLOPT_FAILONERROR            , bool     }

  ---- NETWORK OPTIONS --------------------------------------------------------
  #{setopt CURLOPT_URL                    , string   }
  #{setopt CURLOPT_PROTOCOLS              , enum     }
  #{setopt CURLOPT_REDIR_PROTOCOLS        , enum     }
  #{setopt CURLOPT_PROXY                  , string   }
  #{setopt CURLOPT_PROXYPORT              , int      }
  #{setopt CURLOPT_PROXYTYPE              , enum     }
  #{setopt CURLOPT_NOPROXY                , string   }
  #{setopt CURLOPT_HTTPPROXYTUNNEL        , bool     }
  #{setopt CURLOPT_SOCKS5_GSSAPI_SERVICE  , string   }
  #{setopt CURLOPT_SOCKS5_GSSAPI_NEC      , bool     }
  #{setopt CURLOPT_INTERFACE              , string   }
  #{setopt CURLOPT_LOCALPORT              , int      }
  #{setopt CURLOPT_LOCALPORTRANGE         , int      }
  #{setopt CURLOPT_DNS_CACHE_TIMEOUT      , int      }
  #{setopt CURLOPT_DNS_USE_GLOBAL_CACHE   , bool     }
  #{setopt CURLOPT_BUFFERSIZE             , int      }
  #{setopt CURLOPT_PORT                   , int      }
  #{setopt CURLOPT_TCP_NODELAY            , bool     }
  #{setopt CURLOPT_ADDRESS_SCOPE          , int      }
  #{setopt CURLOPT_TCP_KEEPALIVE          , bool     } |7250:----|
  #{setopt CURLOPT_TCP_KEEPIDLE           , int      } |7250:----|
  #{setopt CURLOPT_TCP_KEEPINTVL          , int      } |7250:----|

  ---- NAMES and PASSWORDS OPTIONS (Authentication) ---------------------------
  #{setopt CURLOPT_NETRC                  , enum     }
  #{setopt CURLOPT_NETRC_FILE             , string   }
  #{setopt CURLOPT_USERPWD                , string   }
  #{setopt CURLOPT_PROXYUSERPWD           , string   }
  #{setopt CURLOPT_USERNAME               , string   }
  #{setopt CURLOPT_PASSWORD               , string   }
  #{setopt CURLOPT_PROXYUSERNAME          , string   }
  #{setopt CURLOPT_PROXYPASSWORD          , string   }
  #{setopt CURLOPT_HTTPAUTH               , enum     }
  #{setopt CURLOPT_TLSAUTH_TYPE           , string   } |7214:----|
  #{setopt CURLOPT_TLSAUTH_USERNAME       , string   } |7214:----|
  #{setopt CURLOPT_TLSAUTH_PASSWORD       , string   } |7214:----|
  #{setopt CURLOPT_PROXYAUTH              , enum     }

  ---- HTTP OPTIONS -----------------------------------------------------------
  #{setopt CURLOPT_AUTOREFERER            , bool     }
  #{setopt CURLOPT_ENCODING               , string   } |----:7215|
  #{setopt CURLOPT_ACCEPT_ENCODING        , string   } |7216:----|
  #{setopt CURLOPT_TRANSFER_ENCODING      , bool     } |7216:----|
  #{setopt CURLOPT_FOLLOWLOCATION         , bool     }
  #{setopt CURLOPT_UNRESTRICTED_AUTH      , bool     }
  #{setopt CURLOPT_MAXREDIRS              , int      }
  #{setopt CURLOPT_POSTREDIR              , enum     }
  #{setopt CURLOPT_PUT                    , bool     }
  #{setopt CURLOPT_POST                   , bool     }
  -- #{setopt CURLOPT_POSTFIELDS             , buffer   }
  #{setopt CURLOPT_POSTFIELDSIZE          , int      }
  #{setopt CURLOPT_POSTFIELDSIZE_LARGE    , int64    }
  #{setopt CURLOPT_COPYPOSTFIELDS         , string   }
  -- CURLOPT_HTTPPOST
  #{setopt CURLOPT_REFERER                , string   }
  #{setopt CURLOPT_USERAGENT              , string   }
  -- #{setopt CURLOPT_HTTPHEADER             , slist    }
  -- #{setopt CURLOPT_HTTP200ALIASES         , slist    }
  #{setopt CURLOPT_COOKIE                 , string   }
  #{setopt CURLOPT_COOKIEFILE             , string   }
  #{setopt CURLOPT_COOKIEJAR              , string   }
  #{setopt CURLOPT_COOKIESESSION          , bool     }
  #{setopt CURLOPT_COOKIELIST             , string   }
  #{setopt CURLOPT_HTTPGET                , bool     }
  #{setopt CURLOPT_HTTP_VERSION           , enum     }
  #{setopt CURLOPT_IGNORE_CONTENT_LENGTH  , bool     }
  #{setopt CURLOPT_HTTP_CONTENT_DECODING  , bool     }
  #{setopt CURLOPT_HTTP_TRANSFER_DECODING , bool     }

  ---- SMTP OPTIONS -----------------------------------------------------------
  #{setopt CURLOPT_MAIL_FROM              , string   }
  -- #{setopt CURLOPT_MAIL_RCTP              , slist    }
  #{setopt CURLOPT_MAIL_AUTH              , string   } |7250:----|

  ---- TFTP OPTIONS -----------------------------------------------------------
  #{setopt CURLOPT_TFTP_BLKSIZE           , int      }

  ---- FTP OPTIONS ------------------------------------------------------------
  #{setopt CURLOPT_FTPPORT                , string   }
  -- #{setopt CURLOPT_QUOTE                  , slist    }
  -- #{setopt CURLOPT_POSTQUOTE              , slist    }
  -- #{setopt CURLOPT_PREQUOTE               , slist    }
  #{setopt CURLOPT_DIRLISTONLY            , bool     }
  #{setopt CURLOPT_APPEND                 , bool     }
  #{setopt CURLOPT_FTP_USE_EPRT           , bool     }
  #{setopt CURLOPT_FTP_USE_EPSV           , bool     }
  #{setopt CURLOPT_FTP_USE_PRET           , bool     }
  #{setopt CURLOPT_FTP_CREATE_MISSING_DIRS, enum     }
  #{setopt CURLOPT_FTP_RESPONSE_TIMEOUT   , int      }
  #{setopt CURLOPT_FTP_ALTERNATIVE_TO_USER, string   }
  #{setopt CURLOPT_FTP_SKIP_PASV_IP       , bool     }
  #{setopt CURLOPT_FTPSSLAUTH             , enum     }
  #{setopt CURLOPT_FTP_SSL_CCC            , enum     }
  #{setopt CURLOPT_FTP_ACCOUNT            , string   }
  #{setopt CURLOPT_FTP_FILEMETHOD         , enum     }

  ---- RTSP OPTIONS -----------------------------------------------------------
  #{setopt CURLOPT_RTSP_REQUEST           , enum     }
  #{setopt CURLOPT_RTSP_SESSION_ID        , string   }
  #{setopt CURLOPT_RTSP_STREAM_URI        , string   }
  #{setopt CURLOPT_RTSP_TRANSPORT         , string   }
  -- #{setopt CURLOPT_RTSP_HEADER            , slist    }
  #{setopt CURLOPT_RTSP_CLIENT_CSEQ       , int      }
  #{setopt CURLOPT_RTSP_SERVER_CSEQ       , int      }

  ---- PROTOCOL OPTIONS -------------------------------------------------------
  #{setopt CURLOPT_TRANSFERTEXT           , bool     }
  #{setopt CURLOPT_PROXY_TRANSFER_MODE    , bool     }
  #{setopt CURLOPT_CRLF                   , bool     }
  #{setopt CURLOPT_RANGE                  , string   }
  #{setopt CURLOPT_RESUME_FROM            , int      }
  #{setopt CURLOPT_RESUME_FROM_LARGE      , int64    }
  #{setopt CURLOPT_CUSTOMREQUEST          , string   }
  #{setopt CURLOPT_FILETIME               , bool     }
  #{setopt CURLOPT_NOBODY                 , bool     }
  #{setopt CURLOPT_INFILESIZE             , int      }
  #{setopt CURLOPT_INFILESIZE_LARGE       , int64    }
  #{setopt CURLOPT_UPLOAD                 , bool     }
  #{setopt CURLOPT_MAXFILESIZE            , int      }
  #{setopt CURLOPT_MAXFILESIZE_LARGE      , int64    }
  #{setopt CURLOPT_TIMECONDITION          , enum     }
  #{setopt CURLOPT_TIMEVALUE              , time     }

  ---- CONNECTION OPTIONS -----------------------------------------------------
  #{setopt CURLOPT_TIMEOUT                , int      }
  #{setopt CURLOPT_TIMEOUT_MS             , int      }
  #{setopt CURLOPT_LOW_SPEED_LIMIT        , int      }
  #{setopt CURLOPT_LOW_SPEED_TIME         , int      }
  #{setopt CURLOPT_MAX_SEND_SPEED_LARGE   , int64    }
  #{setopt CURLOPT_MAX_RECV_SPEED_LARGE   , int64    }
  #{setopt CURLOPT_MAXCONNECTS            , int      }
  #{setopt CURLOPT_CLOSEPOLICY            , enum     }
  #{setopt CURLOPT_FRESH_CONNECT          , bool     }
  #{setopt CURLOPT_FORBID_REUSE           , bool     }
  #{setopt CURLOPT_CONNECTTIMEOUT         , int      }
  #{setopt CURLOPT_CONNECTTIMEOUT_MS      , int      }
  #{setopt CURLOPT_IPRESOLVE              , enum     }
  #{setopt CURLOPT_CONNECT_ONLY           , bool     }
  #{setopt CURLOPT_USE_SSL                , enum     }
  -- #{setopt CURLOPT_RESOLVE                , slist    } |7213:----|
  #{setopt CURLOPT_DNS_SERVERS            , string   } |7240:----|
  #{setopt CURLOPT_ACCEPTTIMEOUT_MS       , int      } |7240:----|

  ---- SSL and SECURITY OPTIONS -----------------------------------------------
  #{setopt CURLOPT_SSLCERT                , string   }
  #{setopt CURLOPT_SSLCERTTYPE            , string   }
  #{setopt CURLOPT_SSLKEY                 , string   }
  #{setopt CURLOPT_SSLKEYTYPE             , string   }
  #{setopt CURLOPT_KEYPASSWD              , string   }
  #{setopt CURLOPT_SSLENGINE              , string   }
  #{setopt CURLOPT_SSLENGINE_DEFAULT      , bool     }
  #{setopt CURLOPT_SSLVERSION             , enum     }
  #{setopt CURLOPT_SSL_VERIFYPEER         , bool     }
  #{setopt CURLOPT_CAINFO                 , string   }
  #{setopt CURLOPT_ISSUERCERT             , string   }
  #{setopt CURLOPT_CAPATH                 , string   }
  #{setopt CURLOPT_CRLFILE                , string   }
  #{setopt CURLOPT_SSL_VERIFYHOST         , int      }
  #{setopt CURLOPT_CERTINFO               , bool     }
  #{setopt CURLOPT_RANDOM_FILE            , string   }
  #{setopt CURLOPT_EGDSOCKET              , string   }
  #{setopt CURLOPT_SSL_CIPHER_LIST        , string   }
  #{setopt CURLOPT_SSL_SESSIONID_CACHE    , bool     }
  #{setopt CURLOPT_SSL_OPTIONS            , enum     } |7250:----|
  #{setopt CURLOPT_KRBLEVEL               , string   }
  #{setopt CURLOPT_GSSAPI_DELEGATION      , enum     } |7220:----|

  ---- SSH OPTIONS ------------------------------------------------------------
  #{setopt CURLOPT_SSH_AUTH_TYPES         , enum     }
  #{setopt CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, string   }
  #{setopt CURLOPT_SSH_PUBLIC_KEYFILE     , string   }
  #{setopt CURLOPT_SSH_PRIVATE_KEYFILE    , string   }
  #{setopt CURLOPT_SSH_KNOWNHOSTS         , string   }
  -- CURLOPT_SSH_KEYFUNCTION
  -- CURLOPT_SSH_KEYDATA

  ---- OTHER OPTIONS ----------------------------------------------------------
  -- CURLOPT_PRIVATE
  -- CURLOPT_SHARE
  #{setopt CURLOPT_NEW_FILE_PERMS         , int      }
  #{setopt CURLOPT_NEW_DIRECTORY_PERMS    , int      }

  ---- TELNET OPTIONS ---------------------------------------------------------
  -- #{setopt CURLOPT_TELNETOPTIONS          , slist    }

  -----------------------------------------------------------------------------
  where
    string copt s = setopt'CString curl copt s
    int64  copt x = setopt'Int64   curl copt (fromIntegral   x)
    int    copt x = setopt'CLong   curl copt (fromIntegral   x)
    bool   copt x = setopt'CLong   curl copt (fromBool       x)
    time   copt x = setopt'CLong   curl copt (fromUTCTime    x)
    enum   copt x = setopt'CLong   curl copt (fromCURLenum   x)



-------------------------------------------------------------------------------
setopt'CString :: CURL -> CCURLoption'CString -> ByteString -> IO ()
setopt'CString curl copt val = useAsCString val $ \ptr ->
  withCODE $ ccurl_easy_setopt'CString (ccurlptr curl) copt ptr

setopt'Int64 :: CURL -> CCURLoption'Int64 -> CCURL_off_t -> IO ()
setopt'Int64 curl copt cval =
  withCODE $ ccurl_easy_setopt'Int64 (ccurlptr curl) copt cval

setopt'CLong :: CURL -> CCURLoption'CLong -> CLong -> IO ()
setopt'CLong curl copt cval =
  withCODE $ ccurl_easy_setopt'CLong (ccurlptr curl) copt cval


-------------------------------------------------------------------------------
so'FWRITE :: CURL -> Maybe CURL_write_callback -> IO ()
so'FWRITE curl mcb = makeCallback mcb (cb_write curl)
  (ccurl_easy_setopt'FWRITE (ccurlptr curl))
  (\cb -> wrap_ccurl_write_callback (write_callback cb))

write_callback :: CURL_write_callback -> CCURL_write_callback
write_callback fwrite ptr size nmemb _ = do
  stat <- packCStringLen (ptr, fromIntegral (size * nmemb)) >>= fwrite
  return $ case stat of
    CURL_WRITEFUNC_OK    -> (size * nmemb)
    CURL_WRITEFUNC_FAIL  -> 0
    CURL_WRITEFUNC_PAUSE -> cCURL_WRITEFUNC_PAUSE


-------------------------------------------------------------------------------
so'FREAD :: CURL -> Maybe CURL_read_callback -> IO ()
so'FREAD curl mcb = makeCallback mcb (cb_read curl)
  (ccurl_easy_setopt'FREAD (ccurlptr curl))
  (\cb -> wrap_ccurl_read_callback (read_callback cb))

read_callback :: CURL_read_callback -> CCURL_read_callback
read_callback fread buff size nmemb _ = do
  let buffLen = fromIntegral (size * nmemb)
  stat <- fread buffLen
  case stat of
    CURL_READFUNC_PAUSE -> return cCURL_READFUNC_PAUSE
    CURL_READFUNC_ABORT -> return cCURL_READFUNC_ABORT
    CURL_READFUNC_OK bs -> unsafeUseAsCStringLen (BS.take buffLen bs)
      (\(cs, cl) -> copyBytes buff cs cl >> return (fromIntegral cl))


-------------------------------------------------------------------------------
fromUTCTime :: UTCTime -> CLong
fromUTCTime = truncate . utcTimeToPOSIXSeconds


-------------------------------------------------------------------------------
#{let option opt = #opt " -> c" #opt}

class CURLenum a where
  fromCURLenum :: a -> CLong

instance CURLenum a => CURLenum [a] where
  fromCURLenum xs = foldl' (.|.) 0 $ map fromCURLenum xs

instance CURLenum CURLproto where
  fromCURLenum x = case x of
    #{option CURLPROTO_ALL   }
    #{option CURLPROTO_HTTP  }
    #{option CURLPROTO_HTTPS }
    #{option CURLPROTO_FTP   }
    #{option CURLPROTO_FTPS  }
    #{option CURLPROTO_SCP   }
    #{option CURLPROTO_SFTP  }
    #{option CURLPROTO_TELNET}
    #{option CURLPROTO_LDAP  }
    #{option CURLPROTO_LDAPS }
    #{option CURLPROTO_DICT  }
    #{option CURLPROTO_FILE  }
    #{option CURLPROTO_TFTP  }
    #{option CURLPROTO_IMAP  }
    #{option CURLPROTO_IMAPS }
    #{option CURLPROTO_POP3  }
    #{option CURLPROTO_POP3S }
    #{option CURLPROTO_SMTP  }
    #{option CURLPROTO_SMTPS }
    #{option CURLPROTO_RTSP  }
    #{option CURLPROTO_RTMP  } |7210:----|
    #{option CURLPROTO_RTMPT } |7210:----|
    #{option CURLPROTO_RTMPE } |7210:----|
    #{option CURLPROTO_RTMPTE} |7210:----|
    #{option CURLPROTO_RTMPS } |7210:----|
    #{option CURLPROTO_RTMPTS} |7210:----|
    #{option CURLPROTO_GOPHER} |7212:----|

instance CURLenum CURLproxy where
  fromCURLenum x = case x of
    #{option CURLPROXY_HTTP           }
    #{option CURLPROXY_HTTP_1_0       }
    #{option CURLPROXY_SOCKS4         }
    #{option CURLPROXY_SOCKS5         }
    #{option CURLPROXY_SOCKS4A        }
    #{option CURLPROXY_SOCKS5_HOSTNAME}

instance CURLenum CURLnetrc where
  fromCURLenum x = case x of
    #{option CURL_NETRC_IGNORED }
    #{option CURL_NETRC_OPTIONAL}
    #{option CURL_NETRC_REQUIRED}

instance CURLenum CURLauth where
  fromCURLenum x = case x of
    #{option CURLAUTH_BASIC       }
    #{option CURLAUTH_DIGEST      }
    #{option CURLAUTH_DIGEST_IE   }
    #{option CURLAUTH_GSSNEGOTIATE}
    #{option CURLAUTH_NTLM        }
    #{option CURLAUTH_NTLM_WB     } |7220:----|
    #{option CURLAUTH_ONLY        } |7213:----|
    #{option CURLAUTH_ANY         }
    #{option CURLAUTH_ANYSAFE     }

instance CURLenum CURLtlsauth where                              |7214:----|
  fromCURLenum x = case x of                                     |7214:----|
    #{option CURL_TLSAUTH_SRP}                                   |7214:----|

instance CURLenum CURLredir where
  fromCURLenum x = case x of
    #{option CURL_REDIR_GET_ALL }
    #{option CURL_REDIR_POST_301}
    #{option CURL_REDIR_POST_302}
    #{option CURL_REDIR_POST_ALL}

instance CURLenum CURLhttpver where
  fromCURLenum x = case x of
    #{option CURL_HTTP_VERSION_NONE}
    #{option CURL_HTTP_VERSION_1_0 }
    #{option CURL_HTTP_VERSION_1_1 }

instance CURLenum CURLftpcreate where
  fromCURLenum x = case x of
    #{option CURLFTP_CREATE_DIR_NONE }
    #{option CURLFTP_CREATE_DIR      }
    #{option CURLFTP_CREATE_DIR_RETRY}

instance CURLenum CURLftpauth where
  fromCURLenum x = case x of
    #{option CURLFTPAUTH_DEFAULT}
    #{option CURLFTPAUTH_SSL    }
    #{option CURLFTPAUTH_TLS    }

instance CURLenum CURLftpssl where
  fromCURLenum x = case x of
    #{option CURLFTPSSL_CCC_NONE   }
    #{option CURLFTPSSL_CCC_PASSIVE}
    #{option CURLFTPSSL_CCC_ACTIVE }

instance CURLenum CURLftpmethod where
  fromCURLenum x = case x of
    #{option CURLFTPMETHOD_DEFAULT  }
    #{option CURLFTPMETHOD_MULTICWD }
    #{option CURLFTPMETHOD_NOCWD    }
    #{option CURLFTPMETHOD_SINGLECWD}

instance CURLenum CURLrtspreq where
  fromCURLenum x = case x of
    #{option CURL_RTSPREQ_OPTIONS      }
    #{option CURL_RTSPREQ_DESCRIBE     }
    #{option CURL_RTSPREQ_ANNOUNCE     }
    #{option CURL_RTSPREQ_SETUP        }
    #{option CURL_RTSPREQ_PLAY         }
    #{option CURL_RTSPREQ_PAUSE        }
    #{option CURL_RTSPREQ_TEARDOWN     }
    #{option CURL_RTSPREQ_GET_PARAMETER}
    #{option CURL_RTSPREQ_SET_PARAMETER}
    #{option CURL_RTSPREQ_RECORD       }
    #{option CURL_RTSPREQ_RECEIVE      }

instance CURLenum CURLtimecond where
  fromCURLenum x = case x of
    #{option CURL_TIMECOND_NONE        }
    #{option CURL_TIMECOND_IFMODSINCE  }
    #{option CURL_TIMECOND_IFUNMODSINCE}
    #{option CURL_TIMECOND_LASTMOD     }

instance CURLenum CURLclosepol where
  fromCURLenum x = case x of
    #{option CURLCLOSEPOLICY_NONE               }
    #{option CURLCLOSEPOLICY_OLDEST             }
    #{option CURLCLOSEPOLICY_LEAST_RECENTLY_USED}
    #{option CURLCLOSEPOLICY_LEAST_TRAFFIC      }
    #{option CURLCLOSEPOLICY_SLOWEST            }
    #{option CURLCLOSEPOLICY_CALLBACK           }

instance CURLenum CURLipresolve where
  fromCURLenum x = case x of
    #{option CURL_IPRESOLVE_WHATEVER}
    #{option CURL_IPRESOLVE_V4      }
    #{option CURL_IPRESOLVE_V6      }

instance CURLenum CURLusessl where
  fromCURLenum x = case x of
    #{option CURLUSESSL_NONE   }
    #{option CURLUSESSL_TRY    }
    #{option CURLUSESSL_CONTROL}
    #{option CURLUSESSL_ALL    }

instance CURLenum CURLsslver where
  fromCURLenum x = case x of
    #{option CURL_SSLVERSION_DEFAULT}
    #{option CURL_SSLVERSION_TLSv1  }
    #{option CURL_SSLVERSION_SSLv2  }
    #{option CURL_SSLVERSION_SSLv3  }

instance CURLenum CURLsslopt where                               |7250:----|
  fromCURLenum x = case x of                                     |7250:----|
    #{option CURLSSLOPT_ALLOW_BEAST}                             |7250:----|

instance CURLenum CURLgssapi where                               |7220:----|
  fromCURLenum x = case x of                                     |7220:----|
    #{option CURLGSSAPI_DELEGATION_NONE       }                  |7220:----|
    #{option CURLGSSAPI_DELEGATION_POLICY_FLAG}                  |7220:----|
    #{option CURLGSSAPI_DELEGATION_FLAG       }                  |7220:----|

instance CURLenum CURLsshauth where
  fromCURLenum x = case x of
    #{option CURLSSH_AUTH_ANY      }
    #{option CURLSSH_AUTH_NONE     }
    #{option CURLSSH_AUTH_PUBLICKEY}
    #{option CURLSSH_AUTH_PASSWORD }
    #{option CURLSSH_AUTH_HOST     }
    #{option CURLSSH_AUTH_KEYBOARD }
    #{option CURLSSH_AUTH_DEFAULT  }