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 const CURL_WAIT_POLLIN* = 0x0001 CURL_WAIT_POLLPRI* = 0x0002 CURL_WAIT_POLLOUT* = 0x0004 {.push cdecl, dynlib: curllib.} type CURL* = distinct pointer CURLM* = distinct 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 curl_socket_t = cint curl_waitfd* = object fd*: curl_socket_t events*: cshort revents*: cshort # this is, in fact, supported. CURLMsg_data {.union.} = object whatever: pointer result*: CURLcode CURLMsg_struct = object msg*: CURLMSG_E easy_handle*: CURL data*: CURLMsg_data CURLMsg* = ptr CURLMsg_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_PROXY = CURLOPTTYPE_STRINGPOINT + 4 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! CURLMcode* {.size: sizeof(cint).} = enum CURLM_CALL_MULTI_PERFORM = -1, # please call curl_multi_perform() or # curl_multi_socket*() soon CURLM_OK, CURLM_BAD_HANDLE, # the passed-in handle is not a valid CURLM handle CURLM_BAD_EASY_HANDLE, # an easy handle was not good/valid CURLM_OUT_OF_MEMORY, # if you ever get this, you're in deep sh*t CURLM_INTERNAL_ERROR, # this is a libcurl bug CURLM_BAD_SOCKET, # the passed in socket argument did not match CURLM_UNKNOWN_OPTION, # curl_multi_setopt() with unsupported option CURLM_ADDED_ALREADY, # an easy handle already added to a multi handle was # attempted to get added - again CURLM_RECURSIVE_API_CALL, # an api function was called from inside a # callback CURLM_WAKEUP_FAILURE, # wakeup is unavailable or failed CURLM_BAD_FUNCTION_ARGUMENT, # function called with a bad parameter CURLM_ABORTED_BY_CALLBACK, CURLM_UNRECOVERABLE_POLL, CURLM_LAST CURLMSG_E* {.size: sizeof(cint).} = enum CURLMSG_NONE # first, not used CURLMSG_DONE # This easy handle has completed. 'result' contains # the CURLcode of the transfer CURLMSG_LAST # last, not used proc `==`*(a: CURL, b: CURL): bool {.borrow.} proc `==`*(a: CURLM, b: CURLM): bool {.borrow.} {.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_easy_strerror*(errornum: CURLcode): cstring 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: pointer, 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) proc curl_multi_init*(): CURLM proc curl_multi_add_handle*(multi_handle: CURLM, curl_handle: CURL): CURLMcode proc curl_multi_remove_handle*(multi_handle: CURLM, curl_handle: CURL): CURLMcode proc curl_multi_fdset*(multi_handle: CURLM, read_fd_set, write_fd_set, exc_fd_set: pointer, max_fd: ptr cint): CURLMcode proc curl_multi_wait*(multi_handle: CURLM, extra_fds: ptr curl_waitfd, extra_nfds: cuint, timeout_ns: cint, ret: ptr cint): CURLMcode proc curl_multi_poll*(multi_handle: CURLM, extra_fds: ptr curl_waitfd, extra_nfds: cuint, timeout_ns: cint, ret: ptr cint): CURLMcode proc curl_multi_wakeup*(multi_handle: CURLM): CURLMcode proc curl_multi_perform*(multi_handle: CURLM, running_handles: ptr cint): CURLMcode proc curl_multi_cleanup*(multi_handle: CURLM): CURLMcode proc curl_multi_info_read*(multi_handle: CURLM, msgs_in_queue: ptr cint): CURLMsg proc curl_multi_strerror*(code: CURLMcode): cstring {.pop.} {.pop.}