xref: /curl/docs/MANUAL.md (revision 86d33001)
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" http://www.example.com/guest.cgi
313
314How to post a form with curl, lesson #1:
315
316Dig out all the `<input>` tags in the form that you want to fill in.
317
318If there is a normal post, you use `-d` to post. `-d` takes a full post
319string, which is in the format
320
321    <variable1>=<data1>&<variable2>=<data2>&...
322
323The variable names are the names set with `"name="` in the `<input>` tags, and
324the data is the contents you want to fill in for the inputs. The data *must*
325be properly URL encoded. That means you replace space with + and that you
326replace weird letters with `%XX` where `XX` is the hexadecimal representation
327of the letter's ASCII code.
328
329Example:
330
331(say if `http://example.com` had the following html)
332
333```html
334<form action="post.cgi" method="post">
335  <input name=user size=10>
336  <input name=pass type=password size=10>
337  <input name=id type=hidden value="blablabla">
338  <input name=ding value="submit">
339</form>
340```
341
342We want to enter user `foobar` with password `12345`.
343
344To post to this, you would enter a curl command line like:
345
346    curl -d "user=foobar&pass=12345&id=blablabla&ding=submit" http://example.com/post.cgi
347
348While `-d` uses the application/x-www-form-urlencoded mime-type, generally
349understood by CGI's and similar, curl also supports the more capable
350multipart/form-data type. This latter type supports things like file upload.
351
352`-F` accepts parameters like `-F "name=contents"`. If you want the contents to
353be read from a file, use `@filename` as contents. When specifying a file, you
354can also specify the file content type by appending `;type=<mime type>` to the
355filename. You can also post the contents of several files in one field.  For
356example, the field name `coolfiles` is used to send three files, with
357different content types using the following syntax:
358
359    curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html"
360      http://www.example.com/postit.cgi
361
362If the content-type is not specified, curl tries to guess from the file
363extension (it only knows a few), or use the previously specified type (from an
364earlier file if several files are specified in a list) or else it uses the
365default type `application/octet-stream`.
366
367Emulate a fill-in form with `-F`. Let's say you fill in three fields in a
368form. One field is a filename which to post, one field is your name and one
369field is a file description. We want to post the file we have written named
370`cooltext.txt`. To let curl do the posting of this data instead of your
371favorite browser, you have to read the HTML source of the form page and find
372the names of the input fields. In our example, the input field names are
373`file`, `yourname` and `filedescription`.
374
375    curl -F "file=@cooltext.txt" -F "yourname=Daniel"
376      -F "filedescription=Cool text file with cool text inside"
377      http://www.example.com/postit.cgi
378
379To send two files in one post you can do it in two ways:
380
381Send multiple files in a single field with a single field name:
382
383    curl -F "pictures=@dog.gif,cat.gif" $URL
384
385Send two fields with two field names
386
387    curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif" $URL
388
389To send a field value literally without interpreting a leading `@` or `<`, or
390an embedded `;type=`, use `--form-string` instead of `-F`. This is recommended
391when the value is obtained from a user or some other unpredictable
392source. Under these circumstances, using `-F` instead of `--form-string` could
393allow a user to trick curl into uploading a file.
394
395## Referrer
396
397An HTTP request has the option to include information about which address
398referred it to the actual page. curl allows you to specify the referrer to be
399used on the command line. It is especially useful to fool or trick stupid
400servers or CGI scripts that rely on that information being available or
401contain certain data.
402
403    curl -e www.example.org http://www.example.com/
404
405## User Agent
406
407An HTTP request has the option to include information about the browser that
408generated the request. Curl allows it to be specified on the command line. It
409is especially useful to fool or trick stupid servers or CGI scripts that only
410accept certain browsers.
411
412Example:
413
414    curl -A 'Mozilla/3.0 (Win95; I)' http://www.bank.example.com/
415
416Other common strings:
417
418- `Mozilla/3.0 (Win95; I)` - Netscape Version 3 for Windows 95
419- `Mozilla/3.04 (Win95; U)` - Netscape Version 3 for Windows 95
420- `Mozilla/2.02 (OS/2; U)` - Netscape Version 2 for OS/2
421- `Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)` - Netscape for AIX
422- `Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)` - Netscape for Linux
423
424Note that Internet Explorer tries hard to be compatible in every way:
425
426- `Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)` - MSIE for W95
427
428Mozilla is not the only possible User-Agent name:
429
430- `Konqueror/1.0` - KDE File Manager desktop client
431- `Lynx/2.7.1 libwww-FM/2.14` - Lynx command line browser
432
433## Cookies
434
435Cookies are generally used by web servers to keep state information at the
436client's side. The server sets cookies by sending a response line in the
437headers that looks like `Set-Cookie: <data>` where the data part then
438typically contains a set of `NAME=VALUE` pairs (separated by semicolons `;`
439like `NAME1=VALUE1; NAME2=VALUE2;`). The server can also specify for what path
440the cookie should be used for (by specifying `path=value`), when the cookie
441should expire (`expire=DATE`), for what domain to use it (`domain=NAME`) and
442if it should be used on secure connections only (`secure`).
443
444If you have received a page from a server that contains a header like:
445
446```http
447Set-Cookie: sessionid=boo123; path="/foo";
448```
449
450it means the server wants that first pair passed on when we get anything in a
451path beginning with `/foo`.
452
453Example, get a page that wants my name passed in a cookie:
454
455    curl -b "name=Daniel" www.example.com
456
457Curl also has the ability to use previously received cookies in following
458sessions. If you get cookies from a server and store them in a file in a
459manner similar to:
460
461    curl --dump-header headers www.example.com
462
463... you can then in a second connect to that (or another) site, use the
464cookies from the `headers.txt` file like:
465
466    curl -b headers.txt www.example.com
467
468While saving headers to a file is a working way to store cookies, it is
469however error-prone and not the preferred way to do this. Instead, make curl
470save the incoming cookies using the well-known Netscape cookie format like
471this:
472
473    curl -c cookies.txt www.example.com
474
475Note that by specifying `-b` you enable the cookie engine and with `-L` you
476can make curl follow a `location:` (which often is used in combination with
477cookies). If a site sends cookies and a location field, you can use a
478non-existing file to trigger the cookie awareness like:
479
480    curl -L -b empty.txt www.example.com
481
482The file to read cookies from must be formatted using plain HTTP headers OR as
483Netscape's cookie file. Curl determines what kind it is based on the file
484contents. In the above command, curl parses the header and store the cookies
485received from www.example.com. curl sends the stored cookies which match the
486request to the server as it follows the location. The file `empty.txt` may be
487a nonexistent file.
488
489To read and write cookies from a Netscape cookie file, you can set both `-b`
490and `-c` to use the same file:
491
492    curl -b cookies.txt -c cookies.txt www.example.com
493
494## Progress Meter
495
496The progress meter exists to show a user that something actually is
497happening. The different fields in the output have the following meaning:
498
499    % Total    % Received % Xferd  Average Speed          Time             Curr.
500                                   Dload  Upload Total    Current  Left    Speed
501    0  151M    0 38608    0     0   9406      0  4:41:43  0:00:04  4:41:39  9287
502
503From left-to-right:
504
505 - `%`           - percentage completed of the whole transfer
506 - `Total`       - total size of the whole expected transfer
507 - `%`           - percentage completed of the download
508 - `Received`    - currently downloaded amount of bytes
509 - `%`           - percentage completed of the upload
510 - `Xferd`       - currently uploaded amount of bytes
511 - `Average Speed Dload` - the average transfer speed of the download
512 - `Average Speed Upload` - the average transfer speed of the upload
513 - `Time Total`  - expected time to complete the operation
514 - `Time Current` - time passed since the invoke
515 - `Time Left`   - expected time left to completion
516 - `Curr.Speed`  - the average transfer speed the last 5 seconds (the first
517                   5 seconds of a transfer is based on less time of course.)
518
519The `-#` option displays a totally different progress bar that does not need
520much explanation!
521
522## Speed Limit
523
524Curl allows the user to set the transfer speed conditions that must be met to
525let the transfer keep going. By using the switch `-y` and `-Y` you can make
526curl abort transfers if the transfer speed is below the specified lowest limit
527for a specified time.
528
529To have curl abort the download if the speed is slower than 3000 bytes per
530second for 1 minute, run:
531
532    curl -Y 3000 -y 60 www.far-away.example.com
533
534This can be used in combination with the overall time limit, so that the above
535operation must be completed in whole within 30 minutes:
536
537    curl -m 1800 -Y 3000 -y 60 www.far-away.example.com
538
539Forcing curl not to transfer data faster than a given rate is also possible,
540which might be useful if you are using a limited bandwidth connection and you
541do not want your transfer to use all of it (sometimes referred to as
542*bandwidth throttle*).
543
544Make curl transfer data no faster than 10 kilobytes per second:
545
546    curl --limit-rate 10K www.far-away.example.com
547
548or
549
550    curl --limit-rate 10240 www.far-away.example.com
551
552Or prevent curl from uploading data faster than 1 megabyte per second:
553
554    curl -T upload --limit-rate 1M ftp://uploads.example.com
555
556When using the `--limit-rate` option, the transfer rate is regulated on a
557per-second basis, which causes the total transfer speed to become lower than
558the given number. Sometimes of course substantially lower, if your transfer
559stalls during periods.
560
561## Config File
562
563Curl automatically tries to read the `.curlrc` file (or `_curlrc` file on
564Microsoft Windows systems) from the user's home directory on startup.
565
566The config file could be made up with normal command line switches, but you
567can also specify the long options without the dashes to make it more
568readable. You can separate the options and the parameter with spaces, or with
569`=` or `:`. Comments can be used within the file. If the first letter on a
570line is a `#`-symbol the rest of the line is treated as a comment.
571
572If you want the parameter to contain spaces, you must enclose the entire
573parameter within double quotes (`"`). Within those quotes, you specify a quote
574as `\"`.
575
576NOTE: You must specify options and their arguments on the same line.
577
578Example, set default time out and proxy in a config file:
579
580    # We want a 30 minute timeout:
581    -m 1800
582    # ... and we use a proxy for all accesses:
583    proxy = proxy.our.domain.com:8080
584
585Whitespaces ARE significant at the end of lines, but all whitespace leading
586up to the first characters of each line are ignored.
587
588Prevent curl from reading the default file by using -q as the first command
589line parameter, like:
590
591    curl -q www.example.org
592
593Force curl to get and display a local help page in case it is invoked without
594URL by making a config file similar to:
595
596    # default url to get
597    url = "http://help.with.curl.example.com/curlhelp.html"
598
599You can specify another config file to be read by using the `-K`/`--config`
600flag. If you set config filename to `-` it reads the config from stdin, which
601can be handy if you want to hide options from being visible in process tables
602etc:
603
604    echo "user = user:passwd" | curl -K - http://that.secret.example.com
605
606## Extra Headers
607
608When using curl in your own programs, you may end up needing to pass on your
609own custom headers when getting a webpage. You can do this by using the `-H`
610flag.
611
612Example, send the header `X-you-and-me: yes` to the server when getting a
613page:
614
615    curl -H "X-you-and-me: yes" love.example.com
616
617This can also be useful in case you want curl to send a different text in a
618header than it normally does. The `-H` header you specify then replaces the
619header curl would normally send. If you replace an internal header with an
620empty one, you prevent that header from being sent. To prevent the `Host:`
621header from being used:
622
623    curl -H "Host:" server.example.com
624
625## FTP and Path Names
626
627Do note that when getting files with a `ftp://` URL, the given path is
628relative to the directory you enter. To get the file `README` from your home
629directory at your ftp site, do:
630
631    curl ftp://user:passwd@my.example.com/README
632
633If you want the README file from the root directory of that same site, you
634need to specify the absolute filename:
635
636    curl ftp://user:passwd@my.example.com//README
637
638(I.e with an extra slash in front of the filename.)
639
640## SFTP and SCP and Path Names
641
642With sftp: and scp: URLs, the path name given is the absolute name on the
643server. To access a file relative to the remote user's home directory, prefix
644the file with `/~/` , such as:
645
646    curl -u $USER sftp://home.example.com/~/.bashrc
647
648## FTP and Firewalls
649
650The FTP protocol requires one of the involved parties to open a second
651connection as soon as data is about to get transferred. There are two ways to
652do this.
653
654The default way for curl is to issue the PASV command which causes the server
655to open another port and await another connection performed by the
656client. This is good if the client is behind a firewall that does not allow
657incoming connections.
658
659    curl ftp.example.com
660
661If the server, for example, is behind a firewall that does not allow
662connections on ports other than 21 (or if it just does not support the `PASV`
663command), the other way to do it is to use the `PORT` command and instruct the
664server to connect to the client on the given IP number and port (as parameters
665to the PORT command).
666
667The `-P` flag to curl supports a few different options. Your machine may have
668several IP-addresses and/or network interfaces and curl allows you to select
669which of them to use. Default address can also be used:
670
671    curl -P - ftp.example.com
672
673Download with `PORT` but use the IP address of our `le0` interface (this does
674not work on Windows):
675
676    curl -P le0 ftp.example.com
677
678Download with `PORT` but use 192.168.0.10 as our IP address to use:
679
680    curl -P 192.168.0.10 ftp.example.com
681
682## Network Interface
683
684Get a webpage from a server using a specified port for the interface:
685
686    curl --interface eth0:1 http://www.example.com/
687
688or
689
690    curl --interface 192.168.1.10 http://www.example.com/
691
692## HTTPS
693
694Secure HTTP requires a TLS library to be installed and used when curl is
695built. If that is done, curl is capable of retrieving and posting documents
696using the HTTPS protocol.
697
698Example:
699
700    curl https://secure.example.com
701
702curl is also capable of using client certificates to get/post files from sites
703that require valid certificates. The only drawback is that the certificate
704needs to be in PEM-format. PEM is a standard and open format to store
705certificates with, but it is not used by the most commonly used browsers. If
706you want curl to use the certificates you use with your favorite browser, you
707may need to download/compile a converter that can convert your browser's
708formatted certificates to PEM formatted ones.
709
710Example on how to automatically retrieve a document using a certificate with a
711personal password:
712
713    curl -E /path/to/cert.pem:password https://secure.example.com/
714
715If you neglect to specify the password on the command line, you are prompted
716for the correct password before any data can be received.
717
718Many older HTTPS servers have problems with specific SSL or TLS versions,
719which newer versions of OpenSSL etc use, therefore it is sometimes useful to
720specify what TLS version curl should use.:
721
722    curl --tlv1.0 https://secure.example.com/
723
724Otherwise, curl attempts to use a sensible TLS default version.
725
726## Resuming File Transfers
727
728To continue a file transfer where it was previously aborted, curl supports
729resume on HTTP(S) downloads as well as FTP uploads and downloads.
730
731Continue downloading a document:
732
733    curl -C - -o file ftp://ftp.example.com/path/file
734
735Continue uploading a document:
736
737    curl -C - -T file ftp://ftp.example.com/path/file
738
739Continue downloading a document from a web server
740
741    curl -C - -o file http://www.example.com/
742
743## Time Conditions
744
745HTTP allows a client to specify a time condition for the document it requests.
746It is `If-Modified-Since` or `If-Unmodified-Since`. curl allows you to specify
747them with the `-z`/`--time-cond` flag.
748
749For example, you can easily make a download that only gets performed if the
750remote file is newer than a local copy. It would be made like:
751
752    curl -z local.html http://remote.example.com/remote.html
753
754Or you can download a file only if the local file is newer than the remote
755one. Do this by prepending the date string with a `-`, as in:
756
757    curl -z -local.html http://remote.example.com/remote.html
758
759You can specify a plain text date as condition. Tell curl to only download the
760file if it was updated since January 12, 2012:
761
762    curl -z "Jan 12 2012" http://remote.example.com/remote.html
763
764curl accepts a wide range of date formats. You always make the date check the
765other way around by prepending it with a dash (`-`).
766
767## DICT
768
769For fun try
770
771    curl dict://dict.org/m:curl
772    curl dict://dict.org/d:heisenbug:jargon
773    curl dict://dict.org/d:daniel:gcide
774
775Aliases for `m` are `match` and `find`, and aliases for `d` are `define` and
776`lookup`. For example,
777
778    curl dict://dict.org/find:curl
779
780Commands that break the URL description of the RFC (but not the DICT
781protocol) are
782
783    curl dict://dict.org/show:db
784    curl dict://dict.org/show:strat
785
786Authentication support is still missing
787
788## LDAP
789
790If you have installed the OpenLDAP library, curl can take advantage of it and
791offer `ldap://` support. On Windows, curl uses WinLDAP from Platform SDK by
792default.
793
794Default protocol version used by curl is LDAP version 3. Version 2 is used as
795a fallback mechanism in case version 3 fails to connect.
796
797LDAP is a complex thing and writing an LDAP query is not an easy
798task. Familiarize yourself with the exact syntax description elsewhere. One
799such place might be: [RFC 2255, The LDAP URL
800Format](https://curl.se/rfc/rfc2255.txt)
801
802To show you an example, this is how to get all people from an LDAP server that
803has a certain subdomain in their email address:
804
805    curl -B "ldap://ldap.example.com/o=frontec??sub?mail=*sth.example.com"
806
807You also can use authentication when accessing LDAP catalog:
808
809    curl -u user:passwd "ldap://ldap.example.com/o=frontec??sub?mail=*"
810    curl "ldap://user:passwd@ldap.example.com/o=frontec??sub?mail=*"
811
812By default, if user and password are provided, OpenLDAP/WinLDAP uses basic
813authentication. On Windows you can control this behavior by providing one of
814`--basic`, `--ntlm` or `--digest` option in curl command line
815
816    curl --ntlm "ldap://user:passwd@ldap.example.com/o=frontec??sub?mail=*"
817
818On Windows, if no user/password specified, auto-negotiation mechanism is used
819with current logon credentials (SSPI/SPNEGO).
820
821## Environment Variables
822
823Curl reads and understands the following environment variables:
824
825    http_proxy, HTTPS_PROXY, FTP_PROXY
826
827They should be set for protocol-specific proxies. General proxy should be set
828with
829
830    ALL_PROXY
831
832A comma-separated list of hostnames that should not go through any proxy is
833set in (only an asterisk, `*` matches all hosts)
834
835    NO_PROXY
836
837If the hostname matches one of these strings, or the host is within the domain
838of one of these strings, transactions with that node is not done over the
839proxy. When a domain is used, it needs to start with a period. A user can
840specify that both www.example.com and foo.example.com should not use a proxy
841by setting `NO_PROXY` to `.example.com`. By including the full name you can
842exclude specific hostnames, so to make `www.example.com` not use a proxy but
843still have `foo.example.com` do it, set `NO_PROXY` to `www.example.com`.
844
845The usage of the `-x`/`--proxy` flag overrides the environment variables.
846
847## Netrc
848
849Unix introduced the `.netrc` concept a long time ago. It is a way for a user
850to specify name and password for commonly visited FTP sites in a file so that
851you do not have to type them in each time you visit those sites. You realize
852this is a big security risk if someone else gets hold of your passwords,
853therefore most Unix programs do not read this file unless it is only readable
854by yourself (curl does not care though).
855
856Curl supports `.netrc` files if told to (using the `-n`/`--netrc` and
857`--netrc-optional` options). This is not restricted to just FTP, so curl can
858use it for all protocols where authentication is used.
859
860A simple `.netrc` file could look something like:
861
862    machine curl.se login iamdaniel password mysecret
863
864## Custom Output
865
866To better allow script programmers to get to know about the progress of curl,
867the `-w`/`--write-out` option was introduced. Using this, you can specify what
868information from the previous transfer you want to extract.
869
870To display the amount of bytes downloaded together with some text and an
871ending newline:
872
873    curl -w 'We downloaded %{size_download} bytes\n' www.example.com
874
875## Kerberos FTP Transfer
876
877Curl supports kerberos4 and kerberos5/GSSAPI for FTP transfers. You need the
878kerberos package installed and used at curl build time for it to be available.
879
880First, get the krb-ticket the normal way, like with the `kinit`/`kauth` tool.
881Then use curl in way similar to:
882
883    curl --krb private ftp://krb4site.example.com -u username:fakepwd
884
885There is no use for a password on the `-u` switch, but a blank one makes curl
886ask for one and you already entered the real password to `kinit`/`kauth`.
887
888## TELNET
889
890The curl telnet support is basic and easy to use. Curl passes all data passed
891to it on stdin to the remote server. Connect to a remote telnet server using a
892command line similar to:
893
894    curl telnet://remote.example.com
895
896Enter the data to pass to the server on stdin. The result is sent to stdout or
897to the file you specify with `-o`.
898
899You might want the `-N`/`--no-buffer` option to switch off the buffered output
900for slow connections or similar.
901
902Pass options to the telnet protocol negotiation, by using the `-t` option. To
903tell the server we use a vt100 terminal, try something like:
904
905    curl -tTTYPE=vt100 telnet://remote.example.com
906
907Other interesting options for it `-t` include:
908
909 - `XDISPLOC=<X display>` Sets the X display location.
910 - `NEW_ENV=<var,val>` Sets an environment variable.
911
912NOTE: The telnet protocol does not specify any way to login with a specified
913user and password so curl cannot do that automatically. To do that, you need to
914track when the login prompt is received and send the username and password
915accordingly.
916
917## Persistent Connections
918
919Specifying multiple files on a single command line makes curl transfer all of
920them, one after the other in the specified order.
921
922libcurl attempts to use persistent connections for the transfers so that the
923second transfer to the same host can use the same connection that was already
924initiated and was left open in the previous transfer. This greatly decreases
925connection time for all but the first transfer and it makes a far better use
926of the network.
927
928Note that curl cannot use persistent connections for transfers that are used
929in subsequent curl invokes. Try to stuff as many URLs as possible on the same
930command line if they are using the same host, as that makes the transfers
931faster. If you use an HTTP proxy for file transfers, practically all transfers
932are persistent.
933
934## Multiple Transfers With A Single Command Line
935
936As is mentioned above, you can download multiple files with one command line
937by simply adding more URLs. If you want those to get saved to a local file
938instead of just printed to stdout, you need to add one save option for each
939URL you specify. Note that this also goes for the `-O` option (but not
940`--remote-name-all`).
941
942For example: get two files and use `-O` for the first and a custom file
943name for the second:
944
945    curl -O http://example.com/file.txt ftp://example.com/moo.exe -o moo.jpg
946
947You can also upload multiple files in a similar fashion:
948
949    curl -T local1 ftp://example.com/moo.exe -T local2 ftp://example.com/moo2.txt
950
951## IPv6
952
953curl connects to a server with IPv6 when a host lookup returns an IPv6 address
954and fall back to IPv4 if the connection fails. The `--ipv4` and `--ipv6`
955options can specify which address to use when both are available. IPv6
956addresses can also be specified directly in URLs using the syntax:
957
958    http://[2001:1890:1112:1::20]/overview.html
959
960When this style is used, the `-g` option must be given to stop curl from
961interpreting the square brackets as special globbing characters. Link local
962and site local addresses including a scope identifier, such as `fe80::1234%1`,
963may also be used, but the scope portion must be numeric or match an existing
964network interface on Linux and the percent character must be URL escaped. The
965previous example in an SFTP URL might look like:
966
967    sftp://[fe80::1234%251]/
968
969IPv6 addresses provided other than in URLs (e.g. to the `--proxy`,
970`--interface` or `--ftp-port` options) should not be URL encoded.
971
972## Mailing Lists
973
974For your convenience, we have several open mailing lists to discuss curl, its
975development and things relevant to this. Get all info at
976https://curl.se/mail/.
977
978Please direct curl questions, feature requests and trouble reports to one of
979these mailing lists instead of mailing any individual.
980
981Available lists include:
982
983### `curl-users`
984
985Users of the command line tool. How to use it, what does not work, new
986features, related tools, questions, news, installations, compilations,
987running, porting etc.
988
989### `curl-library`
990
991Developers using or developing libcurl. Bugs, extensions, improvements.
992
993### `curl-announce`
994
995Low-traffic. Only receives announcements of new public versions. At worst,
996that makes something like one or two mails per month, but usually only one
997mail every second month.
998
999### `curl-and-php`
1000
1001Using the curl functions in PHP. Everything curl with a PHP angle. Or PHP with
1002a curl angle.
1003
1004### `curl-and-python`
1005
1006Python hackers using curl with or without the python binding pycurl.
1007