xref: /curl/docs/MANUAL.md (revision b7f2c66d)
1<!--
2Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
3
4SPDX-License-Identifier: curl
5-->
6
7# curl tutorial
8
9## Simple Usage
10
11Get the main page from a web-server:
12
13    curl https://www.example.com/
14
15Get a README file from an FTP server:
16
17    curl ftp://ftp.example.com/README
18
19Get a webpage from a server using port 8000:
20
21    curl http://www.example.com:8000/
22
23Get a directory listing of an FTP site:
24
25    curl ftp://ftp.example.com/
26
27Get the all terms matching curl from a dictionary:
28
29    curl dict://dict.example.com/m:curl
30
31Get the definition of curl from a dictionary:
32
33    curl dict://dict.example.com/d:curl
34
35Fetch two documents at once:
36
37    curl ftp://ftp.example.com/ http://www.example.com:8000/
38
39Get a file off an FTPS server:
40
41    curl ftps://files.are.example.com/secrets.txt
42
43or use the more appropriate FTPS way to get the same file:
44
45    curl --ftp-ssl ftp://files.are.example.com/secrets.txt
46
47Get a file from an SSH server using SFTP:
48
49    curl -u username sftp://example.com/etc/issue
50
51Get a file from an SSH server using SCP using a private key (not
52password-protected) to authenticate:
53
54    curl -u username: --key ~/.ssh/id_rsa scp://example.com/~/file.txt
55
56Get a file from an SSH server using SCP using a private key
57(password-protected) to authenticate:
58
59    curl -u username: --key ~/.ssh/id_rsa --pass private_key_password
60    scp://example.com/~/file.txt
61
62Get the main page from an IPv6 web server:
63
64    curl "http://[2001:1890:1112:1::20]/"
65
66Get a file from an SMB server:
67
68    curl -u "domain\username:passwd" smb://server.example.com/share/file.txt
69
70## Download to a File
71
72Get a webpage and store in a local file with a specific name:
73
74    curl -o thatpage.html http://www.example.com/
75
76Get a webpage and store in a local file, make the local file get the name of
77the remote document (if no filename part is specified in the URL, this fails):
78
79    curl -O http://www.example.com/index.html
80
81Fetch two files and store them with their remote names:
82
83    curl -O www.haxx.se/index.html -O curl.se/download.html
84
85## Using Passwords
86
87### FTP
88
89To ftp files using name and password, include them in the URL like:
90
91    curl ftp://name:passwd@ftp.server.example:port/full/path/to/file
92
93or specify them with the `-u` flag like
94
95    curl -u name:passwd ftp://ftp.server.example:port/full/path/to/file
96
97### FTPS
98
99It is just like for FTP, but you may also want to specify and use SSL-specific
100options for certificates etc.
101
102Note that using `FTPS://` as prefix is the *implicit* way as described in the
103standards while the recommended *explicit* way is done by using `FTP://` and
104the `--ssl-reqd` option.
105
106### SFTP / SCP
107
108This is similar to FTP, but you can use the `--key` option to specify a
109private key to use instead of a password. Note that the private key may itself
110be protected by a password that is unrelated to the login password of the
111remote system; this password is specified using the `--pass` option.
112Typically, curl automatically extracts the public key from the private key
113file, but in cases where curl does not have the proper library support, a
114matching public key file must be specified using the `--pubkey` option.
115
116### HTTP
117
118Curl also supports user and password in HTTP URLs, thus you can pick a file
119like:
120
121    curl http://name:passwd@http.server.example/full/path/to/file
122
123or specify user and password separately like in
124
125    curl -u name:passwd http://http.server.example/full/path/to/file
126
127HTTP offers many different methods of authentication and curl supports
128several: Basic, Digest, NTLM and Negotiate (SPNEGO). Without telling which
129method to use, curl defaults to Basic. You can also ask curl to pick the most
130secure ones out of the ones that the server accepts for the given URL, by
131using `--anyauth`.
132
133**Note**! According to the URL specification, HTTP URLs can not contain a user
134and password, so that style does not work when using curl via a proxy, even
135though curl allows it at other times. When using a proxy, you _must_ use the
136`-u` style for user and password.
137
138### HTTPS
139
140Probably most commonly used with private certificates, as explained below.
141
142## Proxy
143
144curl supports both HTTP and SOCKS proxy servers, with optional authentication.
145It does not have special support for FTP proxy servers since there are no
146standards for those, but it can still be made to work with many of them. You
147can also use both HTTP and SOCKS proxies to transfer files to and from FTP
148servers.
149
150Get an ftp file using an HTTP proxy named my-proxy that uses port 888:
151
152    curl -x my-proxy:888 ftp://ftp.example.com/README
153
154Get a file from an HTTP server that requires user and password, using the
155same proxy as above:
156
157    curl -u user:passwd -x my-proxy:888 http://www.example.com/
158
159Some proxies require special authentication. Specify by using -U as above:
160
161    curl -U user:passwd -x my-proxy:888 http://www.example.com/
162
163A comma-separated list of hosts and domains which do not use the proxy can be
164specified as:
165
166    curl --noproxy example.com -x my-proxy:888 http://www.example.com/
167
168If the proxy is specified with `--proxy1.0` instead of `--proxy` or `-x`, then
169curl uses HTTP/1.0 instead of HTTP/1.1 for any `CONNECT` attempts.
170
171curl also supports SOCKS4 and SOCKS5 proxies with `--socks4` and `--socks5`.
172
173See also the environment variables Curl supports that offer further proxy
174control.
175
176Most FTP proxy servers are set up to appear as a normal FTP server from the
177client's perspective, with special commands to select the remote FTP server.
178curl supports the `-u`, `-Q` and `--ftp-account` options that can be used to
179set up transfers through many FTP proxies. For example, a file can be uploaded
180to a remote FTP server using a Blue Coat FTP proxy with the options:
181
182    curl -u "username@ftp.server.example Proxy-Username:Remote-Pass"
183      --ftp-account Proxy-Password --upload-file local-file
184      ftp://my-ftp.proxy.example:21/remote/upload/path/
185
186See the manual for your FTP proxy to determine the form it expects to set up
187transfers, and curl's `-v` option to see exactly what curl is sending.
188
189## Piping
190
191Get a key file and add it with `apt-key` (when on a system that uses `apt` for
192package management):
193
194    curl -L https://apt.example.org/llvm-snapshot.gpg.key | sudo apt-key add -
195
196The '|' pipes the output to STDIN. `-` tells `apt-key` that the key file
197should be read from STDIN.
198
199## Ranges
200
201HTTP 1.1 introduced byte-ranges. Using this, a client can request to get only
202one or more sub-parts of a specified document. Curl supports this with the
203`-r` flag.
204
205Get the first 100 bytes of a document:
206
207    curl -r 0-99 http://www.example.com/
208
209Get the last 500 bytes of a document:
210
211    curl -r -500 http://www.example.com/
212
213Curl also supports simple ranges for FTP files as well. Then you can only
214specify start and stop position.
215
216Get the first 100 bytes of a document using FTP:
217
218    curl -r 0-99 ftp://www.example.com/README
219
220## Uploading
221
222### FTP / FTPS / SFTP / SCP
223
224Upload all data on stdin to a specified server:
225
226    curl -T - ftp://ftp.example.com/myfile
227
228Upload data from a specified file, login with user and password:
229
230    curl -T uploadfile -u user:passwd ftp://ftp.example.com/myfile
231
232Upload a local file to the remote site, and use the local filename at the
233remote site too:
234
235    curl -T uploadfile -u user:passwd ftp://ftp.example.com/
236
237Upload a local file to get appended to the remote file:
238
239    curl -T localfile -a ftp://ftp.example.com/remotefile
240
241Curl also supports ftp upload through a proxy, but only if the proxy is
242configured to allow that kind of tunneling. If it does, you can run curl in a
243fashion similar to:
244
245    curl --proxytunnel -x proxy:port -T localfile ftp.example.com
246
247### SMB / SMBS
248
249    curl -T file.txt -u "domain\username:passwd"
250      smb://server.example.com/share/
251
252### HTTP
253
254Upload all data on stdin to a specified HTTP site:
255
256    curl -T - http://www.example.com/myfile
257
258Note that the HTTP server must have been configured to accept PUT before this
259can be done successfully.
260
261For other ways to do HTTP data upload, see the POST section below.
262
263## Verbose / Debug
264
265If curl fails where it is not supposed to, if the servers do not let you in,
266if you cannot understand the responses: use the `-v` flag to get verbose
267fetching. Curl outputs lots of info and what it sends and receives in order to
268let the user see all client-server interaction (but it does not show you the
269actual data).
270
271    curl -v ftp://ftp.example.com/
272
273To get even more details and information on what curl does, try using the
274`--trace` or `--trace-ascii` options with a given filename to log to, like
275this:
276
277    curl --trace trace.txt www.haxx.se
278
279
280## Detailed Information
281
282Different protocols provide different ways of getting detailed information
283about specific files/documents. To get curl to show detailed information about
284a single file, you should use `-I`/`--head` option. It displays all available
285info on a single file for HTTP and FTP. The HTTP information is a lot more
286extensive.
287
288For HTTP, you can get the header information (the same as `-I` would show)
289shown before the data by using `-i`/`--include`. Curl understands the
290`-D`/`--dump-header` option when getting files from both FTP and HTTP, and it
291then stores the headers in the specified file.
292
293Store the HTTP headers in a separate file (headers.txt in the example):
294
295      curl --dump-header headers.txt curl.se
296
297Note that headers stored in a separate file can be useful at a later time if
298you want curl to use cookies sent by the server. More about that in the
299cookies section.
300
301## POST (HTTP)
302
303It is easy to post data using curl. This is done using the `-d <data>` option.
304The post data must be urlencoded.
305
306Post a simple `name` and `phone` guestbook.
307
308    curl -d "name=Rafael%20Sagula&phone=3320780" http://www.example.com/guest.cgi
309
310Or automatically [URL encode the data](https://everything.curl.dev/http/post/url-encode).
311
312    curl --data-urlencode "name=Rafael Sagula&phone=3320780"
313      http://www.example.com/guest.cgi
314
315How to post a form with curl, lesson #1:
316
317Dig out all the `<input>` tags in the form that you want to fill in.
318
319If there is a normal post, you use `-d` to post. `-d` takes a full post
320string, which is in the format
321
322    <variable1>=<data1>&<variable2>=<data2>&...
323
324The variable names are the names set with `"name="` in the `<input>` tags, and
325the data is the contents you want to fill in for the inputs. The data *must*
326be properly URL encoded. That means you replace space with + and that you
327replace weird letters with `%XX` where `XX` is the hexadecimal representation
328of the letter's ASCII code.
329
330Example:
331
332(say if `http://example.com` had the following html)
333
334```html
335<form action="post.cgi" method="post">
336  <input name=user size=10>
337  <input name=pass type=password size=10>
338  <input name=id type=hidden value="blablabla">
339  <input name=ding value="submit">
340</form>
341```
342
343We want to enter user `foobar` with password `12345`.
344
345To post to this, you would enter a curl command line like:
346
347    curl -d "user=foobar&pass=12345&id=blablabla&ding=submit"
348      http://example.com/post.cgi
349
350While `-d` uses the application/x-www-form-urlencoded mime-type, generally
351understood by CGI's and similar, curl also supports the more capable
352multipart/form-data type. This latter type supports things like file upload.
353
354`-F` accepts parameters like `-F "name=contents"`. If you want the contents to
355be read from a file, use `@filename` as contents. When specifying a file, you
356can also specify the file content type by appending `;type=<mime type>` to the
357filename. You can also post the contents of several files in one field.  For
358example, the field name `coolfiles` is used to send three files, with
359different content types using the following syntax:
360
361    curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html"
362      http://www.example.com/postit.cgi
363
364If the content-type is not specified, curl tries to guess from the file
365extension (it only knows a few), or use the previously specified type (from an
366earlier file if several files are specified in a list) or else it uses the
367default type `application/octet-stream`.
368
369Emulate a fill-in form with `-F`. Let's say you fill in three fields in a
370form. One field is a filename which to post, one field is your name and one
371field is a file description. We want to post the file we have written named
372`cooltext.txt`. To let curl do the posting of this data instead of your
373favorite browser, you have to read the HTML source of the form page and find
374the names of the input fields. In our example, the input field names are
375`file`, `yourname` and `filedescription`.
376
377    curl -F "file=@cooltext.txt" -F "yourname=Daniel"
378      -F "filedescription=Cool text file with cool text inside"
379      http://www.example.com/postit.cgi
380
381To send two files in one post you can do it in two ways:
382
383Send multiple files in a single field with a single field name:
384
385    curl -F "pictures=@dog.gif,cat.gif" $URL
386
387Send two fields with two field names
388
389    curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif" $URL
390
391To send a field value literally without interpreting a leading `@` or `<`, or
392an embedded `;type=`, use `--form-string` instead of `-F`. This is recommended
393when the value is obtained from a user or some other unpredictable
394source. Under these circumstances, using `-F` instead of `--form-string` could
395allow a user to trick curl into uploading a file.
396
397## Referrer
398
399An HTTP request has the option to include information about which address
400referred it to the actual page. curl allows you to specify the referrer to be
401used on the command line. It is especially useful to fool or trick stupid
402servers or CGI scripts that rely on that information being available or
403contain certain data.
404
405    curl -e www.example.org http://www.example.com/
406
407## User Agent
408
409An HTTP request has the option to include information about the browser that
410generated the request. Curl allows it to be specified on the command line. It
411is especially useful to fool or trick stupid servers or CGI scripts that only
412accept certain browsers.
413
414Example:
415
416    curl -A 'Mozilla/3.0 (Win95; I)' http://www.bank.example.com/
417
418Other common strings:
419
420- `Mozilla/3.0 (Win95; I)` - Netscape Version 3 for Windows 95
421- `Mozilla/3.04 (Win95; U)` - Netscape Version 3 for Windows 95
422- `Mozilla/2.02 (OS/2; U)` - Netscape Version 2 for OS/2
423- `Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)` - Netscape for AIX
424- `Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)` - Netscape for Linux
425
426Note that Internet Explorer tries hard to be compatible in every way:
427
428- `Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)` - MSIE for W95
429
430Mozilla is not the only possible User-Agent name:
431
432- `Konqueror/1.0` - KDE File Manager desktop client
433- `Lynx/2.7.1 libwww-FM/2.14` - Lynx command line browser
434
435## Cookies
436
437Cookies are generally used by web servers to keep state information at the
438client's side. The server sets cookies by sending a response line in the
439headers that looks like `Set-Cookie: <data>` where the data part then
440typically contains a set of `NAME=VALUE` pairs (separated by semicolons `;`
441like `NAME1=VALUE1; NAME2=VALUE2;`). The server can also specify for what path
442the cookie should be used for (by specifying `path=value`), when the cookie
443should expire (`expire=DATE`), for what domain to use it (`domain=NAME`) and
444if it should be used on secure connections only (`secure`).
445
446If you have received a page from a server that contains a header like:
447
448```http
449Set-Cookie: sessionid=boo123; path="/foo";
450```
451
452it means the server wants that first pair passed on when we get anything in a
453path beginning with `/foo`.
454
455Example, get a page that wants my name passed in a cookie:
456
457    curl -b "name=Daniel" www.example.com
458
459Curl also has the ability to use previously received cookies in following
460sessions. If you get cookies from a server and store them in a file in a
461manner similar to:
462
463    curl --dump-header headers www.example.com
464
465... you can then in a second connect to that (or another) site, use the
466cookies from the `headers.txt` file like:
467
468    curl -b headers.txt www.example.com
469
470While saving headers to a file is a working way to store cookies, it is
471however error-prone and not the preferred way to do this. Instead, make curl
472save the incoming cookies using the well-known Netscape cookie format like
473this:
474
475    curl -c cookies.txt www.example.com
476
477Note that by specifying `-b` you enable the cookie engine and with `-L` you
478can make curl follow a `location:` (which often is used in combination with
479cookies). If a site sends cookies and a location field, you can use a
480non-existing file to trigger the cookie awareness like:
481
482    curl -L -b empty.txt www.example.com
483
484The file to read cookies from must be formatted using plain HTTP headers OR as
485Netscape's cookie file. Curl determines what kind it is based on the file
486contents. In the above command, curl parses the header and store the cookies
487received from www.example.com. curl sends the stored cookies which match the
488request to the server as it follows the location. The file `empty.txt` may be
489a nonexistent file.
490
491To read and write cookies from a Netscape cookie file, you can set both `-b`
492and `-c` to use the same file:
493
494    curl -b cookies.txt -c cookies.txt www.example.com
495
496## Progress Meter
497
498The progress meter exists to show a user that something actually is
499happening. The different fields in the output have the following meaning:
500
501    % Total    % Received % Xferd  Average Speed          Time             Curr.
502                                   Dload  Upload Total    Current  Left    Speed
503    0  151M    0 38608    0     0   9406      0  4:41:43  0:00:04  4:41:39  9287
504
505From left-to-right:
506
507 - `%`           - percentage completed of the whole transfer
508 - `Total`       - total size of the whole expected transfer
509 - `%`           - percentage completed of the download
510 - `Received`    - currently downloaded amount of bytes
511 - `%`           - percentage completed of the upload
512 - `Xferd`       - currently uploaded amount of bytes
513 - `Average Speed Dload` - the average transfer speed of the download
514 - `Average Speed Upload` - the average transfer speed of the upload
515 - `Time Total`  - expected time to complete the operation
516 - `Time Current` - time passed since the invoke
517 - `Time Left`   - expected time left to completion
518 - `Curr.Speed`  - the average transfer speed the last 5 seconds (the first
519                   5 seconds of a transfer is based on less time of course.)
520
521The `-#` option displays a totally different progress bar that does not need
522much explanation!
523
524## Speed Limit
525
526Curl allows the user to set the transfer speed conditions that must be met to
527let the transfer keep going. By using the switch `-y` and `-Y` you can make
528curl abort transfers if the transfer speed is below the specified lowest limit
529for a specified time.
530
531To have curl abort the download if the speed is slower than 3000 bytes per
532second for 1 minute, run:
533
534    curl -Y 3000 -y 60 www.far-away.example.com
535
536This can be used in combination with the overall time limit, so that the above
537operation must be completed in whole within 30 minutes:
538
539    curl -m 1800 -Y 3000 -y 60 www.far-away.example.com
540
541Forcing curl not to transfer data faster than a given rate is also possible,
542which might be useful if you are using a limited bandwidth connection and you
543do not want your transfer to use all of it (sometimes referred to as
544*bandwidth throttle*).
545
546Make curl transfer data no faster than 10 kilobytes per second:
547
548    curl --limit-rate 10K www.far-away.example.com
549
550or
551
552    curl --limit-rate 10240 www.far-away.example.com
553
554Or prevent curl from uploading data faster than 1 megabyte per second:
555
556    curl -T upload --limit-rate 1M ftp://uploads.example.com
557
558When using the `--limit-rate` option, the transfer rate is regulated on a
559per-second basis, which causes the total transfer speed to become lower than
560the given number. Sometimes of course substantially lower, if your transfer
561stalls during periods.
562
563## Config File
564
565Curl automatically tries to read the `.curlrc` file (or `_curlrc` file on
566Microsoft Windows systems) from the user's home directory on startup.
567
568The config file could be made up with normal command line switches, but you
569can also specify the long options without the dashes to make it more
570readable. You can separate the options and the parameter with spaces, or with
571`=` or `:`. Comments can be used within the file. If the first letter on a
572line is a `#`-symbol the rest of the line is treated as a comment.
573
574If you want the parameter to contain spaces, you must enclose the entire
575parameter within double quotes (`"`). Within those quotes, you specify a quote
576as `\"`.
577
578NOTE: You must specify options and their arguments on the same line.
579
580Example, set default time out and proxy in a config file:
581
582    # We want a 30 minute timeout:
583    -m 1800
584    # ... and we use a proxy for all accesses:
585    proxy = proxy.our.domain.com:8080
586
587Whitespaces ARE significant at the end of lines, but all whitespace leading
588up to the first characters of each line are ignored.
589
590Prevent curl from reading the default file by using -q as the first command
591line parameter, like:
592
593    curl -q www.example.org
594
595Force curl to get and display a local help page in case it is invoked without
596URL by making a config file similar to:
597
598    # default url to get
599    url = "http://help.with.curl.example.com/curlhelp.html"
600
601You can specify another config file to be read by using the `-K`/`--config`
602flag. If you set config filename to `-` it reads the config from stdin, which
603can be handy if you want to hide options from being visible in process tables
604etc:
605
606    echo "user = user:passwd" | curl -K - http://that.secret.example.com
607
608## Extra Headers
609
610When using curl in your own programs, you may end up needing to pass on your
611own custom headers when getting a webpage. You can do this by using the `-H`
612flag.
613
614Example, send the header `X-you-and-me: yes` to the server when getting a
615page:
616
617    curl -H "X-you-and-me: yes" love.example.com
618
619This can also be useful in case you want curl to send a different text in a
620header than it normally does. The `-H` header you specify then replaces the
621header curl would normally send. If you replace an internal header with an
622empty one, you prevent that header from being sent. To prevent the `Host:`
623header from being used:
624
625    curl -H "Host:" server.example.com
626
627## FTP and Path Names
628
629Do note that when getting files with a `ftp://` URL, the given path is
630relative to the directory you enter. To get the file `README` from your home
631directory at your ftp site, do:
632
633    curl ftp://user:passwd@my.example.com/README
634
635If you want the README file from the root directory of that same site, you
636need to specify the absolute filename:
637
638    curl ftp://user:passwd@my.example.com//README
639
640(I.e with an extra slash in front of the filename.)
641
642## SFTP and SCP and Path Names
643
644With sftp: and scp: URLs, the path name given is the absolute name on the
645server. To access a file relative to the remote user's home directory, prefix
646the file with `/~/` , such as:
647
648    curl -u $USER sftp://home.example.com/~/.bashrc
649
650## FTP and Firewalls
651
652The FTP protocol requires one of the involved parties to open a second
653connection as soon as data is about to get transferred. There are two ways to
654do this.
655
656The default way for curl is to issue the PASV command which causes the server
657to open another port and await another connection performed by the
658client. This is good if the client is behind a firewall that does not allow
659incoming connections.
660
661    curl ftp.example.com
662
663If the server, for example, is behind a firewall that does not allow
664connections on ports other than 21 (or if it just does not support the `PASV`
665command), the other way to do it is to use the `PORT` command and instruct the
666server to connect to the client on the given IP number and port (as parameters
667to the PORT command).
668
669The `-P` flag to curl supports a few different options. Your machine may have
670several IP-addresses and/or network interfaces and curl allows you to select
671which of them to use. Default address can also be used:
672
673    curl -P - ftp.example.com
674
675Download with `PORT` but use the IP address of our `le0` interface (this does
676not work on Windows):
677
678    curl -P le0 ftp.example.com
679
680Download with `PORT` but use 192.168.0.10 as our IP address to use:
681
682    curl -P 192.168.0.10 ftp.example.com
683
684## Network Interface
685
686Get a webpage from a server using a specified port for the interface:
687
688    curl --interface eth0:1 http://www.example.com/
689
690or
691
692    curl --interface 192.168.1.10 http://www.example.com/
693
694## HTTPS
695
696Secure HTTP requires a TLS library to be installed and used when curl is
697built. If that is done, curl is capable of retrieving and posting documents
698using the HTTPS protocol.
699
700Example:
701
702    curl https://secure.example.com
703
704curl is also capable of using client certificates to get/post files from sites
705that require valid certificates. The only drawback is that the certificate
706needs to be in PEM-format. PEM is a standard and open format to store
707certificates with, but it is not used by the most commonly used browsers. If
708you want curl to use the certificates you use with your favorite browser, you
709may need to download/compile a converter that can convert your browser's
710formatted certificates to PEM formatted ones.
711
712Example on how to automatically retrieve a document using a certificate with a
713personal password:
714
715    curl -E /path/to/cert.pem:password https://secure.example.com/
716
717If you neglect to specify the password on the command line, you are prompted
718for the correct password before any data can be received.
719
720Many older HTTPS servers have problems with specific SSL or TLS versions,
721which newer versions of OpenSSL etc use, therefore it is sometimes useful to
722specify what TLS version curl should use.:
723
724    curl --tlv1.0 https://secure.example.com/
725
726Otherwise, curl attempts to use a sensible TLS default version.
727
728## Resuming File Transfers
729
730To continue a file transfer where it was previously aborted, curl supports
731resume on HTTP(S) downloads as well as FTP uploads and downloads.
732
733Continue downloading a document:
734
735    curl -C - -o file ftp://ftp.example.com/path/file
736
737Continue uploading a document:
738
739    curl -C - -T file ftp://ftp.example.com/path/file
740
741Continue downloading a document from a web server
742
743    curl -C - -o file http://www.example.com/
744
745## Time Conditions
746
747HTTP allows a client to specify a time condition for the document it requests.
748It is `If-Modified-Since` or `If-Unmodified-Since`. curl allows you to specify
749them with the `-z`/`--time-cond` flag.
750
751For example, you can easily make a download that only gets performed if the
752remote file is newer than a local copy. It would be made like:
753
754    curl -z local.html http://remote.example.com/remote.html
755
756Or you can download a file only if the local file is newer than the remote
757one. Do this by prepending the date string with a `-`, as in:
758
759    curl -z -local.html http://remote.example.com/remote.html
760
761You can specify a plain text date as condition. Tell curl to only download the
762file if it was updated since January 12, 2012:
763
764    curl -z "Jan 12 2012" http://remote.example.com/remote.html
765
766curl accepts a wide range of date formats. You always make the date check the
767other way around by prepending it with a dash (`-`).
768
769## DICT
770
771For fun try
772
773    curl dict://dict.org/m:curl
774    curl dict://dict.org/d:heisenbug:jargon
775    curl dict://dict.org/d:daniel:gcide
776
777Aliases for `m` are `match` and `find`, and aliases for `d` are `define` and
778`lookup`. For example,
779
780    curl dict://dict.org/find:curl
781
782Commands that break the URL description of the RFC (but not the DICT
783protocol) are
784
785    curl dict://dict.org/show:db
786    curl dict://dict.org/show:strat
787
788Authentication support is still missing
789
790## LDAP
791
792If you have installed the OpenLDAP library, curl can take advantage of it and
793offer `ldap://` support. On Windows, curl uses WinLDAP from Platform SDK by
794default.
795
796Default protocol version used by curl is LDAP version 3. Version 2 is used as
797a fallback mechanism in case version 3 fails to connect.
798
799LDAP is a complex thing and writing an LDAP query is not an easy
800task. Familiarize yourself with the exact syntax description elsewhere. One
801such place might be: [RFC 2255, The LDAP URL
802Format](https://curl.se/rfc/rfc2255.txt)
803
804To show you an example, this is how to get all people from an LDAP server that
805has a certain subdomain in their email address:
806
807    curl -B "ldap://ldap.example.com/o=frontec??sub?mail=*sth.example.com"
808
809You also can use authentication when accessing LDAP catalog:
810
811    curl -u user:passwd "ldap://ldap.example.com/o=frontec??sub?mail=*"
812    curl "ldap://user:passwd@ldap.example.com/o=frontec??sub?mail=*"
813
814By default, if user and password are provided, OpenLDAP/WinLDAP uses basic
815authentication. On Windows you can control this behavior by providing one of
816`--basic`, `--ntlm` or `--digest` option in curl command line
817
818    curl --ntlm "ldap://user:passwd@ldap.example.com/o=frontec??sub?mail=*"
819
820On Windows, if no user/password specified, auto-negotiation mechanism is used
821with current logon credentials (SSPI/SPNEGO).
822
823## Environment Variables
824
825Curl reads and understands the following environment variables:
826
827    http_proxy, HTTPS_PROXY, FTP_PROXY
828
829They should be set for protocol-specific proxies. General proxy should be set
830with
831
832    ALL_PROXY
833
834A comma-separated list of hostnames that should not go through any proxy is
835set in (only an asterisk, `*` matches all hosts)
836
837    NO_PROXY
838
839If the hostname matches one of these strings, or the host is within the domain
840of one of these strings, transactions with that node is not done over the
841proxy. When a domain is used, it needs to start with a period. A user can
842specify that both www.example.com and foo.example.com should not use a proxy
843by setting `NO_PROXY` to `.example.com`. By including the full name you can
844exclude specific hostnames, so to make `www.example.com` not use a proxy but
845still have `foo.example.com` do it, set `NO_PROXY` to `www.example.com`.
846
847The usage of the `-x`/`--proxy` flag overrides the environment variables.
848
849## Netrc
850
851Unix introduced the `.netrc` concept a long time ago. It is a way for a user
852to specify name and password for commonly visited FTP sites in a file so that
853you do not have to type them in each time you visit those sites. You realize
854this is a big security risk if someone else gets hold of your passwords,
855therefore most Unix programs do not read this file unless it is only readable
856by yourself (curl does not care though).
857
858Curl supports `.netrc` files if told to (using the `-n`/`--netrc` and
859`--netrc-optional` options). This is not restricted to just FTP, so curl can
860use it for all protocols where authentication is used.
861
862A simple `.netrc` file could look something like:
863
864    machine curl.se login iamdaniel password mysecret
865
866## Custom Output
867
868To better allow script programmers to get to know about the progress of curl,
869the `-w`/`--write-out` option was introduced. Using this, you can specify what
870information from the previous transfer you want to extract.
871
872To display the amount of bytes downloaded together with some text and an
873ending newline:
874
875    curl -w 'We downloaded %{size_download} bytes\n' www.example.com
876
877## Kerberos FTP Transfer
878
879Curl supports kerberos4 and kerberos5/GSSAPI for FTP transfers. You need the
880kerberos package installed and used at curl build time for it to be available.
881
882First, get the krb-ticket the normal way, like with the `kinit`/`kauth` tool.
883Then use curl in way similar to:
884
885    curl --krb private ftp://krb4site.example.com -u username:fakepwd
886
887There is no use for a password on the `-u` switch, but a blank one makes curl
888ask for one and you already entered the real password to `kinit`/`kauth`.
889
890## TELNET
891
892The curl telnet support is basic and easy to use. Curl passes all data passed
893to it on stdin to the remote server. Connect to a remote telnet server using a
894command line similar to:
895
896    curl telnet://remote.example.com
897
898Enter the data to pass to the server on stdin. The result is sent to stdout or
899to the file you specify with `-o`.
900
901You might want the `-N`/`--no-buffer` option to switch off the buffered output
902for slow connections or similar.
903
904Pass options to the telnet protocol negotiation, by using the `-t` option. To
905tell the server we use a vt100 terminal, try something like:
906
907    curl -tTTYPE=vt100 telnet://remote.example.com
908
909Other interesting options for it `-t` include:
910
911 - `XDISPLOC=<X display>` Sets the X display location.
912 - `NEW_ENV=<var,val>` Sets an environment variable.
913
914NOTE: The telnet protocol does not specify any way to login with a specified
915user and password so curl cannot do that automatically. To do that, you need to
916track when the login prompt is received and send the username and password
917accordingly.
918
919## Persistent Connections
920
921Specifying multiple files on a single command line makes curl transfer all of
922them, one after the other in the specified order.
923
924libcurl attempts to use persistent connections for the transfers so that the
925second transfer to the same host can use the same connection that was already
926initiated and was left open in the previous transfer. This greatly decreases
927connection time for all but the first transfer and it makes a far better use
928of the network.
929
930Note that curl cannot use persistent connections for transfers that are used
931in subsequent curl invokes. Try to stuff as many URLs as possible on the same
932command line if they are using the same host, as that makes the transfers
933faster. If you use an HTTP proxy for file transfers, practically all transfers
934are persistent.
935
936## Multiple Transfers With A Single Command Line
937
938As is mentioned above, you can download multiple files with one command line
939by simply adding more URLs. If you want those to get saved to a local file
940instead of just printed to stdout, you need to add one save option for each
941URL you specify. Note that this also goes for the `-O` option (but not
942`--remote-name-all`).
943
944For example: get two files and use `-O` for the first and a custom file
945name for the second:
946
947    curl -O http://example.com/file.txt ftp://example.com/moo.exe -o moo.jpg
948
949You can also upload multiple files in a similar fashion:
950
951    curl -T local1 ftp://example.com/moo.exe -T local2 ftp://example.com/moo2.txt
952
953## IPv6
954
955curl connects to a server with IPv6 when a host lookup returns an IPv6 address
956and fall back to IPv4 if the connection fails. The `--ipv4` and `--ipv6`
957options can specify which address to use when both are available. IPv6
958addresses can also be specified directly in URLs using the syntax:
959
960    http://[2001:1890:1112:1::20]/overview.html
961
962When this style is used, the `-g` option must be given to stop curl from
963interpreting the square brackets as special globbing characters. Link local
964and site local addresses including a scope identifier, such as `fe80::1234%1`,
965may also be used, but the scope portion must be numeric or match an existing
966network interface on Linux and the percent character must be URL escaped. The
967previous example in an SFTP URL might look like:
968
969    sftp://[fe80::1234%251]/
970
971IPv6 addresses provided other than in URLs (e.g. to the `--proxy`,
972`--interface` or `--ftp-port` options) should not be URL encoded.
973
974## Mailing Lists
975
976For your convenience, we have several open mailing lists to discuss curl, its
977development and things relevant to this. Get all info at
978https://curl.se/mail/.
979
980Please direct curl questions, feature requests and trouble reports to one of
981these mailing lists instead of mailing any individual.
982
983Available lists include:
984
985### `curl-users`
986
987Users of the command line tool. How to use it, what does not work, new
988features, related tools, questions, news, installations, compilations,
989running, porting etc.
990
991### `curl-library`
992
993Developers using or developing libcurl. Bugs, extensions, improvements.
994
995### `curl-announce`
996
997Low-traffic. Only receives announcements of new public versions. At worst,
998that makes something like one or two mails per month, but usually only one
999mail every second month.
1000
1001### `curl-and-php`
1002
1003Using the curl functions in PHP. Everything curl with a PHP angle. Or PHP with
1004a curl angle.
1005
1006### `curl-and-python`
1007
1008Python hackers using curl with or without the python binding pycurl.
1009