const curllib = (func(): string =
when defined(windows): return "libcurl.dll"
elif defined(macos): return "libcurl(|.4|.4.8.0).dylib"
else: return "libcurl.so(|.4|.4.8.0)" # assume posix
)()
const
CURL_GLOBAL_SSL* = 1 shl 0 # no purpose since 7.57.0
CURL_GLOBAL_WIN32* = 1 shl 1
CURL_GLOBAL_ALL* = CURL_GLOBAL_SSL or CURL_GLOBAL_WIN32
CURL_GLOBAL_NOTHING* = 0
CURL_GLOBAL_DEFAULT* = CURL_GLOBAL_ALL
CURL_GLOBAL_ACK_EINTR* = 1 shl 2
const
CURLOPTTYPE_LONG = 0
CURLOPTTYPE_OBJECTPOINT = 10000
CURLOPTTYPE_FUNCTIONPOINT = 20000
CURLOPTTYPE_OFF_T = 30000
CURLOPTTYPE_BLOB = 40000
const
CURLOPTTYPE_STRINGPOINT = CURLOPTTYPE_OBJECTPOINT
CURLOPTTYPE_SLISTPOINT = CURLOPTTYPE_OBJECTPOINT
CURLOPTTYPE_CBPOINT = CURLOPTTYPE_OBJECTPOINT
CURLOPTTYPE_VALUES = CURLOPTTYPE_LONG
const
CURLINFO_STRING = 0x100000
CURLINFO_LONG = 0x200000
CURLINFO_DOUBLE = 0x300000
CURLINFO_SLIST = 0x400000
CURLINFO_PTR = 0x400000 # same as SLIST
CURLINFO_SOCKET = 0x500000
CURLINFO_OFF_T = 0x600000
CURLINFO_MASK {.used.} = 0x0fffff
CURLINFO_TYPEMASK {.used.} = 0xf00000
{.push cdecl, dynlib: curllib.}
type
CURL* = pointer
curl_mime_struct = object
curl_mime* = ptr curl_mime_struct
curl_mimepart_struct = object
curl_mimepart* = ptr curl_mimepart_struct
curl_slist_struct = object
curl_slist* = ptr curl_slist_struct
CURLoption* {.size: sizeof(cint).} = enum
# Long
CURLOPT_PORT = CURLOPTTYPE_LONG + 3
CURLOPT_SSLVERSION = CURLOPTTYPE_VALUES + 32
CURLOPT_TIMECONDITION = CURLOPTTYPE_VALUES + 33
CURLOPT_POST = CURLOPTTYPE_LONG + 47
CURLOPT_FOLLOWLOCATION = CURLOPTTYPE_LONG + 52
CURLOPT_POSTFIELDSIZE = CURLOPTTYPE_LONG + 60
CURLOPT_HTTPGET = CURLOPTTYPE_LONG + 80
CURLOPT_CONNECT_ONLY = CURLOPTTYPE_LONG + 141
# Objectpoint
CURLOPT_WRITEDATA = CURLOPTTYPE_CBPOINT + 1
CURLOPT_URL = CURLOPTTYPE_STRINGPOINT + 2
CURLOPT_POSTFIELDS = CURLOPTTYPE_OBJECTPOINT + 15
CURLOPT_HTTPHEADER = CURLOPTTYPE_SLISTPOINT + 23
CURLOPT_HEADERDATA = CURLOPTTYPE_CBPOINT + 29
CURLOPT_MIMEPOST = CURLOPTTYPE_OBJECTPOINT + 269
# Functionpoint
CURLOPT_WRITEFUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 11
CURLOPT_READFUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 12
CURLOPT_HEADERFUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 79
# Off-t
CURLOPT_INFILESIZE_LARGE = CURLOPTTYPE_OFF_T + 115
CURLOPT_RESUME_FROM_LARGE = CURLOPTTYPE_OFF_T + 116
# Blob
CURLOPT_SSLCERT_BLOB = CURLOPTTYPE_BLOB + 291
CURLOPT_SSLKEY_BLOB = CURLOPTTYPE_BLOB + 292
CURLOPT_PROXY_SSLCERT_BLOB = CURLOPTTYPE_BLOB + 293
CURLOPT_PROXY_SSLKEY_BLOB = CURLOPTTYPE_BLOB + 294
CURLOPT_ISSUECERT_BLOB = CURLOPTTYPE_BLOB + 295
CURLINFO* {.size: sizeof(cint).} = enum
CURLINFO_NONE # first, never use this
# String
CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31
# Long
CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2
# Double
CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3
# S-list
CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27
CURLINFO_COOKIELIST = CURLINFO_SLIST + 28
# Pointer
CURLINFO_CERTINFO = CURLINFO_PTR + 34
CURLINFO_TLS_SESSION = CURLINFO_PTR + 43
CURLINFO_TLS_SSL_PTR = CURLINFO_PTR + 45
# Socket
CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44
# Off_t
CURLINFO_SIZE_UPLOAD_T = CURLINFO_OFF_T + 7
CURLINFO_SIZE_DOWNLOAD_T = CURLINFO_OFF_T + 9
CURLcode* {.size: sizeof(cint).} = enum
CURLE_OK = 0,
CURLE_UNSUPPORTED_PROTOCOL, # 1
CURLE_FAILED_INIT, # 2
CURLE_URL_MALFORMAT, # 3
CURLE_NOT_BUILT_IN, # 4 - [was obsoleted in August 2007 for
# 7.17.0, reused in April 2011 for 7.21.5]
CURLE_COULDNT_RESOLVE_PROXY, # 5
CURLE_COULDNT_RESOLVE_HOST, # 6
CURLE_COULDNT_CONNECT, # 7
CURLE_WEIRD_SERVER_REPLY, # 8
CURLE_REMOTE_ACCESS_DENIED, # 9 a service was denied by the server
# due to lack of access - when login fails
# this is not returned.
CURLE_FTP_ACCEPT_FAILED, # 10 - [was obsoleted in April 2006 for
# 7.15.4, reused in Dec 2011 for 7.24.0]
CURLE_FTP_WEIRD_PASS_REPLY, # 11
CURLE_FTP_ACCEPT_TIMEOUT, # 12 - timeout occurred accepting server
# [was obsoleted in August 2007 for 7.17.0,
# reused in Dec 2011 for 7.24.0]
CURLE_FTP_WEIRD_PASV_REPLY, # 13
CURLE_FTP_WEIRD_227_FORMAT, # 14
CURLE_FTP_CANT_GET_HOST, # 15
CURLE_HTTP2, # 16 - A problem in the http2 framing layer.
# [was obsoleted in August 2007 for 7.17.0,
# reused in July 2014 for 7.38.0]
CURLE_FTP_COULDNT_SET_TYPE, # 17
CURLE_PARTIAL_FILE, # 18
CURLE_FTP_COULDNT_RETR_FILE, # 19
CURLE_OBSOLETE20, # 20 - NOT USED
CURLE_QUOTE_ERROR, # 21 - quote command failure
CURLE_HTTP_RETURNED_ERROR, # 22
CURLE_WRITE_ERROR, # 23
CURLE_OBSOLETE24, # 24 - NOT USED
CURLE_UPLOAD_FAILED, # 25 - failed upload "command"
CURLE_READ_ERROR, # 26 - couldn't open/read from file
CURLE_OUT_OF_MEMORY, # 27
CURLE_OPERATION_TIMEDOUT, # 28 - the timeout time was reached
CURLE_OBSOLETE29, # 29 - NOT USED
CURLE_FTP_PORT_FAILED, # 30 - FTP PORT operation failed
CURLE_FTP_COULDNT_USE_REST, # 31 - the REST command failed
CURLE_OBSOLETE32, # 32 - NOT USED
CURLE_RANGE_ERROR, # 33 - RANGE "command" didn't work
CURLE_HTTP_POST_ERROR, # 34
CURLE_SSL_CONNECT_ERROR, # 35 - wrong when connecting with SSL
CURLE_BAD_DOWNLOAD_RESUME, # 36 - couldn't resume download
CURLE_FILE_COULDNT_READ_FILE, # 37
CURLE_LDAP_CANNOT_BIND, # 38
CURLE_LDAP_SEARCH_FAILED, # 39
CURLE_OBSOLETE40, # 40 - NOT USED
CURLE_FUNCTION_NOT_FOUND, # 41 - NOT USED starting with 7.53.0
CURLE_ABORTED_BY_CALLBACK, # 42
CURLE_BAD_FUNCTION_ARGUMENT, # 43
CURLE_OBSOLETE44, # 44 - NOT USED
CURLE_INTERFACE_FAILED, # 45 - CURLOPT_INTERFACE failed
CURLE_OBSOLETE46, # 46 - NOT USED
CURLE_TOO_MANY_REDIRECTS, # 47 - catch endless re-direct loops
CURLE_UNKNOWN_OPTION, # 48 - User specified an unknown option
CURLE_SETOPT_OPTION_SYNTAX, # 49 - Malformed setopt option
CURLE_OBSOLETE50, # 50 - NOT USED
CURLE_OBSOLETE51, # 51 - NOT USED
CURLE_GOT_NOTHING, # 52 - when this is a specific error
CURLE_SSL_ENGINE_NOTFOUND, # 53 - SSL crypto engine not found
CURLE_SSL_ENGINE_SETFAILED, # 54 - can not set SSL crypto engine as
# default
CURLE_SEND_ERROR, # 55 - failed sending network data
CURLE_RECV_ERROR, # 56 - failure in receiving network data
CURLE_OBSOLETE57, # 57 - NOT IN USE
CURLE_SSL_CERTPROBLEM, # 58 - problem with the local certificate
CURLE_SSL_CIPHER, # 59 - couldn't use specified cipher
CURLE_PEER_FAILED_VERIFICATION, # 60 - peer's certificate or fingerprint
# wasn't verified fine
CURLE_BAD_CONTENT_ENCODING, # 61 - Unrecognized/bad encoding
CURLE_OBSOLETE62, # 62 - NOT IN USE since 7.82.0
CURLE_FILESIZE_EXCEEDED, # 63 - Maximum file size exceeded
CURLE_USE_SSL_FAILED, # 64 - Requested FTP SSL level failed
CURLE_SEND_FAIL_REWIND, # 65 - Sending the data requires a rewind
# that failed
CURLE_SSL_ENGINE_INITFAILED, # 66 - failed to initialise ENGINE
CURLE_LOGIN_DENIED, # 67 - user, password or similar was not
# accepted and we failed to login
CURLE_TFTP_NOTFOUND, # 68 - file not found on server
CURLE_TFTP_PERM, # 69 - permission problem on server
CURLE_REMOTE_DISK_FULL, # 70 - out of disk space on server
CURLE_TFTP_ILLEGAL, # 71 - Illegal TFTP operation
CURLE_TFTP_UNKNOWNID, # 72 - Unknown transfer ID
CURLE_REMOTE_FILE_EXISTS, # 73 - File already exists
CURLE_TFTP_NOSUCHUSER, # 74 - No such user
CURLE_CONV_FAILED, # 75 - conversion failed
CURLE_OBSOLETE76, # 76 - NOT IN USE since 7.82.0
CURLE_SSL_CACERT_BADFILE, # 77 - could not load CACERT file, missing
# or wrong format
CURLE_REMOTE_FILE_NOT_FOUND, # 78 - remote file not found
CURLE_SSH, # 79 - error from the SSH layer, somewhat
# generic so the error message will be of
# interest when this has happened
CURLE_SSL_SHUTDOWN_FAILED, # 80 - Failed to shut down the SSL
# connection
CURLE_AGAIN, # 81 - socket is not ready for send/recv,
# wait till it's ready and try again (Added
# in 7.18.2)
CURLE_SSL_CRL_BADFILE, # 82 - could not load CRL file, missing or
# wrong format (Added in 7.19.0)
CURLE_SSL_ISSUER_ERROR, # 83 - Issuer check failed. (Added in
# 7.19.0)
CURLE_FTP_PRET_FAILED, # 84 - a PRET command failed
CURLE_RTSP_CSEQ_ERROR, # 85 - mismatch of RTSP CSeq numbers
CURLE_RTSP_SESSION_ERROR, # 86 - mismatch of RTSP Session Ids
CURLE_FTP_BAD_FILE_LIST, # 87 - unable to parse FTP file list
CURLE_CHUNK_FAILED, # 88 - chunk callback reported error
CURLE_NO_CONNECTION_AVAILABLE, # 89 - No connection available, the
# session will be queued
CURLE_SSL_PINNEDPUBKEYNOTMATCH, # 90 - specified pinned public key did not
# match
CURLE_SSL_INVALIDCERTSTATUS, # 91 - invalid certificate status
CURLE_HTTP2_STREAM, # 92 - stream error in HTTP/2 framing layer
CURLE_RECURSIVE_API_CALL, # 93 - an api function was called from
# inside a callback
CURLE_AUTH_ERROR, # 94 - an authentication function returned an
# error
CURLE_HTTP3, # 95 - An HTTP/3 layer problem
CURLE_QUIC_CONNECT_ERROR, # 96 - QUIC connection error
CURLE_PROXY, # 97 - proxy handshake error
CURLE_SSL_CLIENTCERT, # 98 - client-side certificate required
CURLE_UNRECOVERABLE_POLL, # 99 - poll/select returned fatal error
CURL_LAST # never use!
{.push importc.}
proc curl_global_init*(flags: clong): CURLcode
proc curl_global_cleanup*()
proc curl_easy_init*(): CURL
proc curl_easy_cleanup*(handle: CURL)
proc curl_easy_setopt*(handle: CURL, option: CURLoption): CURLcode {.varargs.}
proc curl_easy_perform*(handle: CURL): CURLcode
proc curl_easy_getinfo*(handle: CURL, info: CURLINFO): CURLcode {.varargs.}
proc curl_mime_init*(handle: CURL): curl_mime
proc curl_mime_free*(mime: curl_mime)
proc curl_mime_addpart*(mime: curl_mime): curl_mimepart
proc curl_mime_name*(part: curl_mimepart, name: cstring)
proc curl_mime_data*(part: curl_mimepart, data: cstring, datasize: csize_t)
proc curl_mime_filename*(part: curl_mimepart, name: cstring)
proc curl_mime_filedata*(part: curl_mimepart, filename: cstring)
proc curl_slist_append*(slist: curl_slist, str: cstring): curl_slist
proc curl_slist_free_all*(slist: curl_slist)
{.pop.}
{.pop.}