about summary refs log tree commit diff stats
path: root/src/bindings/curl.nim
blob: 0a3f3fd02a152060d776f9c7e8fe3b8a410d6303 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
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.}