Annotation of embedaddon/curl/docs/TheArtOfHttpScripting, revision 1.1

1.1     ! misho       1:                                   _   _ ____  _
        !             2:                               ___| | | |  _ \| |
        !             3:                              / __| | | | |_) | |
        !             4:                             | (__| |_| |  _ <| |___
        !             5:                              \___|\___/|_| \_\_____|
        !             6: 
        !             7: 
        !             8: The Art Of Scripting HTTP Requests Using Curl
        !             9: 
        !            10:  1. HTTP Scripting
        !            11:  1.1 Background
        !            12:  1.2 The HTTP Protocol
        !            13:  1.3 See the Protocol
        !            14:  1.4 See the Timing
        !            15:  1.5 See the Response
        !            16:  2. URL
        !            17:  2.1 Spec
        !            18:  2.2 Host
        !            19:  2.3 Port number
        !            20:  2.4 User name and password
        !            21:  2.5 Path part
        !            22:  3. Fetch a page
        !            23:  3.1 GET
        !            24:  3.2 HEAD
        !            25:  3.3 Multiple URLs in a single command line
        !            26:  3.4 Multiple HTTP methods in a single command line
        !            27:  4. HTML forms
        !            28:  4.1 Forms explained
        !            29:  4.2 GET
        !            30:  4.3 POST
        !            31:  4.4 File Upload POST
        !            32:  4.5 Hidden Fields
        !            33:  4.6 Figure Out What A POST Looks Like
        !            34:  5. HTTP upload
        !            35:  5.1 PUT
        !            36:  6. HTTP Authentication
        !            37:  6.1 Basic Authentication
        !            38:  6.2 Other Authentication
        !            39:  6.3 Proxy Authentication
        !            40:  6.4 Hiding credentials
        !            41:  7. More HTTP Headers
        !            42:  7.1 Referer
        !            43:  7.2 User Agent
        !            44:  8. Redirects
        !            45:  8.1 Location header
        !            46:  8.2 Other redirects
        !            47:  9. Cookies
        !            48:  9.1 Cookie Basics
        !            49:  9.2 Cookie options
        !            50:  10. HTTPS
        !            51:  10.1 HTTPS is HTTP secure
        !            52:  10.2 Certificates
        !            53:  11. Custom Request Elements
        !            54:  11.1 Modify method and headers
        !            55:  11.2 More on changed methods
        !            56:  12. Web Login
        !            57:  12.1 Some login tricks
        !            58:  13. Debug
        !            59:  13.1 Some debug tricks
        !            60:  14. References
        !            61:  14.1 Standards
        !            62:  14.2 Sites
        !            63: 
        !            64: ==============================================================================
        !            65: 
        !            66: 1. HTTP Scripting
        !            67: 
        !            68:  1.1 Background
        !            69: 
        !            70:  This document assumes that you're familiar with HTML and general networking.
        !            71: 
        !            72:  The increasing amount of applications moving to the web has made "HTTP
        !            73:  Scripting" more frequently requested and wanted. To be able to automatically
        !            74:  extract information from the web, to fake users, to post or upload data to
        !            75:  web servers are all important tasks today.
        !            76: 
        !            77:  Curl is a command line tool for doing all sorts of URL manipulations and
        !            78:  transfers, but this particular document will focus on how to use it when
        !            79:  doing HTTP requests for fun and profit. I'll assume that you know how to
        !            80:  invoke 'curl --help' or 'curl --manual' to get basic information about it.
        !            81: 
        !            82:  Curl is not written to do everything for you. It makes the requests, it gets
        !            83:  the data, it sends data and it retrieves the information. You probably need
        !            84:  to glue everything together using some kind of script language or repeated
        !            85:  manual invokes.
        !            86: 
        !            87:  1.2 The HTTP Protocol
        !            88: 
        !            89:  HTTP is the protocol used to fetch data from web servers. It is a very simple
        !            90:  protocol that is built upon TCP/IP. The protocol also allows information to
        !            91:  get sent to the server from the client using a few different methods, as will
        !            92:  be shown here.
        !            93: 
        !            94:  HTTP is plain ASCII text lines being sent by the client to a server to
        !            95:  request a particular action, and then the server replies a few text lines
        !            96:  before the actual requested content is sent to the client.
        !            97: 
        !            98:  The client, curl, sends a HTTP request. The request contains a method (like
        !            99:  GET, POST, HEAD etc), a number of request headers and sometimes a request
        !           100:  body. The HTTP server responds with a status line (indicating if things went
        !           101:  well), response headers and most often also a response body. The "body" part
        !           102:  is the plain data you requested, like the actual HTML or the image etc.
        !           103: 
        !           104:  1.3 See the Protocol
        !           105: 
        !           106:   Using curl's option --verbose (-v as a short option) will display what kind
        !           107:   of commands curl sends to the server, as well as a few other informational
        !           108:   texts.
        !           109: 
        !           110:   --verbose is the single most useful option when it comes to debug or even
        !           111:   understand the curl<->server interaction.
        !           112: 
        !           113:   Sometimes even --verbose is not enough. Then --trace and --trace-ascii offer
        !           114:   even more details as they show EVERYTHING curl sends and receives. Use it
        !           115:   like this:
        !           116: 
        !           117:       curl --trace-ascii debugdump.txt http://www.example.com/
        !           118: 
        !           119:  1.4 See the Timing
        !           120: 
        !           121:   Many times you may wonder what exactly is taking all the time, or you just
        !           122:   want to know the amount of milliseconds between two points in a
        !           123:   transfer. For those, and other similar situations, the --trace-time option
        !           124:   is what you need. It'll prepend the time to each trace output line:
        !           125: 
        !           126:       curl --trace-ascii d.txt --trace-time http://example.com/
        !           127: 
        !           128:  1.5 See the Response
        !           129: 
        !           130:   By default curl sends the response to stdout. You need to redirect it
        !           131:   somewhere to avoid that, most often that is done with -o or -O.
        !           132: 
        !           133: 2. URL
        !           134: 
        !           135:  2.1 Spec
        !           136: 
        !           137:  The Uniform Resource Locator format is how you specify the address of a
        !           138:  particular resource on the Internet. You know these, you've seen URLs like
        !           139:  https://curl.haxx.se or https://yourbank.com a million times. RFC 3986 is the
        !           140:  canonical spec. And yeah, the formal name is not URL, it is URI.
        !           141: 
        !           142:  2.2 Host
        !           143: 
        !           144:  The host name is usually resolved using DNS or your /etc/hosts file to an IP
        !           145:  address and that's what curl will communicate with. Alternatively you specify
        !           146:  the IP address directly in the URL instead of a name.
        !           147: 
        !           148:  For development and other trying out situations, you can point to a different
        !           149:  IP address for a host name than what would otherwise be used, by using curl's
        !           150:  --resolve option:
        !           151: 
        !           152:       curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/
        !           153: 
        !           154:  2.3 Port number
        !           155: 
        !           156:  Each protocol curl supports operates on a default port number, be it over TCP
        !           157:  or in some cases UDP. Normally you don't have to take that into
        !           158:  consideration, but at times you run test servers on other ports or
        !           159:  similar. Then you can specify the port number in the URL with a colon and a
        !           160:  number immediately following the host name. Like when doing HTTP to port
        !           161:  1234:
        !           162: 
        !           163:       curl http://www.example.org:1234/
        !           164: 
        !           165:  The port number you specify in the URL is the number that the server uses to
        !           166:  offer its services. Sometimes you may use a local proxy, and then you may
        !           167:  need to specify that proxy's port number separately for what curl needs to
        !           168:  connect to locally. Like when using a HTTP proxy on port 4321:
        !           169: 
        !           170:       curl --proxy http://proxy.example.org:4321 http://remote.example.org/
        !           171: 
        !           172:  2.4 User name and password
        !           173: 
        !           174:  Some services are setup to require HTTP authentication and then you need to
        !           175:  provide name and password which is then transferred to the remote site in
        !           176:  various ways depending on the exact authentication protocol used.
        !           177: 
        !           178:  You can opt to either insert the user and password in the URL or you can
        !           179:  provide them separately:
        !           180: 
        !           181:       curl http://user:password@example.org/
        !           182: 
        !           183:  or
        !           184: 
        !           185:       curl -u user:password http://example.org/
        !           186: 
        !           187:  You need to pay attention that this kind of HTTP authentication is not what
        !           188:  is usually done and requested by user-oriented web sites these days. They
        !           189:  tend to use forms and cookies instead.
        !           190: 
        !           191:  2.5 Path part
        !           192: 
        !           193:  The path part is just sent off to the server to request that it sends back
        !           194:  the associated response. The path is what is to the right side of the slash
        !           195:  that follows the host name and possibly port number.
        !           196: 
        !           197: 3. Fetch a page
        !           198: 
        !           199:  3.1 GET
        !           200: 
        !           201:  The simplest and most common request/operation made using HTTP is to GET a
        !           202:  URL. The URL could itself refer to a web page, an image or a file. The client
        !           203:  issues a GET request to the server and receives the document it asked for.
        !           204:  If you issue the command line
        !           205: 
        !           206:         curl https://curl.haxx.se
        !           207: 
        !           208:  you get a web page returned in your terminal window. The entire HTML document
        !           209:  that that URL holds.
        !           210: 
        !           211:  All HTTP replies contain a set of response headers that are normally hidden,
        !           212:  use curl's --include (-i) option to display them as well as the rest of the
        !           213:  document.
        !           214: 
        !           215:  3.2 HEAD
        !           216: 
        !           217:  You can ask the remote server for ONLY the headers by using the --head (-I)
        !           218:  option which will make curl issue a HEAD request. In some special cases
        !           219:  servers deny the HEAD method while others still work, which is a particular
        !           220:  kind of annoyance.
        !           221: 
        !           222:  The HEAD method is defined and made so that the server returns the headers
        !           223:  exactly the way it would do for a GET, but without a body. It means that you
        !           224:  may see a Content-Length: in the response headers, but there must not be an
        !           225:  actual body in the HEAD response.
        !           226: 
        !           227:  3.3 Multiple URLs in a single command line
        !           228: 
        !           229:  A single curl command line may involve one or many URLs. The most common case
        !           230:  is probably to just use one, but you can specify any amount of URLs. Yes
        !           231:  any. No limits. You'll then get requests repeated over and over for all the
        !           232:  given URLs.
        !           233: 
        !           234:  Example, send two GETs:
        !           235: 
        !           236:     curl http://url1.example.com http://url2.example.com
        !           237: 
        !           238:  If you use --data to POST to the URL, using multiple URLs means that you send
        !           239:  that same POST to all the given URLs.
        !           240: 
        !           241:  Example, send two POSTs:
        !           242: 
        !           243:     curl --data name=curl http://url1.example.com http://url2.example.com
        !           244: 
        !           245: 
        !           246:  3.4 Multiple HTTP methods in a single command line
        !           247: 
        !           248:  Sometimes you need to operate on several URLs in a single command line and do
        !           249:  different HTTP methods on each. For this, you'll enjoy the --next option. It
        !           250:  is basically a separator that separates a bunch of options from the next. All
        !           251:  the URLs before --next will get the same method and will get all the POST
        !           252:  data merged into one.
        !           253: 
        !           254:  When curl reaches the --next on the command line, it'll sort of reset the
        !           255:  method and the POST data and allow a new set.
        !           256: 
        !           257:  Perhaps this is best shown with a few examples. To send first a HEAD and then
        !           258:  a GET:
        !           259: 
        !           260:    curl -I http://example.com --next http://example.com
        !           261: 
        !           262:  To first send a POST and then a GET:
        !           263: 
        !           264:    curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html
        !           265: 
        !           266: 
        !           267: 4. HTML forms
        !           268: 
        !           269:  4.1 Forms explained
        !           270: 
        !           271:  Forms are the general way a web site can present a HTML page with fields for
        !           272:  the user to enter data in, and then press some kind of 'OK' or 'Submit'
        !           273:  button to get that data sent to the server. The server then typically uses
        !           274:  the posted data to decide how to act. Like using the entered words to search
        !           275:  in a database, or to add the info in a bug tracking system, display the entered
        !           276:  address on a map or using the info as a login-prompt verifying that the user
        !           277:  is allowed to see what it is about to see.
        !           278: 
        !           279:  Of course there has to be some kind of program on the server end to receive
        !           280:  the data you send. You cannot just invent something out of the air.
        !           281: 
        !           282:  4.2 GET
        !           283: 
        !           284:   A GET-form uses the method GET, as specified in HTML like:
        !           285: 
        !           286:         <form method="GET" action="junk.cgi">
        !           287:           <input type=text name="birthyear">
        !           288:           <input type=submit name=press value="OK">
        !           289:         </form>
        !           290: 
        !           291:   In your favorite browser, this form will appear with a text box to fill in
        !           292:   and a press-button labeled "OK". If you fill in '1905' and press the OK
        !           293:   button, your browser will then create a new URL to get for you. The URL will
        !           294:   get "junk.cgi?birthyear=1905&press=OK" appended to the path part of the
        !           295:   previous URL.
        !           296: 
        !           297:   If the original form was seen on the page "www.hotmail.com/when/birth.html",
        !           298:   the second page you'll get will become
        !           299:   "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK".
        !           300: 
        !           301:   Most search engines work this way.
        !           302: 
        !           303:   To make curl do the GET form post for you, just enter the expected created
        !           304:   URL:
        !           305: 
        !           306:         curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
        !           307: 
        !           308:  4.3 POST
        !           309: 
        !           310:   The GET method makes all input field names get displayed in the URL field of
        !           311:   your browser. That's generally a good thing when you want to be able to
        !           312:   bookmark that page with your given data, but it is an obvious disadvantage
        !           313:   if you entered secret information in one of the fields or if there are a
        !           314:   large amount of fields creating a very long and unreadable URL.
        !           315: 
        !           316:   The HTTP protocol then offers the POST method. This way the client sends the
        !           317:   data separated from the URL and thus you won't see any of it in the URL
        !           318:   address field.
        !           319: 
        !           320:   The form would look very similar to the previous one:
        !           321: 
        !           322:         <form method="POST" action="junk.cgi">
        !           323:           <input type=text name="birthyear">
        !           324:           <input type=submit name=press value=" OK ">
        !           325:         </form>
        !           326: 
        !           327:   And to use curl to post this form with the same data filled in as before, we
        !           328:   could do it like:
        !           329: 
        !           330:         curl --data "birthyear=1905&press=%20OK%20" \
        !           331:         http://www.example.com/when.cgi
        !           332: 
        !           333:   This kind of POST will use the Content-Type
        !           334:   application/x-www-form-urlencoded and is the most widely used POST kind.
        !           335: 
        !           336:   The data you send to the server MUST already be properly encoded, curl will
        !           337:   not do that for you. For example, if you want the data to contain a space,
        !           338:   you need to replace that space with %20 etc. Failing to comply with this
        !           339:   will most likely cause your data to be received wrongly and messed up.
        !           340: 
        !           341:   Recent curl versions can in fact url-encode POST data for you, like this:
        !           342: 
        !           343:         curl --data-urlencode "name=I am Daniel" http://www.example.com
        !           344: 
        !           345:   If you repeat --data several times on the command line, curl will
        !           346:   concatenate all the given data pieces - and put a '&' symbol between each
        !           347:   data segment.
        !           348: 
        !           349:  4.4 File Upload POST
        !           350: 
        !           351:   Back in late 1995 they defined an additional way to post data over HTTP. It
        !           352:   is documented in the RFC 1867, why this method sometimes is referred to as
        !           353:   RFC1867-posting.
        !           354: 
        !           355:   This method is mainly designed to better support file uploads. A form that
        !           356:   allows a user to upload a file could be written like this in HTML:
        !           357: 
        !           358:     <form method="POST" enctype='multipart/form-data' action="upload.cgi">
        !           359:       <input type=file name=upload>
        !           360:       <input type=submit name=press value="OK">
        !           361:     </form>
        !           362: 
        !           363:   This clearly shows that the Content-Type about to be sent is
        !           364:   multipart/form-data.
        !           365: 
        !           366:   To post to a form like this with curl, you enter a command line like:
        !           367: 
        !           368:         curl --form upload=@localfilename --form press=OK [URL]
        !           369: 
        !           370:  4.5 Hidden Fields
        !           371: 
        !           372:   A very common way for HTML based applications to pass state information
        !           373:   between pages is to add hidden fields to the forms. Hidden fields are
        !           374:   already filled in, they aren't displayed to the user and they get passed
        !           375:   along just as all the other fields.
        !           376: 
        !           377:   A similar example form with one visible field, one hidden field and one
        !           378:   submit button could look like:
        !           379: 
        !           380:     <form method="POST" action="foobar.cgi">
        !           381:       <input type=text name="birthyear">
        !           382:       <input type=hidden name="person" value="daniel">
        !           383:       <input type=submit name="press" value="OK">
        !           384:     </form>
        !           385: 
        !           386:   To POST this with curl, you won't have to think about if the fields are
        !           387:   hidden or not. To curl they're all the same:
        !           388: 
        !           389:         curl --data "birthyear=1905&press=OK&person=daniel" [URL]
        !           390: 
        !           391:  4.6 Figure Out What A POST Looks Like
        !           392: 
        !           393:   When you're about fill in a form and send to a server by using curl instead
        !           394:   of a browser, you're of course very interested in sending a POST exactly the
        !           395:   way your browser does.
        !           396: 
        !           397:   An easy way to get to see this, is to save the HTML page with the form on
        !           398:   your local disk, modify the 'method' to a GET, and press the submit button
        !           399:   (you could also change the action URL if you want to).
        !           400: 
        !           401:   You will then clearly see the data get appended to the URL, separated with a
        !           402:   '?'-letter as GET forms are supposed to.
        !           403: 
        !           404: 5. HTTP upload
        !           405: 
        !           406:  5.1 PUT
        !           407: 
        !           408:  Perhaps the best way to upload data to a HTTP server is to use PUT. Then
        !           409:  again, this of course requires that someone put a program or script on the
        !           410:  server end that knows how to receive a HTTP PUT stream.
        !           411: 
        !           412:  Put a file to a HTTP server with curl:
        !           413: 
        !           414:         curl --upload-file uploadfile http://www.example.com/receive.cgi
        !           415: 
        !           416: 6. HTTP Authentication
        !           417: 
        !           418:  6.1 Basic Authentication
        !           419: 
        !           420:  HTTP Authentication is the ability to tell the server your username and
        !           421:  password so that it can verify that you're allowed to do the request you're
        !           422:  doing. The Basic authentication used in HTTP (which is the type curl uses by
        !           423:  default) is *plain* *text* based, which means it sends username and password
        !           424:  only slightly obfuscated, but still fully readable by anyone that sniffs on
        !           425:  the network between you and the remote server.
        !           426: 
        !           427:  To tell curl to use a user and password for authentication:
        !           428: 
        !           429:         curl --user name:password http://www.example.com
        !           430: 
        !           431:  6.2 Other Authentication
        !           432: 
        !           433:  The site might require a different authentication method (check the headers
        !           434:  returned by the server), and then --ntlm, --digest, --negotiate or even
        !           435:  --anyauth might be options that suit you.
        !           436: 
        !           437:  6.3 Proxy Authentication
        !           438: 
        !           439:  Sometimes your HTTP access is only available through the use of a HTTP
        !           440:  proxy. This seems to be especially common at various companies. A HTTP proxy
        !           441:  may require its own user and password to allow the client to get through to
        !           442:  the Internet. To specify those with curl, run something like:
        !           443: 
        !           444:         curl --proxy-user proxyuser:proxypassword curl.haxx.se
        !           445: 
        !           446:  If your proxy requires the authentication to be done using the NTLM method,
        !           447:  use --proxy-ntlm, if it requires Digest use --proxy-digest.
        !           448: 
        !           449:  If you use any one of these user+password options but leave out the password
        !           450:  part, curl will prompt for the password interactively.
        !           451: 
        !           452:  6.4 Hiding credentials
        !           453: 
        !           454:  Do note that when a program is run, its parameters might be possible to see
        !           455:  when listing the running processes of the system. Thus, other users may be
        !           456:  able to watch your passwords if you pass them as plain command line
        !           457:  options. There are ways to circumvent this.
        !           458: 
        !           459:  It is worth noting that while this is how HTTP Authentication works, very
        !           460:  many web sites will not use this concept when they provide logins etc. See
        !           461:  the Web Login chapter further below for more details on that.
        !           462: 
        !           463: 7. More HTTP Headers
        !           464: 
        !           465:  7.1 Referer
        !           466: 
        !           467:  A HTTP request may include a 'referer' field (yes it is misspelled), which
        !           468:  can be used to tell from which URL the client got to this particular
        !           469:  resource. Some programs/scripts check the referer field of requests to verify
        !           470:  that this wasn't arriving from an external site or an unknown page. While
        !           471:  this is a stupid way to check something so easily forged, many scripts still
        !           472:  do it. Using curl, you can put anything you want in the referer-field and
        !           473:  thus more easily be able to fool the server into serving your request.
        !           474: 
        !           475:  Use curl to set the referer field with:
        !           476: 
        !           477:         curl --referer http://www.example.come http://www.example.com
        !           478: 
        !           479:  7.2 User Agent
        !           480: 
        !           481:  Very similar to the referer field, all HTTP requests may set the User-Agent
        !           482:  field. It names what user agent (client) that is being used. Many
        !           483:  applications use this information to decide how to display pages. Silly web
        !           484:  programmers try to make different pages for users of different browsers to
        !           485:  make them look the best possible for their particular browsers. They usually
        !           486:  also do different kinds of javascript, vbscript etc.
        !           487: 
        !           488:  At times, you will see that getting a page with curl will not return the same
        !           489:  page that you see when getting the page with your browser. Then you know it
        !           490:  is time to set the User Agent field to fool the server into thinking you're
        !           491:  one of those browsers.
        !           492: 
        !           493:  To make curl look like Internet Explorer 5 on a Windows 2000 box:
        !           494: 
        !           495:   curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
        !           496: 
        !           497:  Or why not look like you're using Netscape 4.73 on an old Linux box:
        !           498: 
        !           499:   curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
        !           500: 
        !           501: 8. Redirects
        !           502: 
        !           503:  8.1 Location header
        !           504: 
        !           505:  When a resource is requested from a server, the reply from the server may
        !           506:  include a hint about where the browser should go next to find this page, or a
        !           507:  new page keeping newly generated output. The header that tells the browser
        !           508:  to redirect is Location:.
        !           509: 
        !           510:  Curl does not follow Location: headers by default, but will simply display
        !           511:  such pages in the same manner it displays all HTTP replies. It does however
        !           512:  feature an option that will make it attempt to follow the Location: pointers.
        !           513: 
        !           514:  To tell curl to follow a Location:
        !           515: 
        !           516:         curl --location http://www.example.com
        !           517: 
        !           518:  If you use curl to POST to a site that immediately redirects you to another
        !           519:  page, you can safely use --location (-L) and --data/--form together. Curl will
        !           520:  only use POST in the first request, and then revert to GET in the following
        !           521:  operations.
        !           522: 
        !           523:  8.2 Other redirects
        !           524: 
        !           525:  Browser typically support at least two other ways of redirects that curl
        !           526:  doesn't: first the html may contain a meta refresh tag that asks the browser
        !           527:  to load a specific URL after a set number of seconds, or it may use
        !           528:  javascript to do it.
        !           529: 
        !           530: 9. Cookies
        !           531: 
        !           532:  9.1 Cookie Basics
        !           533: 
        !           534:  The way the web browsers do "client side state control" is by using
        !           535:  cookies. Cookies are just names with associated contents. The cookies are
        !           536:  sent to the client by the server. The server tells the client for what path
        !           537:  and host name it wants the cookie sent back, and it also sends an expiration
        !           538:  date and a few more properties.
        !           539: 
        !           540:  When a client communicates with a server with a name and path as previously
        !           541:  specified in a received cookie, the client sends back the cookies and their
        !           542:  contents to the server, unless of course they are expired.
        !           543: 
        !           544:  Many applications and servers use this method to connect a series of requests
        !           545:  into a single logical session. To be able to use curl in such occasions, we
        !           546:  must be able to record and send back cookies the way the web application
        !           547:  expects them. The same way browsers deal with them.
        !           548: 
        !           549:  9.2 Cookie options
        !           550: 
        !           551:  The simplest way to send a few cookies to the server when getting a page with
        !           552:  curl is to add them on the command line like:
        !           553: 
        !           554:         curl --cookie "name=Daniel" http://www.example.com
        !           555: 
        !           556:  Cookies are sent as common HTTP headers. This is practical as it allows curl
        !           557:  to record cookies simply by recording headers. Record cookies with curl by
        !           558:  using the --dump-header (-D) option like:
        !           559: 
        !           560:         curl --dump-header headers_and_cookies http://www.example.com
        !           561: 
        !           562:  (Take note that the --cookie-jar option described below is a better way to
        !           563:  store cookies.)
        !           564: 
        !           565:  Curl has a full blown cookie parsing engine built-in that comes in use if you
        !           566:  want to reconnect to a server and use cookies that were stored from a
        !           567:  previous connection (or hand-crafted manually to fool the server into
        !           568:  believing you had a previous connection). To use previously stored cookies,
        !           569:  you run curl like:
        !           570: 
        !           571:         curl --cookie stored_cookies_in_file http://www.example.com
        !           572: 
        !           573:  Curl's "cookie engine" gets enabled when you use the --cookie option. If you
        !           574:  only want curl to understand received cookies, use --cookie with a file that
        !           575:  doesn't exist. Example, if you want to let curl understand cookies from a
        !           576:  page and follow a location (and thus possibly send back cookies it received),
        !           577:  you can invoke it like:
        !           578: 
        !           579:         curl --cookie nada --location http://www.example.com
        !           580: 
        !           581:  Curl has the ability to read and write cookie files that use the same file
        !           582:  format that Netscape and Mozilla once used. It is a convenient way to share
        !           583:  cookies between scripts or invokes. The --cookie (-b) switch automatically
        !           584:  detects if a given file is such a cookie file and parses it, and by using the
        !           585:  --cookie-jar (-c) option you'll make curl write a new cookie file at the end
        !           586:  of an operation:
        !           587: 
        !           588:         curl --cookie cookies.txt --cookie-jar newcookies.txt \
        !           589:         http://www.example.com
        !           590: 
        !           591: 10. HTTPS
        !           592: 
        !           593:  10.1 HTTPS is HTTP secure
        !           594: 
        !           595:  There are a few ways to do secure HTTP transfers. By far the most common
        !           596:  protocol for doing this is what is generally known as HTTPS, HTTP over
        !           597:  SSL. SSL encrypts all the data that is sent and received over the network and
        !           598:  thus makes it harder for attackers to spy on sensitive information.
        !           599: 
        !           600:  SSL (or TLS as the latest version of the standard is called) offers a
        !           601:  truckload of advanced features to allow all those encryptions and key
        !           602:  infrastructure mechanisms encrypted HTTP requires.
        !           603: 
        !           604:  Curl supports encrypted fetches when built to use a TLS library and it can be
        !           605:  built to use one out of a fairly large set of libraries - "curl -V" will show
        !           606:  which one your curl was built to use (if any!). To get a page from a HTTPS
        !           607:  server, simply run curl like:
        !           608: 
        !           609:         curl https://secure.example.com
        !           610: 
        !           611:  10.2 Certificates
        !           612: 
        !           613:   In the HTTPS world, you use certificates to validate that you are the one
        !           614:   you claim to be, as an addition to normal passwords. Curl supports client-
        !           615:   side certificates. All certificates are locked with a pass phrase, which you
        !           616:   need to enter before the certificate can be used by curl. The pass phrase
        !           617:   can be specified on the command line or if not, entered interactively when
        !           618:   curl queries for it. Use a certificate with curl on a HTTPS server like:
        !           619: 
        !           620:         curl --cert mycert.pem https://secure.example.com
        !           621: 
        !           622:   curl also tries to verify that the server is who it claims to be, by
        !           623:   verifying the server's certificate against a locally stored CA cert
        !           624:   bundle. Failing the verification will cause curl to deny the connection. You
        !           625:   must then use --insecure (-k) in case you want to tell curl to ignore that
        !           626:   the server can't be verified.
        !           627: 
        !           628:   More about server certificate verification and ca cert bundles can be read
        !           629:   in the SSLCERTS document, available online here:
        !           630: 
        !           631:         https://curl.haxx.se/docs/sslcerts.html
        !           632: 
        !           633:   At times you may end up with your own CA cert store and then you can tell
        !           634:   curl to use that to verify the server's certificate:
        !           635: 
        !           636:         curl --cacert ca-bundle.pem https://example.com/
        !           637: 
        !           638: 
        !           639: 11. Custom Request Elements
        !           640: 
        !           641: 11.1 Modify method and headers
        !           642: 
        !           643:  Doing fancy stuff, you may need to add or change elements of a single curl
        !           644:  request.
        !           645: 
        !           646:  For example, you can change the POST request to a PROPFIND and send the data
        !           647:  as "Content-Type: text/xml" (instead of the default Content-Type) like this:
        !           648: 
        !           649:          curl --data "<xml>" --header "Content-Type: text/xml" \
        !           650:               --request PROPFIND url.com
        !           651: 
        !           652:  You can delete a default header by providing one without content. Like you
        !           653:  can ruin the request by chopping off the Host: header:
        !           654: 
        !           655:         curl --header "Host:" http://www.example.com
        !           656: 
        !           657:  You can add headers the same way. Your server may want a "Destination:"
        !           658:  header, and you can add it:
        !           659: 
        !           660:         curl --header "Destination: http://nowhere" http://example.com
        !           661: 
        !           662:  11.2 More on changed methods
        !           663: 
        !           664:  It should be noted that curl selects which methods to use on its own
        !           665:  depending on what action to ask for. -d will do POST, -I will do HEAD and so
        !           666:  on. If you use the --request / -X option you can change the method keyword
        !           667:  curl selects, but you will not modify curl's behavior. This means that if you
        !           668:  for example use -d "data" to do a POST, you can modify the method to a
        !           669:  PROPFIND with -X and curl will still think it sends a POST. You can change
        !           670:  the normal GET to a POST method by simply adding -X POST in a command line
        !           671:  like:
        !           672: 
        !           673:         curl -X POST http://example.org/
        !           674: 
        !           675:  ... but curl will still think and act as if it sent a GET so it won't send any
        !           676:  request body etc.
        !           677: 
        !           678: 
        !           679: 12. Web Login
        !           680: 
        !           681:  12.1 Some login tricks
        !           682: 
        !           683:  While not strictly just HTTP related, it still causes a lot of people problems
        !           684:  so here's the executive run-down of how the vast majority of all login forms
        !           685:  work and how to login to them using curl.
        !           686: 
        !           687:  It can also be noted that to do this properly in an automated fashion, you
        !           688:  will most certainly need to script things and do multiple curl invokes etc.
        !           689: 
        !           690:  First, servers mostly use cookies to track the logged-in status of the
        !           691:  client, so you will need to capture the cookies you receive in the
        !           692:  responses. Then, many sites also set a special cookie on the login page (to
        !           693:  make sure you got there through their login page) so you should make a habit
        !           694:  of first getting the login-form page to capture the cookies set there.
        !           695: 
        !           696:  Some web-based login systems feature various amounts of javascript, and
        !           697:  sometimes they use such code to set or modify cookie contents. Possibly they
        !           698:  do that to prevent programmed logins, like this manual describes how to...
        !           699:  Anyway, if reading the code isn't enough to let you repeat the behavior
        !           700:  manually, capturing the HTTP requests done by your browsers and analyzing the
        !           701:  sent cookies is usually a working method to work out how to shortcut the
        !           702:  javascript need.
        !           703: 
        !           704:  In the actual <form> tag for the login, lots of sites fill-in random/session
        !           705:  or otherwise secretly generated hidden tags and you may need to first capture
        !           706:  the HTML code for the login form and extract all the hidden fields to be able
        !           707:  to do a proper login POST. Remember that the contents need to be URL encoded
        !           708:  when sent in a normal POST.
        !           709: 
        !           710: 13. Debug
        !           711: 
        !           712:  13.1 Some debug tricks
        !           713: 
        !           714:  Many times when you run curl on a site, you'll notice that the site doesn't
        !           715:  seem to respond the same way to your curl requests as it does to your
        !           716:  browser's.
        !           717: 
        !           718:  Then you need to start making your curl requests more similar to your
        !           719:  browser's requests:
        !           720: 
        !           721:  * Use the --trace-ascii option to store fully detailed logs of the requests
        !           722:  for easier analyzing and better understanding
        !           723: 
        !           724:  * Make sure you check for and use cookies when needed (both reading with
        !           725:  --cookie and writing with --cookie-jar)
        !           726: 
        !           727:  * Set user-agent to one like a recent popular browser does
        !           728: 
        !           729:  * Set referer like it is set by the browser
        !           730: 
        !           731:  * If you use POST, make sure you send all the fields and in the same order as
        !           732:  the browser does it.
        !           733: 
        !           734:  A very good helper to make sure you do this right, is the LiveHTTPHeader tool
        !           735:  that lets you view all headers you send and receive with Mozilla/Firefox
        !           736:  (even when using HTTPS). Chrome features similar functionality out of the box
        !           737:  among the developer's tools.
        !           738: 
        !           739:  A more raw approach is to capture the HTTP traffic on the network with tools
        !           740:  such as ethereal or tcpdump and check what headers that were sent and
        !           741:  received by the browser. (HTTPS makes this technique inefficient.)
        !           742: 
        !           743: 14. References
        !           744: 
        !           745:  14.1 Standards
        !           746: 
        !           747:  RFC 7230 is a must to read if you want in-depth understanding of the HTTP
        !           748:  protocol
        !           749: 
        !           750:  RFC 3986 explains the URL syntax
        !           751: 
        !           752:  RFC 1867 defines the HTTP post upload format
        !           753: 
        !           754:  RFC 6525 defines how HTTP cookies work
        !           755: 
        !           756:  14.2 Sites
        !           757: 
        !           758:  https://curl.haxx.se is the home of the curl project

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>