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