new
[libcurl.git] / README.curl
blob00f685e410407b43b941b2c8c3840b68b965f23c
1 LATEST VERSION
3   You always find news about what's going on as well as the latest versions
4   from the curl web pages, located at:
6         http://curl.haxx.nu
8 SIMPLE USAGE
10   Get the main page from netscape's web-server:
12         curl http://www.netscape.com/
14   Get the root README file from funet's ftp-server:
16         curl ftp://ftp.funet.fi/README
18   Get a gopher document from funet's gopher server:
20         curl gopher://gopher.funet.fi
22   Get a web page from a server using port 8000:
24         curl http://www.weirdserver.com:8000/
26   Get a list of the root directory of an FTP site:
28         curl ftp://ftp.fts.frontec.se/
30   Get the definition of curl from a dictionary:
32         curl dict://dict.org/m:curl
34 DOWNLOAD TO A FILE
36   Get a web page and store in a local file:
38         curl -o thatpage.html http://www.netscape.com/
40   Get a web page and store in a local file, make the local file get the name
41   of the remote document (if no file name part is specified in the URL, this
42   will fail):
44         curl -O http://www.netscape.com/index.html
46 USING PASSWORDS
48  FTP
50    To ftp files using name+passwd, include them in the URL like:
52         curl ftp://name:passwd@machine.domain:port/full/path/to/file
54    or specify them with the -u flag like
56         curl -u name:passwd ftp://machine.domain:port/full/path/to/file
58  HTTP
60    The HTTP URL doesn't support user and password in the URL string. Curl
61    does support that anyway to provide a ftp-style interface and thus you can
62    pick a file like:
64         curl http://name:passwd@machine.domain/full/path/to/file
66    or specify user and password separately like in
68         curl -u name:passwd http://machine.domain/full/path/to/file
70    NOTE! Since HTTP URLs don't support user and password, you can't use that
71    style when using Curl via a proxy. You _must_ use the -u style fetch
72    during such circumstances.
74  HTTPS
76    Probably most commonly used with private certificates, as explained below.
78  GOPHER
80    Curl features no password support for gopher.
82 PROXY
84  Get an ftp file using a proxy named my-proxy that uses port 888:
86         curl -x my-proxy:888 ftp://ftp.leachsite.com/README
88  Get a file from a HTTP server that requires user and password, using the
89  same proxy as above:
91         curl -u user:passwd -x my-proxy:888 http://www.get.this/
93  Some proxies require special authentication. Specify by using -U as above:
95         curl -U user:passwd -x my-proxy:888 http://www.get.this/
97  See also the environment variables Curl support that offer further proxy
98  control.
100 RANGES
102   With HTTP 1.1 byte-ranges were introduced. Using this, a client can request
103   to get only one or more subparts of a specified document. Curl supports
104   this with the -r flag.
106   Get the first 100 bytes of a document:
108         curl -r 0-99 http://www.get.this/
110   Get the last 500 bytes of a document:
112         curl -r -500 http://www.get.this/
114   Curl also supports simple ranges for FTP files as well. Then you can only
115   specify start and stop position.
117   Get the first 100 bytes of a document using FTP:
119         curl -r 0-99 ftp://www.get.this/README  
121 UPLOADING
123  FTP
125    Upload all data on stdin to a specified ftp site:
127         curl -t ftp://ftp.upload.com/myfile
129    Upload data from a specified file, login with user and password:
131         curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile
133    Upload a local file to the remote site, and use the local file name remote
134    too:
136         curl -T uploadfile -u user:passwd ftp://ftp.upload.com/
138    NOTE: Curl is not currently supporing ftp upload through a proxy! The reason
139    for this is simply that proxies are seldomly configured to allow this and
140    that no author has supplied code that makes it possible!
142  HTTP
144    Upload all data on stdin to a specified http site:
146         curl -t http://www.upload.com/myfile
148    Note that the http server must've been configured to accept PUT before this
149    can be done successfully.
151    For other ways to do http data upload, see the POST section below.
153 VERBOSE / DEBUG
155   If curl fails where it isn't supposed to, if the servers don't let you
156   in, if you can't understand the responses: use the -v flag to get VERBOSE
157   fetching. Curl will output lots of info and all data it sends and
158   receives in order to let the user see all client-server interaction.
160         curl -v ftp://ftp.upload.com/
162 DETAILED INFORMATION
164   Different protocols provide different ways of getting detailed information
165   about specific files/documents. To get curl to show detailed information
166   about a single file, you should use -I/--head option. It displays all
167   available info on a single file for HTTP and FTP. The HTTP information is a
168   lot more extensive.
170   For HTTP, you can get the header information (the same as -I would show)
171   shown before the data by using -i/--include. Curl understands the
172   -D/--dump-header option when getting files from both FTP and HTTP, and it
173   will then store the headers in the specified file.
175   Store the HTTP headers in a separate file:
177         curl --dump-header headers.txt curl.haxx.nu
179   Note that headers stored in a separate file can be very useful at a later
180   time if you want curl to use cookies sent by the server. More about that in
181   the cookies section.
183 POST (HTTP)
185   It's easy to post data using curl. This is done using the -d <data>
186   option.  The post data must be urlencoded.
188   Post a simple "name" and "phone" guestbook.
190         curl -d "name=Rafael%20Sagula&phone=3320780" \
191                 http://www.where.com/guest.cgi
193   While -d uses the application/x-www-form-urlencoded mime-type, generally
194   understood by CGI's and similar, curl also supports the more capable
195   multipart/form-data type. This latter type supports things like file upload.
197   -F accepts parameters like -F "name=contents". If you want the contents to
198   be read from a file, use <@filename> as contents. When specifying a file,
199   you can also specify which content type the file is, by appending
200   ';type=<mime type>' to the file name. You can also post contents of several
201   files in one field. So that the field name 'coolfiles' can be sent three
202   files with different content types in a manner similar to:
204         curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \
205         http://www.post.com/postit.cgi
207   If content-type is not specified, curl will try to guess from the extension
208   (it only knows a few), or use the previously specified type (from an earlier
209   file if several files are specified in a list) or finally using the default
210   type 'text/plain'.
212   Emulate a fill-in form with -F. Let's say you fill in three fields in a
213   form. One field is a file name which to post, one field is your name and one
214   field is a file description. We want to post the file we have written named
215   "cooltext.txt". To let curl do the posting of this data instead of your
216   favourite browser, you have to check out the HTML of the form page to get to
217   know the names of the input fields. In our example, the input field names are
218   'file', 'yourname' and 'filedescription'.
220         curl -F "file=@cooltext.txt" -F "yourname=Daniel" \
221              -F "filedescription=Cool text file with cool text inside" \
222              http://www.post.com/postit.cgi
224   So, to send two files in one post you can do it in two ways:
226   1. Send multiple files in a single "field" with a single field name:
228         curl -F "pictures=@dog.gif,cat.gif" 
230   2. Send two fields with two field names: 
232         curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif" 
234 REFERER
236   A HTTP request has the option to include information about which address
237   that referred to actual page, and curl allows the user to specify that
238   referrer to get specified on the command line. It is especially useful to
239   fool or trick stupid servers or CGI scripts that rely on that information
240   being available or contain certain data.
242         curl -e www.coolsite.com http://www.showme.com/
244 USER AGENT
246   A HTTP request has the option to include information about the browser
247   that generated the request. Curl allows it to be specified on the command
248   line. It is especially useful to fool or trick stupid servers or CGI
249   scripts that only accept certain browsers.
251   Example:
253   curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/
255   Other common strings:
256     'Mozilla/3.0 (Win95; I)'     Netscape Version 3 for Windows 95
257     'Mozilla/3.04 (Win95; U)'    Netscape Version 3 for Windows 95
258     'Mozilla/2.02 (OS/2; U)'     Netscape Version 2 for OS/2
259     'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)'           NS for AIX
260     'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)'      NS for Linux
262   Note that Internet Explorer tries hard to be compatible in every way:
263     'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)'    MSIE for W95
265   Mozilla is not the only possible User-Agent name:
266     'Konqueror/1.0'             KDE File Manager desktop client
267     'Lynx/2.7.1 libwww-FM/2.14' Lynx command line browser
269 COOKIES
271   Cookies are generally used by web servers to keep state information at the
272   client's side. The server sets cookies by sending a response line in the
273   headers that looks like 'Set-Cookie: <data>' where the data part then
274   typically contains a set of NAME=VALUE pairs (separated by semicolons ';'
275   like "NAME1=VALUE1; NAME2=VALUE2;"). The server can also specify for what
276   path the "cookie" should be used for (by specifying "path=value"), when the
277   cookie should expire ("expire=DATE"), for what domain to use it
278   ("domain=NAME") and if it should be used on secure connections only
279   ("secure").
281   If you've received a page from a server that contains a header like:
282         Set-Cookie: sessionid=boo123; path="/foo";
284   it means the server wants that first pair passed on when we get anything in
285   a path beginning with "/foo".
287   Example, get a page that wants my name passed in a cookie:
289         curl -b "name=Daniel" www.sillypage.com
291   Curl also has the ability to use previously received cookies in following
292   sessions. If you get cookies from a server and store them in a file in a
293   manner similar to:
295         curl --dump-header headers www.example.com
297   ... you can then in a second connect to that (or another) site, use the
298   cookies from the 'headers' file like:
300         curl -b headers www.example.com
302   Note that by specifying -b you enable the "cookie awareness" and with -L
303   you can make curl follow a location: (which often is used in combination
304   with cookies). So that if a site sends cookies and a location, you can
305   use a non-existing file to trig the cookie awareness like:
307         curl -L -b empty-file www.example.com
309   The file to read cookies from must be formatted using plain HTTP headers OR
310   as netscape's cookie file. Curl will determine what kind it is based on the
311   file contents.
313 PROGRESS METER
315   The progress meter was introduced to better show a user that something
316   actually is happening. The different fields in the output have the following
317   meaning:
319    %   Received   Total  Speed   Time left  Total   Curr.Speed
320   13   524140   3841536   4296   0:12:52   0:14:54    292     
322   From left-to-right:
323   - The first column, is the percentage of the file currently transfered.
324   - Received means the total number of bytes that has been transfered.
325   - Total is the total number of bytes expected to transfer.
326   - Speed is average speed in bytes per second for the whole transfer so far.
327   - Time left is the estimated time left for this transfer to finnish if the
328     current average speed will remain steady.
329   - Total is the estimated total transfer time.
330   - Curr.Speed is the average transfer speed the last 5 seconds (the first
331     5 seconds of a transfer is based on less time of course.)
333   NOTE: Much of the output is based on the fact that the size of the transfer
334   is known before it takes place. If it isn't, a much less fancy display will
335   be used.
337 SPEED LIMIT
339   Curl offers the user to set conditions regarding transfer speed that must
340   be met to let the transfer keep going. By using the switch -y and -Y you
341   can make curl abort transfers if the transfer speed doesn't exceed your
342   given lowest limit for a specified time.
344   To let curl abandon downloading this page if its slower than 3000 bytes per
345   second for 1 minute, run:
347         curl -y 3000 -Y 60 www.far-away-site.com
349   This can very well be used in combination with the overall time limit, so
350   that the above operatioin must be completed in whole within 30 minutes:
352         curl -m 1800 -y 3000 -Y 60 www.far-away-site.com
354 CONFIG FILE
356   Curl automatically tries to read the .curlrc file (or _curlrc file on win32
357   systems) from the user's home dir on startup. The config file should be
358   made up with normal command line switches. Comments can be used within the
359   file. If the first letter on a line is a '#'-letter the rest of the line
360   is treated as a comment.
362   Example, set default time out and proxy in a config file:
364         # We want a 30 minute timeout:
365         -m 1800
366         # ... and we use a proxy for all accesses:
367         -x proxy.our.domain.com:8080
369   White spaces ARE significant at the end of lines, but all white spaces
370   leading up to the first characters of each line are ignored.
372   Prevent curl from reading the default file by using -q as the first command
373   line parameter, like:
375         curl -q www.thatsite.com
377   Force curl to get and display a local help page in case it is invoked
378   without URL by making a config file similar to:
380         # default url to get
381         http://help.with.curl.com/curlhelp.html
383   You can specify another config file to be read by using the -K/--config
384   flag. If you set config file name to "-" it'll read the config from stdin,
385   which can be handy if you want to hide options from being visible in process
386   tables etc:
388         echo "-u user:passwd" | curl -K - http://that.secret.site.com
390 EXTRA HEADERS
392   When using curl in your own very special programs, you may end up needing
393   to pass on your own custom headers when getting a web page. You can do
394   this by using the -H flag.
396   Example, send the header "X-you-and-me: yes" to the server when getting a
397   page:
399         curl -H "X-you-and-me: yes" www.love.com
401   This can also be useful in case you want curl to send a different text in
402   a header than it normally does. The -H header you specify then replaces the
403   header curl would normally send.
405 FTP and PATH NAMES
407   Do note that when getting files with the ftp:// URL, the given path is
408   relative the directory you enter. To get the file 'README' from your home
409   directory at your ftp site, do:
411         curl ftp://user:passwd@my.site.com/README
413   But if you want the README file from the root directory of that very same
414   site, you need to specify the absolute file name:
416         curl ftp://user:passwd@my.site.com//README
418   (I.e with an extra slash in front of the file name.)
420 FTP and firewalls
422   The FTP protocol requires one of the involved parties to open a second
423   connction as soon as data is about to get transfered. There are two ways to
424   do this.
426   The default way for curl is to issue the PASV command which causes the
427   server to open another port and await another connection performed by the
428   client. This is good if the client is behind a firewall that don't allow
429   incoming connections.
431         curl ftp.download.com
433   If the server for example, is behind a firewall that don't allow connections
434   on other ports than 21 (or if it just doesn't support the PASV command), the
435   other way to do it is to use the PORT command and instruct the server to
436   connect to the client on the given (as parameters to the PORT command) IP
437   number and port.
439   The -P flag to curl allows for different options. Your machine may have
440   several IP-addresses and/or network interfaces and curl allows you to select
441   which of them to use. Default address can also be used:
443         curl -P - ftp.download.com
445   Download with PORT but use the IP address of our 'le0' interface:
447         curl -P le0 ftp.download.com
449   Download with PORT but use 192.168.0.10 as our IP address to use:
451         curl -P 192.168.0.10 ftp.download.com
453 HTTPS
455   Secure HTTP requires SSLeay to be installed and used when curl is built. If
456   that is done, curl is capable of retrieving and posting documents using the
457   HTTPS procotol.
459   Example:
461         curl https://www.secure-site.com
463   Curl is also capable of using your personal certificates to get/post files
464   from sites that require valid certificates. The only drawback is that the
465   certificate needs to be in PEM-format. PEM is a standard and open format to
466   store certificates with, but it is not used by the most commonly used
467   browsers (Netscape and MSEI both use the so called PKCS#12 format). If you
468   want curl to use the certificates you use with your (favourite) browser, you
469   may need to download/compile a converter that can convert your browser's
470   formatted certificates to PEM formatted ones. Dr Stephen N. Henson has
471   written a patch for SSLeay that adds this functionality. You can get his
472   patch (that requires an SSLeay installation) from his site at:
473   http://www.drh-consultancy.demon.co.uk/
475   Example on how to automatically retrieve a document using a certificate with
476   a personal password:
478         curl -E /path/to/cert.pem:password https://secure.site.com/
480   If you neglect to specify the password on the command line, you will be
481   prompted for the correct password before any data can be received.
483   Many older SSL-servers have problems with SSLv3 or TLS, that newer versions
484   of OpenSSL etc is using, therefore it is sometimes useful to specify what
485   SSL-version curl should use. Use -3 or -2 to specify that exact SSL version
486   to use:
488         curl -2 https://secure.site.com/
490   Otherwise, curl will first attempt to use v3 and then v2.
492 RESUMING FILE TRANSFERS
494  To continue a file transfer where it was previously aborted, curl supports
495  resume on http(s) downloads as well as ftp uploads and downloads.
497  Continue downloading a document:
499         curl -c -o file ftp://ftp.server.com/path/file
501  Continue uploading a document(*1):
503         curl -c -T file ftp://ftp.server.com/path/file
505  Continue downloading a document from a web server(*2):
507         curl -c -o file http://www.server.com/
509  (*1) = This requires that the ftp server supports the non-standard command
510         SIZE. If it doesn't, curl will say so.
512  (*2) = This requires that the wb server supports at least HTTP/1.1. If it
513         doesn't, curl will say so.
515 TIME CONDITIONS
517  HTTP allows a client to specify a time condition for the document it
518  requests. It is If-Modified-Since or If-Unmodified-Since. Curl allow you to
519  specify them with the -z/--time-cond flag.
521  For example, you can easily make a download that only gets performed if the
522  remote file is newer than a local copy. It would be made like:
524         curl -z local.html http://remote.server.com/remote.html
526  Or you can download a file only if the local file is newer than the remote
527  one. Do this by prepending the date string with a '-', as in:
529         curl -z -local.html http://remote.server.com/remote.html
531  You can specify a "free text" date as condition. Tell curl to only download
532  the file if it was updated since yesterday:
534         curl -z yesterday http://remote.server.com/remote.html
536  Curl will then accept a wide range of date formats. You always make the date
537  check the other way around by prepending it with a dash '-'.
539 DICT
541   For fun try
543         curl dict://dict.org/m:curl
544         curl dict://dict.org/d:heisenbug:jargon
545         curl dict://dict.org/d:daniel:web1913
547   Aliases for 'm' are 'match' and 'find', and aliases for 'd' are 'define'
548   and 'lookup'. For example,
550         curl dict://dict.org/find:curl
552   Commands that break the URL description of the RFC (but not the DICT
553   protocol) are
555         curl dict://dict.org/show:db
556         curl dict://dict.org/show:strat
558   Authentication is still missing (but this is not required by the RFC)
560 LDAP
562   If you have installed the OpenLDAP library, curl can take advantage of it
563   and offer ldap:// support.
565   LDAP is a complex thing and writing an LDAP query is not an easy task. I do
566   advice you to dig up the syntax description for that elsewhere, RFC 1959 if
567   no other place is better.
569   To show you an example, this is now I can get all people from my local LDAP
570   server that has a certain sub-domain in their email address:
572         curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se"
574   If I want the same info in HTML format, I can get it by not using the -B
575   (enforce ASCII) flag.
577 ENVIRONMENT VARIABLES
579   Curl reads and understands the following environment variables:
581         HTTP_PROXY, HTTPS_PROXY, FTP_PROXY, GOPHER_PROXY
583   They should be set for protocol-specific proxies. General proxy should be
584   set with
585         
586         ALL_PROXY
588   A comma-separated list of host names that shouldn't go through any proxy is
589   set in (only an asterisk, '*' matches all hosts)
591         NO_PROXY
593   If a tail substring of the domain-path for a host matches one of these
594   strings, transactions with that node will not be proxied.
597   The usage of the -x/--proxy flag overrides the environment variables.
599 MAILING LIST
601   We have an open mailing list to discuss curl, its development and things
602   relevant to this.
604   To subscribe, mail curl-request@contactor.se with "subscribe <your email
605   address>" in the body.
607   To post to the list, mail curl@contactor.se.
609   To unsubcribe, mail curl-request@contactor.se with "unsubscribe <your
610   subscribed email address>" in the body.