draft-ietf-http-v11-spec-03.txt

Here is the plain text version..

Paul Leach
>============
>
>
>
>
>
>
>
>
>HTTP Working Group                                R. Fielding, UC
>Irvine
>INTERNET-DRAFT                                       H. Frystyk,
>MIT/LCS
><draft-ietf-http-v11-spec-03.html>               T. Berners-Lee,
>MIT/LCS
>                                                          J. Gettys,
>DEC
>                                                        J. C. Mogul,
>DEC
>Expires October 2, 1996                                      May 2,
>1996
>
>                Hypertext Transfer Protocol -- HTTP/1.1
>
>
>1 Status of this Memo
>This document is an Internet-Draft. Internet-Drafts are working
>documents of the Internet Engineering Task Force (IETF), its areas, and
>its working groups. Note that other groups may also distribute working
>documents as Internet-Drafts.
>
>Internet-Drafts are draft documents valid for a maximum of six months
>and may be updated, replaced, or made obsolete by other documents at
>any
>time. It is inappropriate to use Internet-Drafts as reference material
>or to cite them other than as "work in progress".
>
>To learn the current status of any Internet-Draft, please check the
>"1id-abstracts.txt" listing contained in the Internet-Drafts Shadow
>Directories on ftp.is.co.za (Africa), nic.nordu.net (Europe),
>munnari.oz.au (Pacific Rim), ds.internic.net (US East Coast), or
>ftp.isi.edu (US West Coast).
>
>Distribution of this document is unlimited. Please send comments to the
>HTTP working group at <http-wg@cuckoo.hpl.hp.com>. Discussions of the
>working group are archived at
><URL:http://www.ics.uci.edu/pub/ietf/http/>. General discussions about
>HTTP and the applications which use HTTP should take place on the <www-
>talk@w3.org> mailing list.
>
>  NOTE: This specification is for discussion purposes only. It is not
>  claimed to represent the consensus of the HTTP working group, and
>  contains a number of proposals that either have not been discussed
>  or are controversial. The working group is discussing significant
>  changes in many areas, including - support for caching, persistent
>  connections, range retrieval, content negotiation, MIME
>  compatibility, authentication, timing of the PUT operation.
>
>
>2 Abstract
>The Hypertext Transfer Protocol (HTTP) is an application-level protocol
>for distributed, collaborative, hypermedia information systems. It is a
>generic, stateless, object-oriented protocol which can be used for many
>tasks, such as name servers and distributed object management systems,
>through extension of its request methods (commands). A feature of HTTP
>is the typing and negotiation of data representation, allowing systems
>to be built independently of the data being transferred.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys and Mogul    [Page 1]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>HTTP has been in use by the World-Wide Web global information
>initiative
>since 1990. This specification defines the protocol referred to as
>"HTTP/1.1".
>
>3 Note to Readers of This Document
>
>
>We believe this draft to be very close to consensus of the working
>group
>in terms of functionality for HTTP/1.1, and the text substantially
>correct.  One final technical change NOT reflected in this draft is to
>make persistent connections the default behavior for HTTP/1.1;
>editorial
>changes to reflect this in the next, and we hope final draft, are being
>circulated in the working group mailing list.
>
>This draft has undergone extensive reorganization to improve
>presentation.  Let us know if there are remaining problems.
>
>The terminology used in this draft has changed to reduce confusion.
>While we are converging on a shared set of terminology and definitions,
>it is possible there will be a final set of terminology adopted in the
>next draft.  Despite any terminology changes that may occur to improve
>the presentation of the specification, we do not expect to change the
>name of any header field or parameter name.
>
>There are a very few remaining issues indicated by Editor's Note: in
>bold font.
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul   [Page 2]
>
>
>
>
>
>
>
>4 Table of Contents
>
>
>HYPERTEXT TRANSFER PROTOCOL -- HTTP/1.1                               
>1
>
>1 Status of this Memo                                                 
>1
>
>2 Abstract                                                            
>1
>
>3 Note to Readers of This Document                                    
>2
>
>4 Table of Contents                                                   
>3
>
>5 Introduction                                                        
>7
> 5.1 Purpose                                                          
>7
> 5.2 Requirements                                                     
>7
> 5.3 Terminology                                                      
>8
> 5.4 Overall Operation                                               
>11
> 5.5 HTTP and MIME                                                   
>13
>
>6 Notational Conventions and Generic Grammar                         
>13
> 6.1 Augmented BNF                                                   
>13
> 6.2 Basic Rules                                                     
>14
>
>7 Protocol Parameters                                                
>16
> 7.1 HTTP Version                                                    
>16
> 7.2 Uniform Resource Identifiers                                    
>17
> 7.3 Date/Time Formats                                               
>19
> 7.4 Character Sets                                                  
>21
> 7.5 Content Codings                                                 
>22
> 7.6 Transfer Codings                                                
>23
> 7.7 Media Types                                                     
>24
> 7.8 Product Tokens                                                  
>26
> 7.9 Quality Values                                                  
>26
> 7.10 Language Tags                                                  
>27
> 7.11 Entity Tags                                                    
>27
> 7.12 Variant IDs                                                    
>28
> 7.13 Variant Sets                                                   
>28
> 7.14 Range Protocol Parameters                                      
>28
>
>8 HTTP Message                                                       
>31
> 8.1 Message Types                                                   
>31
> 8.2 Message Headers                                                 
>31
> 8.3 General Header Fields                                           
>32
>
>9 Request                                                            
>32
> 9.1 Request-Line                                                    
>33
> 9.2 The Resource Identified by a Request                            
>35
> 9.3 Request Header Fields                                           
>35
>
>10 Response                                                          
>36
> 10.1 Status-Line                                                    
>36
> 10.2 Response Header Fields                                         
>38
>
>Fielding, Frystyk, Berners-Lee, Gettys and Mogul    [Page 3]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>11 Entity                                                            
>38
> 11.1 Entity Header Fields                                           
>39
> 11.2 Entity Body                                                    
>39
>
>12 Status Code Definitions                                           
>41
> 12.1 Informational 1xx                                              
>41
> 12.2 Successful 2xx                                                 
>41
> 12.3 Redirection 3xx                                                
>43
> 12.4 Client Error 4xx                                               
>45
> 12.5 Server Error 5xx                                               
>49
>
>13 Method Definitions                                                
>50
> 13.1 OPTIONS                                                        
>50
> 13.2 GET                                                            
>51
> 13.3 HEAD                                                           
>51
> 13.4 POST                                                           
>51
> 13.5 PUT                                                            
>54
> 13.6 DELETE                                                         
>55
> 13.7 TRACE                                                          
>55
>
>14 Access Authentication                                             
>56
> 14.1 Basic Authentication Scheme                                    
>57
> 14.2 Digest Authentication Scheme                                   
>58
>
>15 Content Negotiation                                               
>58
> 15.1 Negotiation Facilities Defined in this Specification           
>59
>
>16 Caching in HTTP                                                   
>59
> 16.1 Semantic Transparency                                          
>59
> 16.2 Expiration Model                                               
>63
> 16.3 Validation Model                                               
>68
> 16.4 Constructing Responses From Caches                             
>73
> 16.5 Caching and Generic Resources                                  
>75
> 16.6 Shared and Non-Shared Caches                                   
>76
> 16.7 Selecting a Cached Response                                    
>77
> 16.8 Errors or Incomplete Response Cache Behavior                   
>77
> 16.9 Side Effects of GET and HEAD                                   
>78
> 16.10 Invalidation After Updates or Deletions                       
>78
> 16.11 Write-Through Mandatory                                       
>79
> 16.12 Generic Resources and HTTP/1.0 Proxy Caches                   
>79
> 16.13 Cache Replacement                                             
>80
> 16.14 Caching of Negative Responses                                 
>80
> 16.15 History Lists                                                 
>80
>
>17 Persistent Connections                                            
>80
> 17.1 Purpose                                                        
>80
> 17.2 Overall Operation                                              
>81
> 17.3 Proxy Servers                                                  
>82
> 17.4 Interaction with Security Protocols                            
>82
> 17.5 Practical Considerations                                       
>83
>
>18 Header Field Definitions                                          
>83
> 18.1 Accept                                                         
>83
> 18.2 Accept-Charset                                                 
>85
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul   [Page 4]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
> 18.3 Accept-Encoding                                                
>86
> 18.4 Accept-Language                                                
>86
> 18.5 Accept-Ranges                                                  
>87
> 18.6 Age                                                            
>88
> 18.7 Allow                                                          
>88
> 18.8 Alternates                                                     
>89
> 18.9 Authorization                                                  
>89
> 18.10 Cache-Control                                                 
>90
> 18.11 Connection                                                    
>96
> 18.12 Content-Base                                                  
>97
> 18.13 Content-Encoding                                              
>97
> 18.14 Content-Language                                              
>97
> 18.15 Content-Length                                                
>98
> 18.16 Content-Location                                              
>99
> 18.17 Content-MD5                                                   
>99
> 18.18 Content-Range                                                
>100
> 18.19 Content-Type                                                 
>101
> 18.20 Date                                                         
>102
> 18.21 ETag                                                         
>102
> 18.22 Expires                                                      
>103
> 18.23 From                                                         
>104
> 18.24 Host                                                         
>104
> 18.25 If-Modified-Since                                            
>105
> 18.26 If-Match                                                     
>106
> 18.27 If-NoneMatch                                                 
>107
> 18.28 If-Range                                                     
>108
> 18.29 If-Unmodified-Since                                          
>108
> 18.30 Last-Modified                                                
>109
> 18.31 Location                                                     
>109
> 18.32 Max-Forwards                                                 
>110
> 18.33 Persist                                                      
>110
> 18.34 Pragma                                                       
>111
> 18.35 Proxy-Authenticate                                           
>111
> 18.36 Proxy-Authorization                                          
>111
> 18.37 Public                                                       
>112
> 18.38 Range                                                        
>112
> 18.39 Referer                                                      
>113
> 18.40 Retry-After                                                  
>113
> 18.41 Server                                                       
>113
> 18.42 Title                                                        
>114
> 18.43 Transfer Encoding                                            
>114
> 18.44 Upgrade                                                      
>114
> 18.45 User-Agent                                                   
>115
> 18.46 Vary                                                         
>116
> 18.47 Via                                                          
>118
> 18.48 Warning                                                      
>120
> 18.49 WWW-Authenticate                                             
>121
>
>19 Security Considerations                                          
>121
> 19.1 Authentication of Clients                                     
>122
> 19.2 Safe Methods                                                  
>123
> 19.3 Abuse of Server Log Information                               
>123
> 19.4 Transfer of Sensitive Information                             
>123
> 19.5 Attacks Based On File and Path Names                          
>124
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul   [Page 5]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
> 19.6 Personal Information                                          
>124
> 19.7 Privacy Issues Connected to Accept headers                    
>124
> 19.8 DNS Spoofing                                                  
>125
> 19.9 Location Headers and Spoofing                                 
>126
>
>20 Acknowledgments                                                  
>126
>
>21 References                                                       
>127
>
>22 Authors' Addresses                                               
>130
>
>23 Appendices                                                       
>131
> 23.1 Internet Media Type message/http                              
>131
> 23.2 Tolerant Applications                                         
>131
> 23.3 Differences Between  HTTP Bodies and RFC 1521 Internet Message
> Bodies                                                             
>132
> 23.4 Changes from HTTP/1.0                                         
>134
> 23.5 Additional Features                                           
>135
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul   [Page 6]
>
>
>
>
>
>
>5 Introduction
>5.1 Purpose
>The Hypertext Transfer Protocol (HTTP) is an application-level protocol
>for distributed, collaborative, hypermedia information systems. HTTP
>has
>been in use by the World-Wide Web global information initiative since
>1990. The first version of HTTP, referred to as HTTP/0.9, was a simple
>protocol for raw data transfer across the Internet. HTTP/1.0, as
>defined
>by RFC xxxx , improved the protocol by allowing messages to be in the
>format of MIME-like entities, containing metainformation about the data
>transferred and modifiers on the request/response semantics. However,
>HTTP/1.0 does not sufficiently take into consideration the effect of
>hierarchical proxies , caching, the need for persistent connections and
>virtual hosts.. In addition, the proliferation of incompletely-
>implemented applications calling themselves "HTTP/1.0" has necessitated
>a protocol version change in order for two communicating applications
>to
>determine each other's true capabilities.
>
>This specification defines the protocol referred to as "HTTP/1.1". This
>protocol is backwards-compatible with HTTP/1.0, but includes more
>stringent requirements in order to ensure reliable implementation of
>its
>features.
>
>Practical information systems require more functionality than simple
>retrieval, including search, front-end update, and annotation. HTTP
>allows an open-ended set of methods that indicate the purpose of a
>request. It builds on the discipline of reference provided by the
>Uniform Resource Identifier (URI) , as a location (URL)  or name (URN)
>,
>for indicating the resource to which a method is to be applied.
>Messages
>are passed in a format similar to that used by Internet Mail  and the
>Multipurpose Internet Mail Extensions (MIME) .
>
>HTTP is also used as a generic protocol for communication between user
>agents and proxies/gateways to other Internet protocols, such as SMTP ,
>NNTP , FTP , Gopher , and WAIS , allowing basic hypermedia access to
>resources available from diverse applications and simplifying the
>implementation of user agents.
>
>
>5.2 Requirements
>This specification uses the same words as RFC 1123  for defining the
>significance of each particular requirement. These words are:
>
>
>MUST
>     This word or the adjective "required" means that the item is an
>     absolute requirement of the specification.
>
>SHOULD
>     This word or the adjective "recommended" means that there may
>exist
>     valid reasons in particular circumstances to ignore this item, but
>     the full implications should be understood and the case carefully
>     weighed before choosing a different course.
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys and Mogul    [Page 7]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>MAY
>     This word or the adjective "optional" means that this item is
>truly
>     optional. One vendor may choose to include the item because a
>     particular marketplace requires it or because it enhances the
>     product, for example; another vendor may omit the same item.
>An implementation is not compliant if it fails to satisfy one or more
>of
>the MUST requirements for the protocols it implements. An
>implementation
>that satisfies all the MUST and all the SHOULD requirements for its
>protocols is said to be "unconditionally compliant"; one that satisfies
>all the MUST requirements but not all the SHOULD requirements for its
>protocols is said to be "conditionally compliant".
>
>
>5.3 Terminology
>This specification uses a number of terms to refer to the roles played
>by participants in, and objects of, the HTTP communication.
>
>
>connection
>  A transport layer virtual circuit established between two programs
>  for the purpose of communication.
>
>message
>  The basic unit of HTTP communication, consisting of a structured
>  sequence of octets matching the syntax defined in section 8 and
>  transmitted via the connection.
>
>request
>  An HTTP request message as defined in section 9.
>
>response
>  An HTTP response message as defined in section 10.
>
>resource
>  A network data object or service that can be identified by a URI
>  (section 7.2).  At any point in time, a resource may be either a
>  plain resource, which corresponds to only one possible
>  representation, or a generic resource.
>
>generic resource
>  A resource that is a set of closely related representations of the
>  same document, form, applet, etc. A generic resource is always
>  identified by a URI. The individual representations may each be
>  identified by a unique URI, or by the combination of the generic
>  resource's URI and a variant-ID, or by the combination of the generic
>  resource's URI and some "content-negotiation" mechanism.  In this
>  case, other URIs may exist which identify a resource more
>  specifically.
>
>plain resource
>  A resource that is not a generic resource.  A plain resource is
>  always identified by a URI.
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul   [Page 8]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>entity
>  The set of information transferred as the payload of a request or
>  response  An entity consists of metainformation in the form of
>  Entity-Header fields and content in the form of an Entity-Body, as
>  described in section 11.
>
>resource entity
>  A specific representation, rendition, encoding, or presentation of a
>  network data object or service, either a plain resource or a specific
>  member of a generic resource.  A resource entity might be identified
>  by a URI, or by the combination of a URI and a variant-ID, or by the
>  combination of a URI and some other mechanism. An plain resource MUST
>  be bound to a single resource entity at any instant in time.
>
>variant
>  A resource entity that is a member of at least one generic resource.
>  Sometimes called a resource variant.  Note that the set of variants
>  of a generic resource may change over time as well.
>
>content negotiation
>  The mechanism for selecting the appropriate variant of a generic
>  resource when servicing a request, as described in section 15.
>
>entity tag
>  An opaque string associated with an entity and used to distinguish it
>  from other entities of the requested resource .  A "strong entity
>  tag" is one that may be shared by two entities of a resource only if
>  they are equivalent by octet equality.  A "weak entity tag" is one
>  that may be shared by two entities of a resource if they are
>  equivalent and could be substituted for each other with no
>  significant change in semantics.  A given entity tag value may be
>  used for entities obtained by requests on different URIs without
>  implying anything about the equivalence of these entities.
>
>client
>  An application program that establishes connections for the purpose
>  of sending requests.
>
>user agent
>  The client which initiates a request. These are often browsers,
>  editors, spiders (web-traversing robots), or other end user tools.
>
>server
>  An application program that accepts connections in order to service
>  requests by sending back responses. Any given program MAY be capable
>  of being both a client and a server; our use of these terms refers
>  only to the role being performed by the program for a particular
>  connection, rather than to the program's capabilities in general.
>  Likewise, any server MAY act as an origin server, proxy, gateway, or
>  tunnel, switching behavior based on the nature of each request.
>
>origin server
>  The server on which a given resource resides or is to be created.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul   [Page 9]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>proxy
>  An intermediary program which acts as both a server and a client for
>  the purpose of making requests on behalf of other clients. Requests
>  are serviced internally or by passing them on, with possible
>  translation, to other servers. A proxy MUST interpret and, if
>  necessary, rewrite a request message before forwarding it. Proxies
>  are often used as client-side portals through network firewalls and
>  as helper applications for handling requests via protocols not
>  implemented by the user agent.
>
>gateway
>  A server which acts as an intermediary for some other server. Unlike
>  a proxy, a gateway receives requests as if it were the origin server
>  for the requested resource; the requesting client may not be aware
>  that it is communicating with a gateway. Gateways are often used as
>  server-side portals through network firewalls and as protocol
>  translators for access to resources stored on non-HTTP systems.
>
>tunnel
>  An intermediary program which is acting as a blind relay between two
>  connections. Once active, a tunnel is not considered a party to the
>  HTTP communication, though the tunnel may have been initiated by an
>  HTTP request. The tunnel ceases to exist when both ends of the
>  relayed connections are closed. Tunnels are used when a portal is
>  necessary and the intermediary cannot, or should not, interpret the
>  relayed communication.
>
>cache
>  A program's local store of response messages and the subsystem that
>  controls its message storage, retrieval, and deletion. A cache stores
>  cachable responses in order to reduce the response time and network
>  bandwidth consumption on future, equivalent requests. Any client or
>  server MAY include a cache, though a cache cannot be used by a server
>  that acts acting as a tunnel.
>
>cachable
>  A response is cachable if a cache is allowed to store a copy of the
>  response message for use in answering subsequent requests. The rules
>  for determining the cachability of HTTP responses are defined in
>  Section 16.  Even if a resource is cachable, there may be additional
>  constraints on when and if a cache can use the cached copy for a
>  particular request.
>
>firsthand
>  A response is firsthand if it comes directly and without unnecessary
>  delay from the origin server, perhaps via one or more proxies.  A
>  response is also firsthand if its validity has just been checked
>  directly with the origin server.
>
>explicit expiration time
>  The time at which the origin server intends that an entity should no
>  longer be returned by a cache without further validation.
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 10]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>heuristic expiration time
>  An expiration time assigned by a cache when no explicit expiration
>  time is available.
>
>age
>  The age of a response is the time since it was generated by, or
>  successfully validated with, the origin server.
>
>freshness lifetime
>  The length of time between the generation of a response and its
>  expiration time.
>
>fresh
>  A response is fresh if its age has not yet exceeded its freshness
>  lifetime.
>
>stale
>  A response is stale if its age has passed its freshness lifetime. A
>  cache may use a fresh response without validating it,  but "normally"
>  may not use a stale response without first validating it.
>  ("Normally" means "unless configured to provide better performance at
>  the expense of transparency.")
>  Therefore, what expires is the cache's authority to use a cached
>  response, without validation, in its reply to a subsequent request.
>
>semantically transparent
>  Ideally, an HTTP/1.1 cache would be "semantically transparent." That
>  is, use of the cache would not affect either the clients or the
>  servers in any way except to improve performance. When a client makes
>  a request via a semantically transparent cache, it receives exactly
>  the same entity headers and entity body it would have received if it
>  had made the same request to the origin server, at the same time.
>
>validator
>  An entity tag, or a Last-Modified time, which is used to find out
>  whether a cache entry is a semantically transparent copy of a
>  resource entity.  A cache entry is semantically transparent if its
>  validator exactly matches the validator that the server would provide
>  for current instance of that resource entity.
>
>5.4 Overall Operation
>The HTTP protocol is a request/response protocol. A client sends a
>request to the server in the form of a request method, URI, and
>protocol
>version, followed by a MIME-like message containing request modifiers,
>client information, and possible body content over a connection with a
>server. The server responds with a status line, including the message's
>protocol version and a success or error code, followed by a MIME-like
>message containing server information, entity metainformation, and
>possible entity body content.
>
>Most HTTP communication is initiated by a user agent and consists of a
>request to be applied to a resource on some origin server. In the
>simplest case, this may be accomplished via a single connection (v)
>between the user agent (UA) and the origin server (O).
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 11]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>          request chain ------------------------>
>       UA -------------------v------------------- O
>          <----------------------- response chain
>
>A more complicated situation occurs when one or more intermediaries are
>present in the request/response chain. There are three common forms of
>intermediary: proxy, gateway, and tunnel. A proxy is a forwarding
>agent,
>receiving requests for a URI in its absolute form, rewriting all or
>part
>of the message, and forwarding the reformatted request toward the
>server
>identified by the URI. A gateway is a receiving agent, acting as a
>layer
>above some other server(s) and, if necessary, translating the requests
>to the underlying server's protocol. A tunnel acts as a relay point
>between two connections without changing the messages; tunnels are used
>when the communication needs to pass through an intermediary (such as a
>firewall) even when the intermediary cannot understand the contents of
>the messages.
>
>          request chain -------------------------------------->
>       UA -----v----- A -----v----- B -----v----- C -----v----- O
>          <------------------------------------- response chain
>
>The figure above shows three intermediaries (A, B, and C) between the
>user agent and origin server. A request or response message that
>travels
>the whole chain MUST pass through four separate connections. This
>distinction is important because some HTTP communication options may
>apply only to the connection with the nearest, non-tunnel neighbor,
>only
>to the end-points of the chain, or to all connections along the chain.
>Although the diagram is linear, each participant may be engaged in
>multiple, simultaneous communications. For example, B may be receiving
>requests from many clients other than A, and/or forwarding requests to
>servers other than C, at the same time that it is handling A's request.
>
>Any party to the communication which is not acting as a tunnel may
>employ an internal cache for handling requests. The effect of a cache
>is
>that the request/response chain is shortened if one of the participants
>along the chain has a cached response applicable to that request. The
>following illustrates the resulting chain if B has a cached copy of an
>earlier response from O (via C) for a request which has not been cached
>by UA or A.
>
>          request chain ---------->
>       UA -----v----- A -----v----- B - - - - - - C - - - - - - O
>          <--------- response chain
>
>Not all responses are cachable, and some requests may contain modifiers
>which place special requirements on cache behavior. HTTP requirements
>for cache behavior and cachable responses are defined in section 16.
>
>HTTP communication usually takes place over TCP/IP connections. The
>default port is TCP 80 , but other ports can be used. This does not
>preclude HTTP from being implemented on top of any other protocol on
>the
>Internet, or on other networks. HTTP only presumes a reliable
>transport;
>any protocol that provides such guarantees can be used; the mapping of
>the HTTP/1.1 request and response structures onto the transport data
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 12]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>units of the protocol in question is outside the scope of this
>specification.
>
>However, HTTP/1.1 implementations SHOULD implement persistent
>connections (See section 17). Both clients and servers MUST be capable
>of handling cases where either party closes the connection prematurely,
>due to user action, automated time-out, or program failure. In any
>case,
>the closing of the connection by either or both parties always
>terminates the current request, regardless of its status.
>
>
>5.5 HTTP and MIME
>HTTP/1.1 uses many of the constructs defined for MIME, as defined in
>RFC
>1521 . Appendix 23.3 describes the ways in which the context of HTTP
>allows for different use of Internet Media Types than is typically
>found
>in Internet mail, and gives the rationale for those differences.
>
>
>6 Notational Conventions and Generic Grammar
>
>6.1 Augmented BNF
>All of the mechanisms specified in this document are described in both
>prose and an augmented Backus-Naur Form (BNF) similar to that used by
>RFC 822 . Implementers will need to be familiar with the notation in
>order to understand this specification. The augmented BNF includes the
>following constructs:
>
>
>name = definition
>     The name of a rule is simply the name itself (without any
>enclosing
>     "<" and ">") and is separated from its definition by the equal
>     character "=". Whitespace is only significant in that indentation
>     of continuation lines is used to indicate a rule definition that
>     spans more than one line. Certain basic rules are in uppercase,
>     such as SP, LWS, HT, CRLF, DIGIT, ALPHA, etc. Angle brackets are
>     used within definitions whenever their presence will facilitate
>     discerning the use of rule names.
>
>"literal"
>     Quotation marks surround literal text. Unless stated otherwise,
>the
>     text is case-insensitive.
>
>rule1 | rule2
>     Elements separated by a bar ("I") are alternatives, e.g., "yes |
>     no" will accept yes or no.
>
>(rule1 rule2)
>     Elements enclosed in parentheses are treated as a single element.
>     Thus, "(elem (foo | bar) elem)" allows the token sequences "elem
>     foo elem" and "elem bar elem".
>
>*rule
>     The character "*" preceding an element indicates repetition. The
>     full form is "<n>*<m>element" indicating at least <n> and at most
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 13]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>     <m> occurrences of element. Default values are 0 and infinity so
>     that "*(element)" allows any number, including zero; "1*element"
>     requires at least one; and "1*2element" allows one or two.
>
>[rule]
>     Square brackets enclose optional elements; "[foo bar]" is
>     equivalent to "*1(foo bar)".
>
>N rule
>     Specific repetition: "<n>(element)" is equivalent to
>     "<n>*<n>(element)"; that is, exactly <n> occurrences of (element).
>     Thus 2DIGIT is a 2-digit number, and 3ALPHA is a string of three
>     alphabetic characters.
>
>#rule
>     A construct "#" is defined, similar to "*", for defining lists of
>     elements. The full form is "<n>#<m>element " indicating at least
>     <n> and at most <m> elements, each separated by one or more commas
>     (",") and optional linear whitespace (LWS). This makes the usual
>     form of lists very easy; a rule such as "( *LWS element *( *LWS
>","
>     *LWS element )) "  can be shown as "1#element". Wherever this
>     construct is used, null elements are allowed, but do not
>contribute
>     to the count of elements present. That is, "(element), , (element)
>     " is permitted, but counts as only two elements. Therefore, where
>     at least one element is required, at least one non-null element
>     MUST be present. Default values are 0 and infinity so that
>     "#(element) " allows any number, including zero; "1#element"
>     requires at least one; and "1#2element" allows one or two.
>
>; comment
>     A semi-colon, set off some distance to the right of rule text,
>     starts a comment that continues to the end of line. This is a
>     simple way of including useful notes in parallel with the
>     specifications.
>
>implied *LWS
>     The grammar described by this specification is word-based. Except
>     where noted otherwise, linear whitespace (LWS) can be included
>     between any two adjacent words (token or quoted-string), and
>     between adjacent tokens and delimiters (tspecials), without
>     changing the interpretation of a field. At least one delimiter
>     (tspecials) MUST exist between any two tokens, since they would
>     otherwise be interpreted as a single token. However, applications
>     SHOULD attempt to follow "common form" when generating HTTP
>     constructs, since there exist some implementations that fail to
>     accept anything beyond the common forms.
>
>6.2 Basic Rules
>The following rules are used throughout this specification to describe
>basic parsing constructs. The US-ASCII coded character set is defined
>by
>.
>
>       OCTET          = <any 8-bit sequence of data>
>       CHAR           = <any US-ASCII character (octets 0 - 127)>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 14]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       UPALPHA        = <any US-ASCII uppercase letter "A".."Z">
>       LOALPHA        = <any US-ASCII lowercase letter "a".."z">
>       ALPHA          = UPALPHA | LOALPHA
>       DIGIT          = <any US-ASCII digit "0".."9">
>       CTL            = <any US-ASCII control character
>                        (octets 0 - 31) and DEL (127)>
>       CR             = <US-ASCII CR, carriage return (13)>
>       LF             = <US-ASCII LF, linefeed (10)>
>       SP             = <US-ASCII SP, space (32)>
>       HT             = <US-ASCII HT, horizontal-tab (9)>
>       <">            = <US-ASCII double-quote mark (34)>
>
>HTTP/1.1 defines the octet sequence CR LF as the end-of-line marker for
>all protocol elements except the Entity-Body (see appendix 23.2 for
>tolerant applications). The end-of-line marker within an Entity-Body is
>defined by its associated media type, as described in section 7.7.
>
>       CRLF           = CR LF
>
>HTTP/1.1 headers can be folded onto multiple lines if the continuation
>line begins with a space or horizontal tab. All linear whitespace,
>including folding, has the same semantics as SP.
>
>       LWS            = [CRLF] 1*( SP | HT )
>
>The TEXT rule is only used for descriptive field contents and values
>that are not intended to be interpreted by the message parser. Words of
>*TEXT MAY contain octets from character sets other than US-ASCII only
>when encoded according to the rules of RFC 1522 .
>
>       TEXT           = <any OCTET except CTLs,
>                        but including LWS>
>
>Recipients of header field TEXT containing octets outside the US-ASCII
>character set range MAY assume that they represent ISO-8859-1
>characters
>if there is no other encoding indicated by an RFC 1522 mechanism.
>
>Hexadecimal numeric characters are used in several protocol elements.
>
>       HEX            = "A" | "B" | "C" | "D" | "E" | "F"
>                      | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT
>
>Many HTTP/1.1 header field values consist of words separated by LWS or
>special characters. These special characters MUST be in a quoted string
>to be used within a parameter value.
>
>       word           = token | quoted-string
>
>       token          = 1*<any CHAR except CTLs or tspecials>
>
>       tspecials      = "(" | ")" | "<" | ">" | "@"
>                      | "," | ";" | ":" | "\" | <">
>                      | "/" | "[" | "]" | "?" | "="
>                      | "{" | "}" | SP | HT
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 15]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>Comments can be included in some HTTP header fields by surrounding the
>comment text with parentheses. Comments are only allowed in fields
>containing "comment" as part of their field value definition. In all
>other fields, parentheses are considered part of the field value.
>
>       comment        = "(" *( ctext | comment ) ")"
>       ctext          = <any TEXT excluding "(" and ")">
>
>A string of text is parsed as a single word if it is quoted using
>double-quote marks.
>
>       quoted-string  = ( <"> *(qdtext) <"> )
>
>
>       qdtext         = <any CHAR except <"> and CTLs,
>                        but including LWS>
>
>The backslash character ("\") may be used as a single-character quoting
>mechanism only within quoted-string and comment constructs.
>
>       quoted-pair    = "\" CHAR
>
>
>7 Protocol Parameters
>
>7.1 HTTP Version
>HTTP uses a "<major>.<minor>" numbering scheme to indicate versions of
>the protocol. The protocol versioning policy is intended to allow the
>sender to indicate the format of a message and its capacity for
>understanding further HTTP communication, rather than the features
>obtained via that communication. No change is made to the version
>number
>for the addition of message components which do not affect
>communication
>behavior or which only add to extensible field values. The <minor>
>number is incremented when the changes made to the protocol add
>features
>which do not change the general message parsing algorithm, but which
>may
>add to the message semantics and imply additional capabilities of the
>sender. The <major> number is incremented when the format of a message
>within the protocol is changed.
>
>The version of an HTTP message is indicated by an HTTP-Version field in
>the first line of the message. If the protocol version is not
>specified,
>the recipient MUST assume that the message is in the simple HTTP/0.9
>format .
>
>       HTTP-Version   = "HTTP" "/" 1*DIGIT "." 1*DIGIT
>
>Note that the major and minor numbers SHOULD be treated as separate
>integers and that each MAY be incremented higher than a single digit.
>Thus, HTTP/2.4 is a lower version than HTTP/2.13, which in turn is
>lower
>than HTTP/12.3. Leading zeros SHOULD be ignored by recipients and never
>generated by senders.
>
>Applications sending Full-Request or Full-Response messages, as defined
>by this specification, MUST include an HTTP-Version of "HTTP/1.1". Use
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 16]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>of this version number indicates that the sending application is at
>least conditionally compliant with this specification.
>
>Proxy and gateway applications MUST be careful in forwarding requests
>that are received in a format different from that of the application's
>native HTTP version. Since the protocol version indicates the protocol
>capability of the sender, a proxy/gateway MUST never send a message
>with
>a version indicator which is greater than its native version; if a
>higher version request is received, the proxy/gateway MUST either
>downgrade the request version, respond with an error, or switch to
>tunnel behavior. Requests with a version lower than that of the
>application's native format MAY be upgraded before being forwarded; the
>proxy/gateway's response to that request MUST follow the server
>requirements listed above.
>
>  Note: Converting between versions of HTTP may involve addition or
>  deletion of headers required or forbidden by the version involved.
>  It is likely more involved than just changing the version
>  indicator.
>
>
>7.2 Uniform Resource Identifiers
>URIs have been known by many names: WWW addresses, Universal Document
>Identifiers, Universal Resource Identifiers , and finally the
>combination of Uniform Resource Locators (URL)  and Names (URN) . As
>far
>as HTTP is concerned, Uniform Resource Identifiers are simply formatted
>strings which identify--via name, location, or any other
>characteristic-
>-a network resource.
>
>
>7.2.1 General Syntax
>URIs in HTTP can be represented in absolute form or relative to some
>known base URI , depending upon the context of their use. The two forms
>are differentiated by the fact that absolute URIs always begin with a
>scheme name followed by a colon.
>
>       URI            = ( absoluteURI | relativeURI ) [ "#" fragment ]
>
>       absoluteURI    = scheme ":" *( uchar | reserved )
>
>       relativeURI    = net_path | abs_path | rel_path
>
>       net_path       = "//" net_loc [ abs_path ]       abs_path      
>= "/" rel_path
>       rel_path       = [ path ] [ ";" params ] [ "?" query ]
>
>       path           = fsegment *( "/" segment )
>       fsegment       = 1*pchar
>       segment        = *pchar
>
>       params         = param *( ";" param )
>       param          = *( pchar | "/" )
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 17]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       scheme         = 1*( ALPHA | DIGIT | "+" | "-" | "." )
>       net_loc        = *( pchar | ";" | "?" )
>       query          = *( uchar | reserved )
>       fragment       = *( uchar | reserved )
>
>       pchar          = uchar | ":" | "@" | "&" | "=" | "+"
>       uchar          = unreserved | escape
>       unreserved     = ALPHA | DIGIT | safe | extra | national
>
>       escape         = "%" HEX HEX
>       reserved       = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+"
>       extra          = "!" | "*" | "'" | "(" | ")" | ","
>       safe           = "$" | "-" | "_" | "."
>       unsafe         = CTL | SP | <"> | "#" | "%" | "<" | ">"
>       national       = <any OCTET excluding ALPHA, DIGIT,
>                        reserved, extra, safe, and unsafe>
>
>For definitive information on URL syntax and semantics, see RFC 1738
>and RFC 1808 . The BNF above includes national characters not allowed
>in
>valid URLs as specified by RFC 1738, since HTTP servers are not
>restricted in the set of unreserved characters allowed to represent the
>rel_path part of addresses, and HTTP proxies may receive requests for
>URIs not defined by RFC 1738.
>
>The HTTP protocol does not place any a priori limit on the length of a
>URI.   Servers MUST be able to handle the URI of any resource they
>serve,  and SHOULD be able to handle URIs of unbounded length if they
>provide GET-based forms that could generate such URIs. A server SHOULD
>return a status code of
>
>      414 Request-URI Too Large
>
> if a URI is longer than the server can handle.  See section 12.4.1.15.
>
>  Note: Servers should be cautious about depending on URI lengths
>  above 255 bytes, because some older client or proxy implementations
>  may not properly support these.
>
> All client and proxy implementations MUST be able to handle a URI of
>any finite length.
>
>
>7.2.2 http URL
>The "http" scheme is used to locate network resources via the HTTP
>protocol. This section defines the scheme-specific syntax and semantics
>for http URLs.
>
>       http_URL       = "http:" "//" host [ ":" port ] [ abs_path ]
>
>       host           = <A legal Internet host domain name
>                         or IP address (in dotted-decimal form),
>                         as defined by Section 2.1 of RFC 1123>
>
>       port           = *DIGIT
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 18]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>If the port is empty or not given, port 80 is assumed. The semantics
>are
>that the identified resource is located at the server listening for TCP
>connections on that port of that host, and the Request-URI for the
>resource is abs_path.  The use of IP addresses in URL's SHOULD be
>avoided whenever possible.  See RFC 1900.  If the abs_path is not
>present in the URL, it MUST be given as "/" when used as a Request-URI
>for a resource (section 9.1.2).
>
>  Note: Although the HTTP protocol is independent of the transport
>  layer protocol, the http URL only identifies resources by their TCP
>  location, and thus non-TCP resources MUST be identified by some
>  other URI scheme.
>
>The canonical form for "http" URLs is obtained by converting any
>UPALPHA
>characters in host to their LOALPHA equivalent (hostnames are case-
>insensitive), eliding the [ ":" port ] if the port is 80, and replacing
>an empty abs_path with "/".
>
>
>7.2.3 URI Canonicalization
>A cache, when comparing two URIs to decide if they match or not, a
>cache
>MUST use a case-sensitive octet-by-octet comparison of the entire URIs,
>with these exceptions:
>
>Following the rules from section 7.2.2:
>
>  .  A port that is empty or not given is equivalent to port 80.
>  .  Comparisons of host names MUST be case-insensitive.
>  .  Comparisons of scheme names MUST be case-insensitive.
>  .  An empty abs_path is equivalent to an abs_path of "/"
>Characters except those in the reserved set and the unsafe set (see
>section 7.2) are equivalent to their ""%" HEX HEX" encodings.
>
>For example, the following three URIs are equivalent:
>
>      http://abc.com:80/~smith/home.html
>      http://ABC.com/%7Esmith/home.html
>      http://ABC.com:/%7esmith/home.html
>
>
>
>
>7.3 Date/Time Formats
>
>7.3.1 Full Date
>HTTP applications have historically allowed three different formats for
>the representation of date/time stamps:
>
>       Sun, 06 Nov 1994 08:49:37 GMT   ; RFC 822, updated by RFC 1123
>       Sunday, 06-Nov-94 08:49:37 GMT  ; RFC 850, obsoleted by RFC 1036
>       Sun Nov  6 08:49:37 1994        ; ANSI C's asctime() format
>
>The first format is preferred as an Internet standard and represents a
>fixed-length subset of that defined by RFC 1123  (an update to RFC 822
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 19]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>). The second format is in common use, but is based on the obsolete RFC
>850  date format and lacks a four-digit year. HTTP/1.1 clients and
>servers that parse the date value MUST accept all three formats, though
>they MUST generate only the RFC 1123 format for representing date/time
>stamps in HTTP message fields.
>
>  Note: Recipients of date values are encouraged to be robust in
>  accepting date values that may have been generated by non-HTTP
>  applications, as is sometimes the case when retrieving or posting
>  messages via proxies/gateways to SMTP or NNTP.
>
>All HTTP date/time stamps MUST be represented in Universal Time (UT),
>also known as Greenwich Mean Time (GMT), without exception. This is
>indicated in the first two formats by the inclusion of "GMT" as the
>three-letter abbreviation for time zone, and SHOULD be assumed when
>reading the asctime format.
>
>       HTTP-date      = rfc1123-date | rfc850-date | asctime-date
>
>       rfc1123-date   = wkday "," SP date1 SP time SP "GMT"
>       rfc850-date    = weekday "," SP date2 SP time SP "GMT"
>       asctime-date   = wkday SP date3 SP time SP 4DIGIT
>
>       date1          = 2DIGIT SP month SP 4DIGIT
>                        ; day month year (e.g., 02 Jun 1982)
>       date2          = 2DIGIT "-" month "-" 2DIGIT
>                        ; day-month-year (e.g., 02-Jun-82)
>       date3          = month SP ( 2DIGIT | ( SP 1DIGIT ))
>                        ; month day (e.g., Jun  2)
>
>       time           = 2DIGIT ":" 2DIGIT ":" 2DIGIT
>                        ; 00:00:00 - 23:59:59
>
>       wkday          = "Mon" | "Tue" | "Wed"
>                      | "Thu" | "Fri" | "Sat" | "Sun"
>
>       weekday        = "Monday" | "Tuesday" | "Wednesday"
>                      | "Thursday" | "Friday" | "Saturday" | "Sunday"
>
>       month          = "Jan" | "Feb" | "Mar" | "Apr"
>                      | "May" | "Jun" | "Jul" | "Aug"
>                      | "Sep" | "Oct" | "Nov" | "Dec"
>
>  Note: HTTP requirements for the date/time stamp format apply only
>  to their usage within the protocol stream. Clients and servers are
>  not required to use these formats for user presentation, request
>  logging, etc.
>
>Additional rules for requirements on parsing and representation of
>dates
>and other potential problems with date representations include:
>
>  .  HTTP/1.1 clients and caches should assume that an RFC-850 date
>     which appears to be more than 50 years in the future is in fact in
>     the past (this helps solve the "year 2000" problem).
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 20]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  .  An HTTP/1.1 implementation may internally represent a parsed
>     Expires date as earlier than the proper value, but MUST NOT
>     internally represent a parsed Expires date as later than the
>proper
>     value.
>  .  All expiration-related calculations must be done in Universal Time
>     (GMT).  The local time zone MUST NOT influence the calculation or
>     comparison of an age or expiration time.
>  .  If an HTTP header incorrectly carries a date value with a time
>zone
>     other than GMT, it must be converted into GMT using the most
>     conservative possible conversion.
>
>
>
>
>7.3.2 Delta Seconds
>Some HTTP header fields allow a time value to be specified as an
>integer
>number of seconds, represented in decimal, after the time that the
>message was received. This format SHOULD only be used to represent
>short
>time periods or periods that cannot start until receipt of the message.
>
>       delta-seconds  = 1*DIGIT
>
>
>7.4 Character Sets
>HTTP uses the same definition of the term "character set" as that
>described for MIME:
>
>  The term "character set" is used in this document to refer to a
>  method used with one or more tables to convert a sequence of octets
>  into a sequence of characters. Note that unconditional conversion
>  in the other direction is not required, in that not all characters
>  may be available in a given character set and a character set may
>  provide more than one sequence of octets to represent a particular
>  character. This definition is intended to allow various kinds of
>  character encodings, from simple single-table mappings such as US-
>  ASCII to complex table switching methods such as those that use ISO
>  2022's techniques. However, the definition associated with a MIME
>  character set name MUST fully specify the mapping to be performed
>  from octets to characters. In particular, use of external profiling
>  information to determine the exact mapping is not permitted.
>
>  Note: This use of the term "character set" is more commonly
>  referred to as a "character encoding." However, since HTTP and MIME
>  share the same registry, it is important that the terminology also
>  be shared.
>
>HTTP character sets are identified by case-insensitive tokens. The
>complete set of tokens is defined by the IANA Character Set registry .
>However, because that registry does not define a single, consistent
>token for each character set, we define here the preferred names for
>those character sets most likely to be used with HTTP entities. These
>character sets include those registered by RFC 1521  -- the US-ASCII
>and ISO-8859  character sets -- and other names specifically
>recommended
>for use within MIME charset parameters.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 21]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       charset = "US-ASCII"
>               | "ISO-8859-1" | "ISO-8859-2" | "ISO-8859-3"
>               | "ISO-8859-4" | "ISO-8859-5" | "ISO-8859-6"
>               | "ISO-8859-7" | "ISO-8859-8" | "ISO-8859-9"
>               | "ISO-2022-JP" | "ISO-2022-JP-2" | "ISO-2022-KR"
>               | "UNICODE-1-1" | "UNICODE-1-1-UTF-7"
>               | "UNICODE-1-1-UTF-8" | token
>
>Although HTTP allows an arbitrary token to be used as a charset value,
>any token that has a predefined value within the IANA Character Set
>registry  MUST represent the character set defined by that registry.
>Applications SHOULD limit their use of character sets to those defined
>by the IANA registry.
>
>The character set of an entity body SHOULD be labeled as the lowest
>common denominator of the character codes used within that body, with
>the exception that no label is preferred over the labels US-ASCII or
>ISO-8859-1.
>
>
>7.5 Content Codings
>Content coding values indicate an encoding transformation that has been
>or can be applied to a resource entity. Content codings are primarily
>used to allow a document to be compressed or encrypted without losing
>the identity of its underlying media type. Typically, the resource
>entity is stored in this encoding and only decoded before rendering or
>analogous usage.
>
>       content-coding   = "gzip" | "x-gzip"
>                        | "compress" | "x-compress" | token
>
>  Note: For historical reasons, HTTP applications SHOULD consider "x-
>  gzip" and "x-compress" to be equivalent to "gzip" and "compress",
>  respectively.
>
>All content-coding values are case-insensitive. HTTP/1.1 uses content-
>coding values in the Accept-Encoding (section 18.3) and
>Content-Encoding
>(section 18.13) header fields. Although the value describes the
>content-
>coding, what is more important is that it indicates what decoding
>mechanism will be required to remove the encoding. Note that a single
>program MAY be capable of decoding multiple content-coding formats. Two
>values are defined by this specification:
>
>
>gzip
>     An encoding format produced by the file compression program "gzip"
>     (GNU zip) developed by Jean-loup Gailly. This format is typically
>a
>     Lempel-Ziv coding (LZ77) with a 32 bit CRC.
>
>compress
>     The encoding format produced by the file compression program
>     "compress". This format is an adaptive Lempel-Ziv-Welch coding
>     (LZW).
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 22]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  Note: Use of program names for the identification of encoding
>  formats is not desirable and should be discouraged for future
>  encodings. Their use here is representative of historical practice,
>  not good design.
>
>HTTP defines a registration process which uses the Internet Assigned
>Numbers Authority (IANA) as a central registry for content-coding value
>tokens.  Additional content-coding value tokens beyond the four defined
>in this document (gzip x-gzip compress x-compress)  SHOULD be
>registered
>with the IANA. To allow interoperability between clients and servers,
>specifications of the content coding algorithms used to implement a new
>value SHOULD be publicly available and adequate for independent
>implementation, and MUST conform to the purpose of content coding
>defined in this section.
>
>
>7.6 Transfer Codings
>Transfer coding values are used to indicate an encoding transformation
>that has been, can be, or may need to be applied to an Entity-Body in
>order to ensure safe transport through the network. This differs from a
>content coding in that the transfer coding is a property of the
>message,
>not of the original resource entity.
>
>       transfer-coding         = "chunked" | transfer-extension
>
>       transfer-extension      = token
>
>All transfer-coding values are case-insensitive. HTTP/1.1 uses transfer
>coding values in the Transfer-Encoding header field (section 18.43).
>
>Transfer codings are analogous to the Content-Transfer-Encoding values
>of MIME , which were designed to enable safe transport of binary data
>over a 7-bit transport service. However, "safe transport" has a
>different focus for an 8bit-clean transfer protocol. In HTTP, the only
>unsafe characteristic of message bodies is the difficulty in
>determining
>the exact body length (section 11.2.2), or the desire to encrypt data
>over a shared transport.
>
>All HTTP/1.1 applications MUST be able to receive and decode the
>"chunked" transfer coding , and MUST ignore transfer coding extensions
>they do not understand. A server which receives a an entity-body with a
>transfer-coding it does not understand SHOULD return
>501(Unimplemented),
>and close the connection. A server MUST NOT send transfer-codings to a
>client that were not defined in the version of HTTP used in the
>client's
>request. Clients sending entity-bodies with transfer-codings SHOULD
>must
>be prepared for the connection to be closed if the server doesn't
>understand the transfer-coding.  The chunked encoding modifies the body
>of a message in order to transfer it as a series of chunks, each with
>its own size indicator, followed by an optional footer containing
>entity-header fields. This allows dynamically-produced content to be
>transferred along with the information necessary for the recipient to
>verify that it has received the full message.
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 23]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       Chunked-Body   = *chunk
>                        "0" CRLF
>                        footer
>                        CRLF
>
>       chunk          = chunk-size [ chunk-ext ] CRLF
>                        chunk-data CRLF
>
>       chunk-size     = hex-no-zero *HEX
>       chunk-ext      = *( ";" chunk-ext-name [ "=" chunk-ext-value ] )
>       chunk-ext-name = token
>       chunk-ext-val  = token | quoted-string
>       chunk-data     = chunk-size(OCTET)
>
>       footer         = *<<Content-MD5 and future headers that specify
>                         they are allowed in footer>>
>
>       hex-no-zero    = <HEX excluding "0">
>
>Note that the chunks are ended by a zero-sized chunk, followed by the
>footer and terminated by an empty line. An example process for decoding
>a Chunked-Body is presented in appendix 23.3.6.
>
>
>7.7 Media Types
>HTTP uses Internet Media Types  in the Content-Type (section 18.19) and
>Accept (section 18.1) header fields in order to provide open and
>extensible data typing and type negotiation.
>
>       media-type     = type "/" subtype *( ";" parameter )
>       type           = token
>       subtype        = token
>
>Parameters may follow the type/subtype in the form of attribute/value
>pairs.
>
>       parameter      = attribute "=" value
>       attribute      = token
>       value          = token | quoted-string
>
>The type, subtype, and parameter attribute names are case-insensitive.
>Parameter values may or may not be case-sensitive, depending on the
>semantics of the parameter name. LWS MUST NOT be generated between the
>type and subtype, nor between an attribute and its value. Upon receipt
>of a media type with an unrecognized parameter, a user agent SHOULD
>treat the media type as if the unrecognized parameter and its value
>were
>not present.
>
>Some older HTTP applications do not recognize media type parameters.
>HTTP/1.1 applications SHOULD only use media type parameters when they
>are necessary to define the content of a message.
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 24]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>Media-type values are registered with the Internet Assigned Number
>Authority (IANA ). The media type registration process is outlined in
>RFC 1590 . Use of non-registered media types is discouraged.
>
>
>7.7.1 Canonicalization and Text Defaults
>Internet media types are registered with a canonical form. In general,
>an Entity-Body transferred via HTTP MUST be represented in the
>appropriate canonical form prior to its transmission; the exception is
>"text" types, as defined in the next paragraph..
>
>when in canonical form , media subtypes of the "text" type use CRLF as
>the text line break. However, HTTP allows the transport of text media
>with plain CR or LF alone representing a line break when if it is done
>consistently for an entire Entity-Body.. HTTP applications MUST accept
>CRLF, bare CR, and bare LF as being representative of a line break in
>text media received via HTTP.In addition, if the text media is
>represented in a character set that does not use octets 13 and 10 for
>CR
>and LF respectively, as is the case for some multi-byte character sets,
>HTTP allows the use of whatever octet sequences are defined by that
>character set to represent the equivalent of CR and LF for line breaks.
>This flexibility regarding line breaks applies only to text media in
>the
>Entity-Body; a bare CR or LF MUST NOT be substituted for CRLF within
>any
>of the HTTP control structures (such as header fields and multipart
>boundaries).
>
>If an Entity-Body is encoded with a Content-Encoding, the underlying
>data MUST be in a form defined above prior to being encoded.
>
>The "charset" parameter is used with some media types to define the
>character set (section 7.4) of the data. When no explicit charset
>parameter is provided by the sender, media subtypes of the "text" type
>are defined to have a default charset value of "ISO-8859-1" when
>received via HTTP. Data in character sets other than "ISO-8859-1" or
>its
>subsets MUST be labeled with an appropriate charset value in order to
>be
>consistently interpreted by the recipient.
>
>  Note: Many current HTTP servers provide data using charsets other
>  than "ISO-8859-1" without proper labeling. This situation reduces
>  interoperability and is not recommended. To compensate for this,
>  some HTTP user agents provide a configuration option to allow the
>  user to change the default interpretation of the media type
>  character set when no charset parameter is given.
>
>
>
>
>7.7.2 Multipart Types
>MIME provides for a number of "multipart" types -- encapsulations of
>one
>or more entities within a single message's Entity-Body. All multipart
>types share a common syntax, as defined in section 7.2.1 of RFC 1521 ,
>and MUST include a boundary parameter as part of the media type value.
>The message body is itself a protocol element and MUST therefore use
>only CRLF to represent line breaks between body-parts. Unlike in RFC
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 25]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>1521, the epilogue of any multipart message MUST be empty; HTTP
>applications MUST NOT transmit the epilogue even if the original
>resource entity contains an epilogue.
>
>In HTTP, multipart body-parts MAY contain header fields which are
>significant to the meaning of that part.
>
>In general, an HTTP user agent SHOULD follow the same or similar
>behavior as a MIME user agent would upon receipt of a multipart type.
>If
>an application receives an unrecognized multipart subtype, the
>application MUST treat it as being equivalent to "multipart/mixed".
>
>  Note: The "multipart/form-data" type has been specifically defined
>  for carrying form data suitable for processing via the POST request
>  method, as described in RFC 1867 .
>
>
>
>
>7.8 Product Tokens
>Product tokens are used to allow communicating applications to identify
>themselves via a simple product token, with an optional slash and
>version designator. Most fields using product tokens also allow sub-
>products which form a significant part of the application to be listed,
>separated by whitespace. By convention, the products are listed in
>order
>of their significance for identifying the application.
>
>       product         = token ["/" product-version]
>       product-version = token
>
>Examples:
>
>       User-Agent: CERN-LineMode/2.15 libwww/2.17b3
>       Server: Apache/0.8.4
>
>Product tokens should be short and to the point -- use of them for
>advertising or other non-essential information is explicitly forbidden.
>Although any token character may appear in a product-version, this
>token
>SHOULD only be used for a version identifier (i.e., successive versions
>of the same product SHOULD only differ in the product-version portion
>of
>the product value).
>
>
>7.9 Quality Values
>HTTP content negotiation (section 15) uses short "floating point"
>numbers to indicate the relative importance ("weight") of various
>negotiable parameters. The weights are normalized to a real number in
>the range 0 through 1, where 0 is the minimum and 1 the maximum value.
>In order to discourage misuse of this feature, HTTP/1.1 applications
>MUST NOT generate more than three digits after the decimal point. User
>configuration of these values SHOULD also be limited in this fashion.
>
>       qvalue         = ( "0" [ "." 0*3DIGIT ] )
>                      | ( "1" [ "." 0*3("0") ] )
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 26]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>"Quality values" is a slight misnomer, since these values actually
>measure relative degradation in perceived quality. Thus, a value of
>"0.8" represents a 20% degradation from the optimum rather than a
>statement of 80% quality.
>
>
>7.10 Language Tags
>A language tag identifies a natural language spoken, written, or
>otherwise conveyed by human beings for communication of information to
>other human beings. Computer languages are explicitly excluded. HTTP
>uses language tags within the Accept-Language, and Content-Language
>fields.
>
>The syntax and registry of HTTP language tags is the same as that
>defined by RFC 1766 . In summary, a language tag is composed of 1 or
>more parts: A primary language tag and a possibly empty series of
>subtags:
>
>        language-tag  = primary-tag *( "-" subtag )
>
>        primary-tag   = 1*8ALPHA
>        subtag        = 1*8ALPHA
>
>Whitespace is not allowed within the tag and all tags are case-
>insensitive. The name space of language tags is administered by the
>IANA. Example tags include:
>
>       en, en-US, en-cockney, i-cherokee, x-pig-latin
>
>where any two-letter primary-tag is an ISO 639 language abbreviation
>and
>any two-letter initial subtag is an ISO 3166 country code.  (The last
>three tags above are not registered tags; all but the last are examples
>of tags which could be registered in future.)
>
>
>7.11 Entity Tags
>Entity tags are quoted strings whose internal structure is not visible
>to clients or caches. Entity tags are used as cache validators in
>HTTP/1.1.
>
>      entity-tag = strong-entity-tag | weak-entity-tag
>                              | null-entity-tag
>      strong-entity-tag = quoted-string
>      weak-entity-tag = quoted-string "/W"
>      null-entity-tag = <"> <">
>
>  Note that the "/W" tag is considered part of a weak entity tag; it
>  MUST NOT be removed by any cache or client.
>
>There are two comparison functions on  validators:
>
>  .  The strong comparison function: in order to be considered equal,
>     both validators must be identical in every way, and neither may be
>     weak.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 27]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  .  The weak comparison function: in order to be considered equal,
>both
>     validators must be identical in every way, except for the presence
>     or absence of a "weak" tag.
>The weak comparison function MAY be used for simple (non-subrange) GET
>requests. The strong comparison function MUST be used in all other
>cases.
>
>The null validator is a special value, defined as never matching the
>current validator of an existing resource entity, and always matching
>the "current" validator of a resource entity  that does not exist.
>
>
>7.12 Variant IDs
>A cache stores instances of resource entities, not instances of generic
>resources per se. Therefore, the URI of a generic resource is not
>sufficient for use as an identifier for a specific resource entity. In
>certain interactions between a cache and an origin server, it is
>convenient to encode that identifier using a more   compact
>representation than the full set of selecting request headers (which
>may
>not even be possible if the selection criteria are not known to the
>cache).
>
>For these reasons, the HTTP protocol provides an optional mechanism for
>identifying a specific entity source of a generic resource,  called a
>variant-ID.
>
>Variant-IDs are used to identify specific variants of a generic
>resource; see section 16.5.3 for how they are used.
>
>      variant-id = quoted-string
>
>Variant-IDs are compared using string octet-equality; case is
>significant.
>
>All responses from generic resources SHOULD include variant-IDs.  If
>these are not present, the resource author can expect caches to
>correctly handle requests on the generic resource, but cannot expect
>the
>caching to be efficient.
>
>
>
>
>7.13 Variant Sets
>Validator sets are used for doing conditional retrievals on generic
>resources; see section 16.5.3.
>
>      variant-set = 1#variant-set-item
>      variant-set-item = opaque-validator ";" variant-id
>
>
>7.14 Range Protocol Parameters
>This section defines certain HTTP protocol parameters used in range
>requests and related responses.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 28]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>7.14.1 Range Units
>A resource entity may be broken down into subranges according to
>various
>structural units.
>
>      range-unit       = bytes-unit | other-range-unit
>
>      bytes-unit       = "bytes"
>      other-range-unit = token
>
>The only range unit defined by HTTP/1.1 is "bytes".  HTTP/1.1
>implementations may ignore ranges specified using other units.
>
>
>7.14.2 Byte Ranges
>Since all HTTP entities are represented in HTTP messages as sequences
>of
>bytes, the concept of a byte range is meaningful for any HTTP entity.
>(However, not all clients and servers need to support byte-range
>operations.)
>
>Byte range specifications in HTTP apply to the sequence of bytes that
>would be transferred by the protocol if no transfer-coding were being
>applied.
>
>  This means that if Content-coding is applied to the data, the byte
>  range specification applies to the resulting content-encoded byte
>  stream, not to the unencoded byte stream.  It also means that if
>  the entity-body's media-type is a composite type (e.g., multipart/*
>  and message/rfc822), then the composite's body-parts may have their
>  own content-encoding and content-transfer-encoding, and the byte
>  range applies to the result of the those encodings.
>
>A byte range operation may specify a single range of bytes, or a set of
>ranges within a single entity.
>
>       ranges-specifier = byte-ranges-specifier
>
>       byte-ranges-specifier = bytes-unit "=" byte-range-set
>
>       byte-range-set = 1#( byte-range-spec | suffix-byte-range-spec )
>
>       byte-range-spec = first-byte-pos "-" [last-byte-pos]
>
>       first-byte-pos = 1*DIGIT
>
>       last-byte-pos = 1*DIGIT
>
>The first-byte-pos value in a byte-range-spec gives the byte-offset of
>the first byte in a range.  The last-byte-pos value gives the byte-
>offset of the last byte in the range; that is, the byte positions
>specified are inclusive.  Byte offsets start at zero.
>
>If the last-byte-pos value is present, it must be greater than or equal
>to the first-byte-pos in that byte-range-spec, or the byte-range-spec
>is
>invalid.  The recipient of an invalid byte-range-spec must ignore it.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 29]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>If the last-byte-pos value is absent, it is assumed to be equal to the
>current length of the entity in bytes.
>
>If the last-byte-pos value is larger than the current length of the
>entity, it is assumed to be equal to the current length of the entity.
>
>       suffix-byte-range-spec = "-" suffix-length
>
>       suffix-length = 1*DIGIT
>
>A suffix-byte-range-spec is used to specify the suffix of the entity,
>of
>a length given by the suffix-length value.  (That is, this form
>specifies the last N bytes of an entity.)  If the entity is shorter
>than
>the specified suffix-length, the entire entity is used.
>
>Examples of byte-ranges-specifier values (assuming an entity of length
>10000):
>
>  .  The first 500 bytes (byte offsets 0-499, inclusive):
>       bytes=0-499
>
>  .  The second 500 bytes (byte offsets 500-999, inclusive):
>       bytes=500-999
>
>  .  The final 500 bytes (byte offsets 9500-9999, inclusive):
>       bytes=-500
>
>  .  Or
>       bytes=9500-
>
>  .  The first and last bytes only (bytes 0 and 9999):
>       bytes=0-0,-1
>
>  .  Several legal but not canonical specifications of the second 500
>     bytes (byte offsets 500-999, inclusive):
>       bytes=500-600,601-999
>
>       bytes=500-700,601-999
>
>
>7.14.3 Content Ranges
>When a server returns a partial response to a client, it must describe
>both the extent of the range covered by the response, and the length of
>the entire entity.
>
>       content-range-spec      = byte-content-range-spec
>
>       byte-content-range-spec = bytes-unit SP first-byte-pos "-"
>                                      last-byte-pos "/" entity-length
>
>       entity-length            = 1*DIGIT
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 30]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>Unlike byte-ranges-specifier values, a byte-content-range-spec may only
>specify one range, and must contain absolute byte positions for both
>the
>first and last byte of the range.
>
>A byte-content-range-spec whose last-byte-pos value is less than its
>first-byte-pos value, or whose entity-length value is less than or
>equal
>to its last-byte-pos value, is invalid.  The recipient of an invalid
>byte-content-range-spec MUST ignore it and any content transferred
>along
>with it.
>
>Examples of byte-content-range-spec values, assuming that the entity
>contains a total of 1234 bytes:
>
>  .  The first 500 bytes:
>       bytes 0-499/1234
>
>  .  The second 500 bytes:
>       bytes 500-999/1234
>
>  .  All except for the first 500 bytes:
>       bytes 500-1233/1234
>
>  .  The last 500 bytes:
>       bytes 734-1233/1234
>
>
>8 HTTP Message
>
>8.1 Message Types
>HTTP messages consist of requests from client to server and responses
>from server to client.
>
>       HTTP-message   = Full-Request              ; HTTP/1.1 messages
>                      | Full-Response
>
>Full-Request and Full-Response use the generic message format of RFC
>822
>for transferring entities. Both messages may include optional header
>fields (also known as "headers") and an entity body. The entity body is
>separated from the headers by a null line (i.e., a line with nothing
>preceding the CRLF).
>
>
>8.2 Message Headers
>HTTP header fields, which include General-Header (Section 8.3),
>Request-
>Header (Section 9.2), Response-Header (Section 10.2), and Entity-Header
>(Section 11.1) fields, follow the same generic format as that given in
>Section 3.1 of RFC 822 . Each header field consists of a name followed
>by a colon (":") and the field value. Field names are case-insensitive.
>The field value may be preceded by any amount of LWS, though a single
>SP
>is preferred. Header fields can be extended over multiple lines by
>preceding each extra line with at least one SP or HT.
>
>       HTTP-header    = field-name ":" [ field-value ] CRLF
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 31]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       field-name     = token
>       field-value    = *( field-content | LWS )
>
>       field-content  = <the OCTETs making up the field-value
>                        and consisting of either *TEXT or combinations
>                        of token, tspecials, and quoted-string>
>
>The order in which header fields with differing field names are
>received
>is not significant. However, it is "good practice" to send General-
>Header fields first, followed by Request-Header or Response-Header
>fields, and ending with the Entity-Header fields.
>
>Multiple HTTP-header fields with the same field-name may be present in
>a
>message if and only if the entire field-value for that header field is
>defined as a comma-separated list [i.e., #(values)]. It MUST be
>possible
>to combine the multiple header fields into one "field-name:
>field-value"
>pair, without changing the semantics of the message, by appending each
>subsequent field-value to the first, each separated by a comma.  Thus,
>the order in which multiple header fields with the same field-name are
>received may be significant to the interpretation of the combined
>field-
>value.
>
>
>8.3 General Header Fields
>There are a few header fields which have general applicability for both
>request and response messages, but which do not apply to the entity
>being transferred. These headers apply only to the message being
>transmitted.
>
>       General-Header = Cache-Control            ; Section 18.10
>                      | Connection               ; Section 18.11
>                      | Date                     ; Section 18.20
>                      | Via                      ; Section 18.47
>                      | Keep-Alive               ; Section 23.5.2.5.1
>                      | Pragma                   ; Section 18.34
>                      | Upgrade                  ; Section 18.44
>
>General header field names can be extended reliably only in combination
>with a change in the protocol version. However, new or experimental
>header fields may be given the semantics of general header fields if
>all
>parties in the communication recognize them to be general header
>fields.
>Unrecognized header fields are treated as Entity-Header fields.
>
>
>9 Request
>A request message from a client to a server includes, within the first
>line of that message, the method to be applied to the resource, the
>identifier of the resource, and the protocol version in use. For
>backwards compatibility with the more limited HTTP/0.9 protocol, there
>are two valid formats for an HTTP request:
>
>       Request        = Full-Request
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 32]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       Full-Request   = Request-Line              ; Section 9.1
>                        *( General-Header         ; Section 8.3
>                         | Request-Header         ; Section 9.2
>                         | Entity-Header )        ; Section 11.1
>                        CRLF
>                        [ Entity-Body ]           ; Section 11.2
>
>
>
>
>9.1 Request-Line
>The Request-Line begins with a method token, followed by the
>Request-URI
>and the protocol version, and ending with CRLF. The elements are
>separated by SP characters. No CR or LF are allowed except in the final
>CRLF sequence.
>
>       Request-Line   =  CRLF | Method SP Request-URI SP HTTP-Version
>CRLF
>
>In the interest of robustness, HTTP/1.1 servers SHOULD ignore null
>request lines (ones that comprise just CRLF).  An HTTP/1.1 client MUST
>NOT preface a request with CRLF.
>
>
>9.1.1 Method
>The Method token indicates the method to be performed on the resource
>identified by the Request-URI. The method is case-sensitive.
>
>       Method         = "OPTIONS"                ; Section 13.1
>                      | "GET"                    ; Section 13.2
>                      | "HEAD"                   ; Section 13.3
>                      | "POST"                   ; Section 13.4
>                      | "PUT"                    ; Section 13.5
>                      | "DELETE"                 ; Section 13.6
>                      | "TRACE"                  ; Section 13.7
>                      | extension-method
>
>       extension-method = token
>
>The list of methods acceptable by a plain resource can be specified in
>an Allow header field (section 18.7). However, the client is always
>notified through the return code of the response whether a method is
>currently allowed on a plain resource, as this can change dynamically.
>Servers SHOULD return the status code 405 (method not allowed) if the
>method is known by the server but not allowed for the requested
>resource, and 501 (not implemented) if the method is unrecognized or
>not
>implemented by the server. The list of methods known by a server can be
>listed in a Public response header field (section 18.37).
>
>The methods GET and HEAD MUST be supported by all general-purpose
>servers. Servers which provide Last-Modified dates for resources MUST
>also support the conditional GET method. All other methods are
>optional;
>however, if the above methods are implemented, they MUST be implemented
>with the same semantics as those specified in section 13.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 33]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>9.1.2 Request-URI
>The Request-URI is a Uniform Resource Identifier (section 7.2) and
>identifies the resource upon which to apply the request.
>
>       Request-URI    = "*" | absoluteURI | abs_path
>
>The three options for Request-URI are dependent on the nature of the
>request. The asterisk "*" means that the request does not apply to a
>particular resource, but to the server itself, and is only allowed when
>the Method used does not necessarily apply to a resource. One example
>would be
>
>       OPTIONS * HTTP/1.1
>
>The absoluteURI form is required when the request is being made to a
>proxy. The proxy is requested to forward the request or service it from
>a valid cache, and return the response.. Note that the proxy MAY
>forward
>the request on to another proxy or directly to the server specified by
>the absoluteURI. In order to avoid request loops, a proxy MUST be able
>to recognize all of its server names, including any aliases, local
>variations, and the numeric IP address. An example Request-Line would
>be:
>
>       GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
>
>To allow for transition to absoluteURIs in all requests in future
>versions of HTTP, all HTTP/1.1 servers MUST accept the absoluteURI form
>in requests, even though HTTP/1.1 clients will only generate them in
>requests to proxies.  The Host request-header field MUST be ignored in
>requests using an absoluteURL as the Request-URI.
>
>The most common form of Request-URI is that used to identify a resource
>on an origin server or gateway. In this case the absolute path of the
>URI MUST be transmitted (see 7.2.1, abs_path) as the Request-URI, and
>the network location of the URI (net_loc) MUST be transmitted in a Host
>header field.. For example, a client wishing to retrieve the resource
>above directly from the origin server would create a TCP connection to
>port 80 of the host "www.w3.org" and send the lines:
>
>       GET /pub/WWW/TheProject.html HTTP/1.1
>       Host:www.w3.org
>
>followed by the remainder of the Full-Request. Note that the absolute
>path cannot be empty; if none is present in the original URI, it MUST
>be
>given as "/" (the server root).
>
>If a proxy receives a request without any path in the Request-URI and
>the method specified is capable of supporting the asterisk form of
>request, then the last proxy on the request chain MUST forward the
>request with "*" as the final Request-URI. For example, the request
>
>       OPTIONS http://www.ics.uci.edu:8001 HTTP/1.1
>
>would be forwarded by the proxy as
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 34]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       OPTIONS * HTTP/1.1
>       Host: www.ics.uci.edu:8001
>
>after connecting to port 8001 of host "www.ics.uci.edu".
>
>The Request-URI is transmitted as an encoded string, where some
>characters may be escaped using the "% HEX HEX" encoding defined by RFC
>1738 . The origin server MUST decode the Request-URI in order to
>properly interpret the request.  In requests that they forward, proxies
>MUST NOT rewrite the "abs_path" part of a Request-URI in any way except
>as noted above to replace a null abs_path with "*". Illegal
>Request-URIs
>SHOULD be responded to with an appropriate status code. Proxies MAY
>transform the Request-URI for internal processing purposes, but SHOULD
>NOT send such a transformed Request-URI  in forwarded requests.
>
>  The main reason for this rule is to make sure that the form of
>  Request-URI is well specified, to enable future extensions without
>  fear that they will break in the face of some rewritings. Another
>  is that one consequence of rewriting the Request-URI is that
>  integrity or authentication checks by the server may fail; since
>  rewriting MUST be avoided in this case, it may as well be
>  proscribed in general. Implementers should be aware that some pre-
>  HTTP/1.1 proxies do some rewriting.
>
>
>9.2 The Resource Identified by a Request
>HTTP/1.1 origin servers SHOULD be aware that the exact resource
>identified by an Internet request is determined by examining both the
>Request-URI and the Host header field.  An origin server that does not
>allow resources to differ by the requested host MAY ignore the Host
>header field.  An origin server that does differentiate resources based
>on the host requested (sometimes referred to as virtual hosts or vanity
>hostnames) MUST use the following rules for determining the requested
>resource on an HTTP/1.1 request:.
>
>  1. If Request-URI is an absoluteURI, the host is included in the
>     Request-URI.  Any Host header field in the request MUST be
>ignored.
>  2. If the Request-URI is not an absoluteURI, and the request includes
>     a Host header field, the host is determined by the Host header
>     field.
>  3. If the request-URI is not an absoluteURI and no Host header field
>     is present (or does not represent a valid host on that server),
>     the response MUST be a 400 (Bad Request) error message.
>Recipients of an HTTP/1.0 request lacking a Host header field MAY
>attempt to use heuristics (e.g., examination of the URI path for
>something unique to a particular host) in order to determine what exact
>resource is being requested.
>
>
>9.3 Request Header Fields
>The request header fields allow the client to pass additional
>information about the request, and about the client itself, to the
>server. These fields act as request modifiers, with semantics
>equivalent
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 35]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>to the parameters on a programming language method (procedure)
>invocation.
>
>       Request-Header = Accept                   ; Section 18.1
>                      | Accept-Charset           ; Section 18.2
>                      | Accept-Encoding          ; Section 18.3
>                      | Accept-Language          ; Section 18.4
>                      | Authorization            ; Section 18.8
>                      | From                     ; Section 18.23
>                      | Host                     ; Section 18.24
>                      | If-Modified-Since        ; Section 18.25
>                      | If-Range                 ; Section 18.28
>                      | Proxy-Authorization      ; Section 18.36
>                      | Range                    ; Section 18.38
>                      | Referer                  ; Section 18.39
>                      | User-Agent               ; Section 18.45
>                      | Max-Forwards             ; Section 18.32
>
>Request-Header field names can be extended reliably only in combination
>with a change in the protocol version. However, new or experimental
>header fields MAY be given the semantics of request header fields if
>all
>parties in the communication recognize them to be request header
>fields.
>Unrecognized header fields are treated as Entity-Header fields.
>
>
>10 Response
>After receiving and interpreting a request message, a server responds
>in
>the form of an HTTP response message.
>
>       Response        = Full-Response
>
>       Full-Response   = Status-Line               ; Section 10.1
>                         *( General-Header         ; Section 8.3
>                          | Response-Header        ; Section 10.2
>                          | Entity-Header )        ; Section 11.1
>                         CRLF
>                         [ Entity-Body ]           ; Section 11.2
>
>
>10.1 Status-Line
>The first line of a Full-Response message is the Status-Line,
>consisting
>of the protocol version followed by a numeric status code and its
>associated textual phrase, with each element separated by SP
>characters.
>No CR or LF is allowed except in the final CRLF sequence.
>
>       Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
>
>
>10.1.1 Status Code and Reason Phrase
>The Status-Code element is a 3-digit integer result code of the attempt
>to understand and satisfy the request. The Reason-Phrase is intended to
>give a short textual description of the Status-Code. The Status-Code is
>intended for use by automata and the Reason-Phrase is intended for the
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 36]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>human user. The client is not required to examine or display the
>Reason-
>Phrase.
>
>The first digit of the Status-Code defines the class of response. The
>last two digits do not have any categorization role. There are 5 values
>for the first digit:
>
>
>  .  1xx: Informational - Request received, continuing process
>
>  .  2xx: Success - The action was successfully received, understood,
>     and accepted
>
>  .  3xx: Redirection - Further action must be taken in order to
>     complete the request
>
>  .  4xx: Client Error - The request contains bad syntax or cannot be
>     fulfilled
>
>  .  5xx: Server Error - The server failed to fulfill an apparently
>     valid request
>The individual values of the numeric status codes defined for HTTP/1.1,
>and an example set of corresponding Reason-Phrase's, are presented
>below. The reason phrases listed here are only recommended -- they may
>be replaced by local equivalents without affecting the protocol. These
>codes are fully defined in section 12.
>
>       Status-Code    = "100"   ; Continue
>                      | "101"   ; Switching Protocols
>                      | "200"   ; OK
>                      | "201"   ; Created
>                      | "202"   ; Accepted
>                      | "203"   ; Non-Authoritative Information
>                      | "204"   ; No Content
>                      | "205"   ; Reset Content
>                      | "206"   ; Partial Content
>                      | "300"   ; Multiple Choices
>                      | "301"   ; Moved Permanently
>                      | "302"   ; Moved Temporarily
>                      | "303"   ; See Other
>                      | "304"   ; Not Modified
>                      | "305"   ; Use Proxy
>                      | "400"   ; Bad Request
>                      | "401"   ; Unauthorized
>                      | "402"   ; Payment Required
>                      | "403"   ; Forbidden
>                      | "404"   ; Not Found
>                      | "405"   ; Method Not Allowed
>                      | "406"   ; Not Acceptable
>                      | "407"   ; Proxy Authentication Required
>                      | "408"   ; Request Time-out
>                      | "409"   ; Conflict
>                      | "410"   ; Gone
>                      | "411"   ; Length Required
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 37]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>                      | "412"   ; Precondition Failed
>                      | "413"   ; Request Entity Too Large
>                      | "414"   ; Request URI Too Large
>                      | "415"   ; Unsupported Media Type
>                      | "500"   ; Internal Server Error
>                      | "501"   ; Not Implemented
>                      | "502"   ; Bad Gateway
>                      | "503"   ; Service Unavailable
>                      | "504"   ; Gateway Time-out
>                      | "505"   ; HTTP Version not supported
>                      | extension-code
>
>       extension-code = 3DIGIT
>
>       Reason-Phrase  = *<TEXT, excluding CR, LF>
>
>HTTP status codes are extensible. HTTP applications are not required to
>understand the meaning of all registered status codes, though such
>understanding is obviously desirable. However, applications MUST
>understand the class of any status code, as indicated by the first
>digit, and treat any unrecognized response as being equivalent to the
>x00 status code of that class, with the exception that an unrecognized
>response MUST NOT be cached. For example, if an unrecognized status
>code
>of 431 is received by the client, it can safely assume that there was
>something wrong with its request and treat the response as if it had
>received a 400 status code. In such cases, user agents SHOULD present
>to
>the user the entity returned with the response, since that entity is
>likely to include human-readable information which will explain the
>unusual status.
>
>
>10.2 Response Header Fields
>The response header fields allow the server to pass additional
>information about the response which cannot be placed in the Status-
>Line. These header fields give information about the server and about
>further access to the resource identified by the Request-URI.
>
>       Response-Header = Location                ; Section 18.31
>                       | Proxy-Authenticate      ; Section 18.35
>                       | Public                  ; Section 18.37
>                       | Retry-After             ; Section 18.40
>                       | Server                  ; Section 18.41
>                       | WWW-Authenticate        ; Section 18.46
>
>Response-Header field names can be extended reliably only in
>combination
>with a change in the protocol version. However, new or experimental
>header fields MAY be given the semantics of response header fields if
>all parties in the communication recognize them to be response header
>fields. Unrecognized header fields are treated as Entity-Header fields.
>
>
>11 Entity
>Full-Request and Full-Response messages MAY transfer an entity within
>some requests and responses. An entity consists of Entity-Header fields
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 38]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>and (usually) an Entity-Body. In this section, both sender and
>recipient
>refer to either the client or the server, depending on who sends and
>who
>receives the entity.
>
>
>11.1 Entity Header Fields
>Entity-Header fields define optional metainformation about the Entity-
>Body or, if no body is present, about the resource identified by the
>request.
>
>       Entity-Header  = Allow                    ; Section 18.7
>                      | Content-Base             ; Section 18.12
>                      | Content-Encoding         ; Section 18.3
>                      | Content-Language         ; Section 18.14
>                      | Content-Length           ; Section 18.15
>                      | Content-Location         ; Section 18.16
>                      | Content-MD5              ; Section 0
>                      | Content-Range            ; Section 18.18
>                      | Content-Type             ; Section 18.19
>                      | Expires                  ; Section 18.22
>                      | Last-Modified            ; Section 18.30
>                      | Title                    ; Section 18.42
>                      | Transfer-Encoding        ; Section 18.43
>                      | extension-header
>
>       extension-header = HTTP-header
>
>The extension-header mechanism allows additional Entity-Header fields
>to
>be defined without changing the protocol, but these fields cannot be
>assumed to be recognizable by the recipient. Unrecognized header fields
>SHOULD be ignored by the recipient and forwarded by proxies.
>
>
>11.2 Entity Body
>The entity body (if any) sent with an HTTP request or response is in a
>format and encoding defined by the Entity-Header fields.
>
>       Entity-Body    = *OCTET
>
>An entity body MUST  ONLY be included with a request message when the
>request method calls for one. The presence of an entity body in a
>request is signaled by the inclusion of a Content-Length and/or
>Content-
>Type header field in the request message headers.
>
>For response messages, whether or not an entity body is included with a
>message is dependent on both the request method and the response code.
>All responses to the HEAD request method MUST NOT include a body, even
>though the presence of entity header fields may lead one to believe
>they
>do. All 1xx (informational), 204 (no content), and 304 (not modified)
>responses MUST NOT include a body. All other responses MUST include an
>entity body or a Content-Length header field defined with a value of
>zero (0).
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 39]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>11.2.1 Type
>When an entity body is included with a message, the data type of that
>body is determined via the header fields Content-Type,
>Content-Encoding,
>and Transfer-Encoding. These define a three-layer, ordered encoding
>model:
>
>       entity-body :=
>          Transfer-Encoding( Content-Encoding( Content-Type( data ) ) )
>
>The default for both encodings is none (i.e., the identity function).
>Content-Type specifies the media type of the underlying data. Content-
>Encoding may be used to indicate any additional content codings applied
>to the type, usually for the purpose of data compression, that are a
>property of the resource entity  requested. Transfer-Encoding may be
>used to indicate any additional transfer codings applied by an
>application to ensure safe and proper transfer of the message. Note
>that
>Transfer-Encoding is a property of the message, not of the resource
>entity.
>
>Any HTTP/1.1 message containing an entity body SHOULD include a
>Content-
>Type header field defining the media type of that body. If and only if
>the media type is not given by a Content-Type header, the recipient may
>attempt to guess the media type via inspection of its content and/or
>the
>name extension(s) of the URL used to identify the resource. If the
>media
>type remains unknown, the recipient SHOULD treat it as type
>"application/octet-stream".
>
>
>11.2.2 Length
>When an entity body is included with a message, the length of that body
>may be determined in one of several ways. If a Content-Length header
>field is present, its value in bytes represents the length of the
>entity
>body. Otherwise, the body length is determined by the Transfer-Encoding
>(if the "chunked" transfer coding has been applied) or by the server
>closing the connection.
>
>  Note: Any response message which MUST NOT include an entity body
>  (such as the 1xx, 204, and 304 responses and any response to a HEAD
>  request) is always terminated by the first empty line after the
>  header fields, regardless of the entity header fields present in
>  the message.
>
>Closing the connection cannot be used to indicate the end of a request
>body, since it leaves no possibility for the server to send back a
>response. For compatibility with HTTP/1.0 applications, HTTP/1.1
>requests containing an entity body MUST include a valid Content-Length
>header field unless the server is known to be HTTP/1.1 compliant.
>HTTP/1.1 servers MUST accept the "chunked" transfer coding (section
>7.6), thus allowing this mechanism to be used for a request when
>Content-Length is unknown.
>
>If a request contains an entity body and Content-Length is not
>specified, the server SHOULD respond with 400 (bad request) if it
>cannot
>determine the length of the request message's content, or with 411
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 40]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>(length required) if it wishes to insist on receiving a valid Content-
>Length.
>
>Messages MUST NOT include both a Content-Length header field and the
>"chunked" transfer coding. If both are received, the Content-Length
>MUST
>be ignored.
>
>When a Content-Length is given in a message where an entity body is
>allowed, its field value MUST exactly match the number of OCTETs in the
>entity body. HTTP/1.1 user agents MUST notify the user when an invalid
>length is received and detected.
>
>
>12 Status Code Definitions
>Each Status-Code is described below, including a description of which
>method(s) it can follow and any metainformation required in the
>response.
>
>
>12.1 Informational 1xx
>This class of status code indicates a provisional response, consisting
>only of the Status-Line and optional headers, and is terminated by an
>empty line. Since HTTP/1.0 did not define any 1xx status codes, servers
>MUST NOT send a 1xx response to an HTTP/1.0 client except under
>experimental conditions.
>
>
>12.1.1.1 100 Continue
>The client may continue with its request. This interim response is used
>to inform the client that the initial part of the request has been
>received and has not yet been rejected by the server. The client SHOULD
>continue by sending the remainder of the request or, if the request has
>already been completed, ignore this response. The server MUST send a
>final response after the request has been completed.
>
>
>12.1.1.2 101 Switching Protocols
>The server understands and is willing to comply with the client's
>request, via the Upgrade message header field (section 18.44), for a
>change in the application protocol being used on this connection. The
>server will switch protocols to those defined by the response's Upgrade
>header field immediately after the empty line which terminates the 101
>response.
>
>The protocol should only be switched when it is advantageous to do so.
>For example, switching to a newer version of HTTP is advantageous over
>older versions, and switching to a real-time, synchronous protocol may
>be advantageous when delivering resources that use such features.
>
>
>12.2 Successful 2xx
>This class of status code indicates that the client's request was
>successfully received, understood, and accepted.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 41]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>12.2.1.1 200 OK
>The request has succeeded. The information returned with the response
>is
>dependent on the method used in the request, as follows:
>
>
>GET
>  an entity corresponding to the requested resource is sent in the
>  response;
>
>HEAD
>  the response MUST only contain the header information and no Entity-
>  Body;
>
>POST
>  an entity describing or containing the result of the action;
>
>TRACE
>  an entity containing the request message as received by the end
>  server;
>
>otherwise,
>  an entity describing the result of the action;
>If the entity corresponds to a resource, the response MAY include a
>Content-Location header field giving the actual location of that plain
>resource for later reference.
>
>
>12.2.1.2 201 Created
>The request has been fulfilled and resulted in a new resource being
>created. The newly created resource can be referenced by the URI(s)
>returned in the entity of the response, with the most specific URL for
>the resource given by a Location header field. The origin server SHOULD
>create the resource before returning this status code. If the action
>cannot be carried out immediately, the server MUST include in the
>response body a description of when the resource will be available;
>otherwise, the server SHOULD respond with 202 (Accepted).
>
>
>12.2.1.3 202 Accepted
>The request has been accepted for processing, but the processing has
>not
>been completed. The request MAY or MAY NOT eventually be acted upon, as
>it MAY be disallowed when processing actually takes place. There is no
>facility for re-sending a status code from an asynchronous operation
>such as this.
>
>The 202 response is intentionally non-committal. Its purpose is to
>allow
>a server to accept a request for some other process (perhaps a batch-
>oriented process that is only run once per day) without requiring that
>the user agent's connection to the server persist until the process is
>completed. The entity returned with this response SHOULD include an
>indication of the request's current status and either a pointer to a
>status monitor or some estimate of when the user can expect the request
>to be fulfilled.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 42]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>12.2.1.4 203 Non-Authoritative Information
>The returned metainformation in the Entity-Header is not the definitive
>set as available from the origin server, but is gathered from a local
>or
>a third-party copy. The set presented MAY be a subset or superset of
>the
>original version. For example, including local annotation information
>about the resource MAY result in a superset of the metainformation
>known
>by the origin server. Use of this response code is not required and is
>only appropriate when the response would otherwise be 200 (OK).
>
>
>12.2.1.5 204 No Content
>The server has fulfilled the request but there is no new information to
>send back. If the client is a user agent, it SHOULD NOT change its
>document view from that which caused the request to be generated. This
>response is primarily intended to allow input for actions to take place
>without causing a change to the user agent's active document view. The
>response MAY include new metainformation in the form of entity headers,
>which SHOULD apply to the document currently in the user agent's active
>view.
>
>The 204 response MUST NOT include an entity body, and thus is always
>terminated by the first empty line after the header fields.
>
>
>12.2.1.6 205 Reset Content
>The server has fulfilled the request and the user agent SHOULD reset
>the
>document view which caused the request to be generated. This response
>is
>primarily intended to allow input for actions to take place via user
>input, followed by a clearing of the form in which the input is given
>so
>that the user can easily initiate another input action. The response
>MUST include a Content-Length with a value of zero (0) and no entity
>body.
>
>
>12.2.1.7 206 Partial Content
>The server has fulfilled the partial GET request for the resource. The
>request MUST have included a Range header field (section 18.38)
>indicating the desired range. The response MUST include a Content-Range
>header field (section 18.18) indicating the range included with this
>response. All entity header fields in the response MUST describe the
>partial entity transmitted rather than what would have been transmitted
>in a full response. In particular, the Content-Length header field in
>the response MUST match the actual number of OCTETs transmitted in the
>entity body. It is assumed that the client already has the complete
>entity's header field data.
>
>
>12.3 Redirection 3xx
>This class of status code indicates that further action needs to be
>taken by the user agent in order to fulfill the request. The action
>required MAY be carried out by the user agent without interaction with
>the user if and only if the method used in the second request is GET or
>HEAD. A user agent SHOULD NOT automatically redirect a request more
>than
>5 times, since such redirections usually indicate an infinite loop.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 43]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>12.3.1.1 300 Multiple Choices
>This status code is reserved for future use by a planned content
>negotiation mechanism.  HTTP/1.1 user agents receiving a 300 response
>which includes a Location header field can treat this response as they
>would treat a 303 (See Other) response.  If no Location header field is
>included, the appropriate action is to display the entity enclosed in
>the response to the user.
>
>
>12.3.1.2 301 Moved Permanently
>The requested resource has been assigned a new permanent URI and any
>future references to this resource SHOULD be done using one of the
>returned URIs. Clients with link editing capabilities SHOULD
>automatically re-link references to the Request-URI to one or more of
>the new references returned by the server, where possible. This
>response
>is cachable unless indicated otherwise.
>
>If the new URI is a location, its URL MUST be given by the Location
>field in the response. Unless it was a HEAD request, the Entity-Body of
>the response SHOULD contain a short hypertext note with a hyperlink to
>the new URI(s).
>
>If the 301 status code is received in response to a request other than
>GET or HEAD, the user agent MUST NOT automatically redirect the request
>unless it can be confirmed by the user, since this might change the
>conditions under which the request was issued.
>
>  Note: When automatically redirecting a POST request after receiving
>  a 301 status code, some existing HTTP/1.0 user agents will
>  erroneously change it into a GET request.
>
>
>12.3.1.3 302 Moved Temporarily
>The requested resource resides temporarily under a different URI. Since
>the redirection may be altered on occasion, the client SHOULD continue
>to use the Request-URI for future requests. This response is only
>cachable if indicated by a Cache-Control or Expires header field.
>
>If the new URI is a location, its URL MUST be given by the Location
>field in the response. Unless it was a HEAD request, the Entity-Body of
>the response SHOULD contain a short hypertext note with a hyperlink to
>the new URI(s).
>
>If the 302 status code is received in response to a request other than
>GET or HEAD, the user agent MUST NOT automatically redirect the request
>unless it can be confirmed by the user, since this might change the
>conditions under which the request was issued.
>
>  Note: When automatically redirecting a POST request after receiving
>  a 302 status code, some existing HTTP/1.0 user agents will
>  erroneously change it into a GET request.
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 44]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>12.3.1.4 303 See Other
>The response to the request can be found under a different URI and
>SHOULD be retrieved using a GET method on that resource. This method
>exists primarily to allow the output of a POST-activated script to
>redirect the user agent to a selected resource. The new resource is not
>a update reference for the original Request-URI. The 303 response is
>not
>cachable, but the response to the second request MAY be cachable.
>
>If the new URI is a location, its URL MUST be given by the Location
>field in the response. Unless it was a HEAD request, the Entity-Body of
>the response SHOULD contain a short hypertext note with a hyperlink to
>the new URI(s).
>
>
>12.3.1.5 304 Not Modified
>If the client has performed a conditional GET request and access is
>allowed, but the document has not been modified since the date and time
>specified in the If-Modified-Since field, the server MUST respond with
>this status code and not send an Entity-Body to the client. Header
>fields contained in the response SHOULD only include information which
>is relevant to cache managers or which MAY have changed independently
>of
>the entity's Last-Modified date. Examples of relevant header fields
>include: Date, Server, Content-Length, Content-MD5, Content-Version,
>Cache-Control and Expires.
>
>A cache SHOULD update its cached entity to reflect any new field values
>given in the 304 response. If the new field values indicate that the
>cached entity differs from the current resource entity  (as would be
>indicated by a change in Content-Length, Content-MD5, or Content-
>Version), then the cache MUST disregard the 304 response and repeat the
>request without an If-Modified-Since field.
>
>The 304 response MUST NOT include an entity body, and thus is always
>terminated by the first empty line after the header fields.
>
>
>12.3.1.6 305 Use Proxy
>The requested resource MUST be accessed through the proxy given by the
>Location field in the response. In other words, this is a proxy
>redirect.
>
>
>12.4 Client Error 4xx
>The 4xx class of status code is intended for cases in which the client
>seems to have erred. If the client has not completed the request when a
>4xx code is received, it SHOULD immediately cease sending data to the
>server. Except when responding to a HEAD request, the server SHOULD
>include an entity containing an explanation of the error situation, and
>whether it is a temporary or permanent condition. These status codes
>are
>applicable to any request method.
>
>  Note: If the client is sending data, server implementations using
>  TCP SHOULD be careful to ensure that the client acknowledges
>  receipt of the packet(s) containing the response prior to closing
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 45]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  the input connection. If the client continues sending data to the
>  server after the close, the server's controller will send a reset
>  packet to the client, which may erase the client's unacknowledged
>  input buffers before they can be read and interpreted by the HTTP
>  application.
>
>
>12.4.1.1 400 Bad Request
>The request could not be understood by the server due to malformed
>syntax. The client SHOULD NOT repeat the request without modifications.
>
>
>12.4.1.2 401 Unauthorized
>The request requires user authentication. The response MUST include a
>WWW-Authenticate header field (section 18.46) containing a challenge
>applicable to the requested resource. The client MAY repeat the request
>with a suitable Authorization header field (section 18.8). If the
>request already included Authorization credentials, then the 401
>response indicates that authorization has been refused for those
>credentials. If the 401 response contains the same challenge as the
>prior response, and the user agent has already attempted authentication
>at least once, then the user SHOULD be presented the entity that was
>given in the response, since that entity MAY include relevant
>diagnostic
>information. HTTP access authentication is explained in section 14.
>
>
>12.4.1.3 402 Payment Required
>This code is reserved for future use.
>
>
>12.4.1.4 403 Forbidden
>The server understood the request, but is refusing to fulfill it.
>Authorization will not help and the request SHOULD not be repeated. If
>the request method was not HEAD and the server wishes to make public
>why
>the request has not been fulfilled, it SHOULD describe the reason for
>the refusal in the entity body. This status code is commonly used when
>the server does not wish to reveal exactly why the request has been
>refused, or when no other response is applicable.
>
>
>12.4.1.5 404 Not Found
>The server has not found anything matching the Request-URI. No
>indication is given of whether the condition is temporary or permanent.
>If the server does not wish to make this information available to the
>client, the status code 403 (Forbidden) can be used instead. The 410
>(Gone) status code SHOULD be used if the server knows, through some
>internally configurable mechanism, that an old resource is permanently
>unavailable and has no forwarding address.
>
>
>12.4.1.6 405 Method Not Allowed
>The method specified in the Request-Line is not allowed for the
>resource
>identified by the Request-URI. The response MUST include an Allow
>header
>containing a list of valid methods for the requested resource.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 46]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>12.4.1.7 406 Not Acceptable
>The resource identified by the request is only capable of generating
>response entities which have content characteristics not acceptable
>according to the accept headers sent in the request.
>
>HTTP/1.1 servers are allowed to return responses which are not
>acceptable according to the accept headers sent in the request. In some
>cases, this may even be preferable to sending a 406 response.  User
>agents are encouraged to inspect the headers of an incoming response to
>determine if it is acceptable. If the response is not acceptable, user
>agents SHOULD interrupt the receipt of the response if doing so would
>save network resources.  If it is unknown whether an incoming response
>would be acceptable, a user agent SHOULD temporarily stop receipt of
>more data and query the user for a decision on furtheractions.
>
>
>12.4.1.8 407 Proxy Authentication Required
>This code is similar to 401 (Unauthorized), but indicates that the
>client MUST first authenticate itself with the proxy. The proxy MUST
>return a Proxy-Authenticate header field (section 18.35) containing a
>challenge applicable to the proxy for the requested resource. The
>client
>MAY repeat the request with a suitable Proxy-Authorization header field
>(section 18.36). HTTP access authentication is explained in section 14.
>
>
>12.4.1.9 408 Request Timeout
>The client did not produce a request within the time that the server
>was
>prepared to wait. The client MAY repeat the request without
>modifications at any later time.
>
>
>12.4.1.10 409 Conflict
>The request could not be completed due to a conflict with the current
>state of the resource. This code is only allowed in situations where it
>is expected that the user MAY be able to resolve the conflict and
>resubmit the request. The response body SHOULD include enough
>information for the user to recognize the source of the conflict.
>Ideally, the response entity would include enough information for the
>user or user-agent to fix the problem; however, that MAY not be
>possible
>and is not required.
>
>Conflicts are most likely to occur in response to a PUT request. If
>versioning is being used and the entity being PUT includes changes to a
>resource which conflict with those made by an earlier (third-party)
>request, the server MAY use the 409 response to indicate that it can't
>complete the request. In this case, the response entity SHOULD contain
>a
>list of the differences between the two versions in a format defined by
>the response Content-Type.
>
>
>12.4.1.11 410 Gone
>The requested resource is no longer available at the server and no
>forwarding address is known. This condition SHOULD be considered
>permanent. Clients with link editing capabilities SHOULD delete
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 47]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>references to the Request-URI after user approval. If the server does
>not know, or has no facility to determine, whether or not the condition
>is permanent, the status code 404 (Not Found) SHOULD be used instead.
>This response is cachable unless indicated otherwise.
>
>The 410 response is primarily intended to assist the task of web
>maintenance by notifying the recipient that the resource is
>intentionally unavailable and that the server owners desire that remote
>links to that resource be removed. Such an event is common for limited-
>time, promotional services and for resources belonging to individuals
>no
>longer working at the server's site. It is not necessary to mark all
>permanently unavailable resources as "gone" or to keep the mark for any
>length of time -- that is left to the discretion of the server owner.
>
>
>12.4.1.12 411 Length Required
>The server refuses to accept the request without a defined Content-
>Length. The client MAY repeat the request if it adds a valid Content-
>Length header field containing the length of the entity body in the
>request message.
>
>
>12.4.1.13 412 Precondition Failed
>The precondition given in one or more of the request header fields
>evaluated to false when it was tested on the server. This response code
>allows the client to place preconditions on the current resource
>metainformation (header field data) and thus prevent the requested
>method from being applied to a resource other than the one intended.
>
>
>12.4.1.14 413 Request Entity Too Large
>The server is refusing to process a request because it considers the
>request entity to be larger than it is willing or able to process. The
>server SHOULD close the connection if that is necessary to prevent the
>client from continuing the request.
>
>If the client manages to read the 413 response, it MUST honor it and
>SHOULD reflect it to the user.
>
>If this restriction is considered temporary, the server MAY include a
>Retry-After header field to indicate that it is temporary and after
>what
>time the client MAY try again.
>
>
>12.4.1.15 414 Request-URI Too Long
>The server is refusing to service the request because the Request-URI
>is
>longer than the server is willing to interpret. This rare condition is
>only likely to occur when a client has improperly converted a POST
>request to a GET request with long query information, when the client
>has descended into a URL "black hole" of redirection (e.g., a
>redirected
>URL prefix that points to a suffix of itself), or when the server is
>under attack by a client attempting to exploit security holes present
>in
>some servers using  fixed-length buffers for reading or manipulating
>the
>Request-URI.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 48]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>12.4.1.16 415 Unsupported Media Type
>The server is refusing to service the request because the entity body
>of
>the request is in a format not supported by the requested resource for
>the requested method.
>
>
>12.5 Server Error 5xx
>Response status codes beginning with the digit "5" indicate cases in
>which the server is aware that it has erred or is incapable of
>performing the request. If the client has not completed the request
>when
>a 5xx code is received, it SHOULD immediately cease sending data to the
>server. Except when responding to a HEAD request, the server SHOULD
>include an entity containing an explanation of the error situation, and
>whether it is a temporary or permanent condition. These response codes
>are applicable to any request method and there are no required header
>fields.
>
>
>12.5.1.1 500 Internal Server Error
>The server encountered an unexpected condition which prevented it from
>fulfilling the request.
>
>
>12.5.1.2 501 Not Implemented
>The server does not support the functionality required to fulfill the
>request. This is the appropriate response when the server does not
>recognize the request method and is not capable of supporting it for
>any
>resource.
>
>
>12.5.1.3 502 Bad Gateway
>The server, while acting as a gateway or proxy, received an invalid
>response from the upstream server it accessed in attempting to fulfill
>the request.
>
>
>12.5.1.4 503 Service Unavailable
>The server is currently unable to handle the request due to a temporary
>overloading or maintenance of the server. The implication is that this
>is a temporary condition which will be alleviated after some delay. If
>known, the length of the delay MAY be indicated in a Retry-After
>header.
>If no Retry-After is given, the client SHOULD handle the response as it
>would for a 500 response.
>
>  Note: The existence of the 503 status code does not imply that a
>  server must use it when becoming overloaded. Some servers MAY wish
>  to simply refuse the connection.
>
>
>12.5.1.5 504 Gateway Timeout
>The server, while acting as a gateway or proxy, did not receive a
>timely
>response from the upstream server it accessed in attempting to complete
>the request.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 49]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>12.5.1.6 505 HTTP Version Not Supported
>The server does not support, or refuses to support, the HTTP protocol
>version that was used in the request message.  The server is indicating
>that it is unable or unwilling to complete the request using the same
>major version as the client, as described in section 7.1, other than
>with this error message.  The response SHOULD contain an entity
>describing why that version is not supported and what other protocols
>are supported by that server.
>
>
>13 Method Definitions
>The set of common methods for HTTP/1.1 is defined below. Although this
>set can be expanded, additional methods cannot be assumed to share the
>same semantics for separately extended clients and servers.
>
>The Host request-header field (section 18.24) MUST accompany all
>HTTP/1.1 requests.
>
>
>13.1 OPTIONS
>The OPTIONS method represents a request for information about the
>communication options available on the request/response chain
>identified
>by the Request-URI. This method allows the client to determine the
>options and/or requirements associated with a resource, or the
>capabilities of a server, without implying a resource action or
>initiating a resource retrieval.
>
>Unless the server's response is an error, the response MUST NOT include
>entity information other than what can be considered as communication
>options (e.g., Allow is appropriate, but Content-Type is not) and MUST
>include a Content-Length with a value of zero (0). Responses to this
>method are not cachable.
>
>If the Request-URI is an asterisk ("*"), the OPTIONS request is
>intended
>to apply to the server as a whole. A 200 response SHOULD include any
>header fields which indicate optional features implemented by the
>server
>(e.g., Public), including any extensions not defined by this
>specification, in addition to any applicable general or response header
>fields. As described in section 9.1.2, an "OPTIONS *" request can be
>applied through a proxy by specifying the destination server in the
>Request-URI without any path information.
>
>If the Request-URI is not an asterisk, the OPTIONS request applies only
>to the options that are available when communicating with that
>resource.
>A 200 response SHOULD include any header fields which indicate optional
>features implemented by the server and applicable to that resource
>(e.g., Allow), including any extensions not defined by this
>specification, in addition to any applicable general or response header
>fields. If the OPTIONS request passes through a proxy, the proxy MUST
>edit the response to exclude those options known to be unavailable
>through that proxy.
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 50]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>13.2 GET
>The GET method means retrieve whatever information (in the form of an
>entity) is identified by the Request-URI. If the Request-URI refers to
>a
>data-producing process, it is the produced data which shall be returned
>as the entity in the response and not the source text of the process,
>unless that text happens to be the output of the process.
>
>The semantics of the GET method change to a "conditional GET" if the
>request message includes an If-Modified-Since header field. A
>conditional GET method requests that the identified resource entity  be
>transferred only if it has been modified since the date given by the
>If-
>Modified-Since header, as described in section 18.25. The conditional
>GET method is intended to reduce unnecessary network usage by allowing
>cached entities to be refreshed without requiring multiple requests or
>transferring data already held by the client.
>
>The semantics of the GET method change to a "partial GET" if the
>request
>message includes a Range header field. A partial GET requests that only
>part of the identified resource entity be transferred, as described in
>section 18.38. The partial GET method is intended to reduce unnecessary
>network usage by allowing partially-retrieved entities to be completed
>without transferring data already held by the client.
>
>The response to a GET request may be cachable if and only if it meets
>the requirements for HTTP caching described in section 16.
>
>
>13.3 HEAD
>The HEAD method is identical to GET except that the server MUST NOT
>return any Entity-Body in the response. The metainformation contained
>in
>the HTTP headers in response to a HEAD request SHOULD be identical to
>the information sent in response to a GET request. This method can be
>used for obtaining metainformation about the resource entity identified
>by the Request-URI without transferring the Entity-Body itself. This
>method is often used for testing hypertext links for validity,
>accessibility, and recent modification.
>
>The response to a HEAD request may be cachable in the sense that the
>information contained in the response may be used to update a
>previously
>cached entity from that resource. If the new field values indicate that
>the cached entity differs from the current resource entity (as would be
>indicated by a change in Content-Length, Content-MD5, or Content-
>Version), then the cache MUST mark the  cache entry stale.
>
>There is no "conditional HEAD" or "partial HEAD" request analogous to
>those associated with the GET method. If an If-Modified-Since and/or
>Range header field is included with a HEAD request, they SHOULD be
>ignored.
>
>
>13.4 POST
>The POST method is used to request that the destination server accept
>the entity enclosed in the request as a new subordinate of the resource
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 51]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>identified by the Request-URI in the Request-Line. POST is designed to
>allow a uniform method to cover the following functions:
>
>
>  .  Annotation of existing resources;
>
>  .  Posting a message to a bulletin board, newsgroup, mailing list, or
>     similar group of articles;
>
>  .  Providing a block of data, such as the result of submitting a form
>     , to a data-handling process;
>
>  .  Extending a database through an append operation.
>The actual function performed by the POST method is determined by the
>server and is usually dependent on the Request-URI. The posted entity
>is
>subordinate to that URI in the same way that a file is subordinate to a
>directory containing it, a news article is subordinate to a newsgroup
>to
>which it is posted, or a record is subordinate to a database.
>
>For compatibility with HTTP/1.0 applications, all POST requests MUST
>include a valid Content-Length header field unless the server is known
>to be HTTP/1.1 compliant. When sending a POST request to an HTTP/1.1
>server, a client MUST use a valid Content-Length or the "chunked"
>Transfer-Encoding. The server SHOULD respond with a 400 (bad request)
>message if it cannot determine the length of the request message's
>content, or with 411 (length required) if it wishes to insist on
>receiving a valid Content-Length.
>
>A successful POST does not require that the entity be created as a
>resource on the origin server or made accessible for future reference.
>That is, the action performed by the POST method might not result in a
>resource that can be identified by a URI. In this case, either 200 (OK)
>or 204 (no content) is the appropriate response status, depending on
>whether or not the response includes an entity that describes the
>result.
>
>If a resource has been created on the origin server, the response
>SHOULD
>be 201 (Created) and contain an entity (preferably of type "text/html")
>which describes the status of the request and refers to the new
>resource.
>
>Responses to this method are not cachable. However, the 303 (See Other)
>response can be used to direct the user agent to retrieve a cachable
>resource.
>
>POST requests must obey the entity transmission requirements set out in
>section 13.4.1.
>
>
>13.4.1 SLUSHY: Entity Transmission Requirements
>Editor's Note: The issues here around reliable transmission of large
>entities to servers, particularly HTTP/1.0 servers, are complicated and
>subtle, particularly since we'd like optimistic transmission to be the
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 52]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>normal situation.  We would like it if we can redraft this section to
>be
>simpler in the next draft
>
>General requirements:
>
>  .  HTTP/1.1 servers should maintain persistent connections and use
>     TCP's flow control mechanisms to resolve temporary overloads,
>     rather than terminating connections with the expectation that
>     clients will retry.  The latter technique can exacerbate network
>     congestion.
>  .  An HTTP/1.1 (or later) client doing a PUT-like method SHOULD
>     monitor the network connection for an error status while it is
>     transmitting the request.  If  the client sees an error status, it
>     should immediately cease transmitting the body.  If the body is
>     being sent using a "Chunked" encoding, a zero length chunk is used
>     to mark the end of the message.  If the body was preceded by a
>     Content-length header, the client MUST close the connection.
>  .  An HTTP/1.1 (or later) client MUST be prepared to accept a "100
>     Continue" status followed by a regular response.
>  .  An HTTP/1.1 (or later) server that receives a request from a
>     HTTP/1.0 (or earlier) client MUST NOT transmit the 100 (continue)
>     response; it SHOULD either wait for the request to be completed
>     normally (thus avoiding an interrupted request) or close the
>     connection prematurely.
>Upon receiving a method subject to these requirements from an HTTP/1.1
>(or later) client, an HTTP/1.1 (or later) server MUST either
>immediately
>respondwith 100 (continue) and continue to read from the input stream,
>or respond with an error status.  If it responds with an error status,
>it MAY close the transport (TCP) connection or it MAY continue to read
>and discard the rest of the request.  It MUST NOT perform the requested
>method if it returns an error status.
>
>If an HTTP/1.1 client has seen an HTTP/1.1 or later response from the
>server (clients SHOULD remember the version number of at least the most
>recently used server), and it sees the connection close before
>receiving
>any status from the server, the client SHOULD retry the request.  If
>the
>client does retry the request,
>
>  .  it MUST first send the request headers,
>  .  and then MUST wait for the server to respond with either a 100
>     (continue) response, in which case the client should continue, or
>     with an error status.
>If an HTTP/1.1 client has not seen an HTTP/1.1 or later response from
>the server, it should assume that the server implements HTTP/1.0 or
>older and will not use the 100 (Continue) response. If in this case the
>client sees the connection close before receiving any status from the
>server, the client SHOULD retry the request.  If the client does retry
>the request, it should use the following "binary exponential backoff"
>algorithm to be assured of obtaining a reliable response:
>
>  1. 
>     Initiate a new connection to the server
>  2. 
>     Transmit the request headers
>  3. 
>     Initialize a variable R to the estimated round-trip time to the
>     server (e.g., based on the time it took to establish the
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 53]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>     connection), or to a constant value of 5 seconds if the round-trip
>     time is not available.
>  4. 
>     Compute T = R * (2**N), where N is the number of previous retries
>     of this request.
>  5. 
>     Wait either for an error response from the server, or for T
>seconds
>     (whichever comes first)
>  6. 
>     If no error response is received, after T seconds transmit the
>body
>     of the request.
>  7. 
>     If client sees that the connection is closed prematurely, repeat
>     from step 1 until the request is accepted, an error response is
>     received, or the user becomes impatient.
>No matter what the server version, if an error status is received,
>
>  .  the client MUST NOT continue and
>  .  MUST close the connection if it has not already completed sending
>     the full request body including any encoding mechanism used to
>     transmit the body.
>An HTTP/1.1 (or later) client that sees the connection close after
>receiving a 100 (continue) but before receiving any other status SHOULD
>retry the request, and need not wait for 100 (continue) response (but
>MAY do so if this simplifies the implementation).
>
>
>13.5 PUT
>The PUT method requests that the enclosed entity be stored under the
>supplied Request-URI. If the Request-URI refers to an already existing
>resource, the enclosed entity SHOULD be considered as a modified
>version
>of the one residing on the origin server. If the Request-URI does not
>point to an existing resource, and that URI is capable of being defined
>as a new resource by the requesting user agent, the origin server can
>create the resource with that URI. If a new resource is created, the
>origin server MUST inform the user agent via the 201 (created)
>response.
>If an existing resource is modified, either the 200 (OK) or 204 (No
>Content) response codes SHOULD be sent to indicate successful
>completion
>of the request. If the resource could not be created or modified with
>the Request-URI, an appropriate error response SHOULD be given that
>reflects the nature of the problem.
>
>If the request passes through a cache and the Request-URI identifies a
>currently cached entity, that entity MUST be removed from the cache.
>Responses to this method are not cachable.
>
>The fundamental difference between the POST and PUT requests is
>reflected in the different meaning of the Request-URI. The URI in a
>POST
>request identifies the resource that will handle the enclosed entity as
>an appendage. That resource may be a data-accepting process, a gateway
>to some other protocol, or a separate entity that accepts annotations.
>In contrast, the URI in a PUT request identifies the entity enclosed
>with the request -- the user agent knows what URI is intended and the
>server MUST NOT attempt to apply the request to some other resource. If
>the server desires that the request be applied to a different URI, it
>MUST send a 301 (Moved Permanently) response; the user agent MAY then
>make its own decision regarding whether or not to redirect the request.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 54]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>A single resource MAY be identified by many different URIs. For
>example,
>an article may have a URI for identifying "the current version" which
>is
>separate from the URI identifying each particular version. In this
>case,
>a PUT request on a general URI may result in several other URIs being
>defined by the origin server.
>
>For compatibility with HTTP/1.0 applications, all PUT requests MUST
>include a valid Content-Length header field unless the server is known
>to be HTTP/1.1 compliant. When sending a PUT request to an HTTP/1.1
>server, a client MUST use a valid Content-Length or the "chunked"
>Transfer-Encoding. The server SHOULD respond with a 400 (bad request)
>message if it cannot determine the length of the request message's
>content, or with 411 (length required) if it wishes to insist on
>receiving a valid Content-Length.
>
>The actual method for determining how the resource entity is placed,
>and
>what happens to its predecessor, is defined entirely by the origin
>server.
>
>PUT requests must obey the entity transmission requirements set out in
>section 13.4.1.
>
>
>13.6 DELETE
>The DELETE method requests that the origin server delete the resource
>identified by the Request-URI. This method MAY be overridden by human
>intervention (or other means) on the origin server. The client cannot
>be
>guaranteed that the operation has been carried out, even if the status
>code returned from the origin server indicates that the action has been
>completed successfully. However, the server SHOULD not indicate success
>unless, at the time the response is given, it intends to delete the
>resource or move it to an inaccessible location.
>
>A successful response SHOULD be 200 (OK) if the response includes an
>entity describing the status, 202 (Accepted) if the action has not yet
>been enacted, or 204 (No Content) if the response is OK but does not
>include an entity.
>
>If the request passes through a cache and the Request-URI identifies a
>currently cached entity, that entity MUST be removed from the cache.
>Responses to this method are not cachable.
>
>
>13.7 TRACE
>The TRACE method is used to invoke a remote, application-layer
>loop-back
>of the request message.  The final recipient of the request SHOULD
>reflect the message received back to the client as the entity body of a
>200 (OK) response.  The final recipient is either the origin server or
>the first proxy or gateway to receive a Max-Forwards value of zero (0)
>in the request (see section 18.32).  A TRACE request MUST NOT include
>an
>entity.
>
>TRACE allows the client to see what is being received at the other end
>of the request chain and use that data for testing or diagnostic
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 55]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>information.  The value of the Via header field (section 18.47) is of
>particular interest, since it acts as a trace of the request chain. 
>Use
>of the Max-Forwards header field allows the client to limit the length
>of the request chain, which is useful for testing a chain of proxies
>forwarding messages in an infinite loop.
>
>If successful, the response SHOULD contain the entire request message
>in
>the entity body, with a Content-Type of "message/http",
>"application/http", or "text/plain".  Responses to this method MUST NOT
>be cached.
>
>
>14 Access Authentication
>HTTP provides a simple challenge-response authentication mechanism
>which
>MAY be used by a server to challenge a client request and by a client
>to
>provide authentication information. It uses an extensible, case-
>insensitive token to identify the authentication scheme, followed by a
>comma-separated list of attribute-value pairs which carry the
>parameters
>necessary for achieving authentication via that scheme.
>
>       auth-scheme    = token
>
>       auth-param     = token "=" quoted-string
>
>The 401 (Unauthorized) response message is used by an origin server to
>challenge the authorization of a user agent. This response MUST include
>a WWW-Authenticate header field containing at least one challenge
>applicable to the requested resource.
>
>       challenge      = auth-scheme 1*SP realm *( "," auth-param )
>
>       realm          = "realm" "=" realm-value
>       realm-value    = quoted-string
>
>The realm attribute (case-insensitive) is required for all
>authentication schemes which issue a challenge. The realm value (case-
>sensitive), in combination with the canonical root URL of the server
>being accessed, defines the protection space. These realms allow the
>protected resources on a server to be partitioned into a set of
>protection spaces, each with its own authentication scheme and/or
>authorization database. The realm value is a string, generally assigned
>by the origin server, which may have additional semantics specific to
>the authentication scheme.
>
>A user agent that wishes to authenticate itself with a server--usually,
>but not necessarily, after receiving a 401 or 411 response--MAY do so
>by
>including an Authorization header field with the request. The
>Authorization field value consists of credentials containing the
>authentication information of the user agent for the realm of the
>resource being requested.
>
>       credentials    = basic-credentials
>                      | auth-scheme 0#auth-param
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 56]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>The domain over which credentials can be automatically applied by a
>user
>agent is determined by the protection space. If a prior request has
>been
>authorized, the same credentials MAY be reused for all other requests
>within that protection space for a period of time determined by the
>authentication scheme, parameters, and/or user preference. Unless
>otherwise defined by the authentication scheme, a single protection
>space cannot extend outside the scope of its server.
>
>If the server does not wish to accept the credentials sent with a
>request, it SHOULD return a 401 (Unauthorized) response. The response
>MUST include a WWW-Authenticate header field containing the (possibly
>new) challenge applicable to the requested resource and an entity
>explaining the refusal.
>
>The HTTP protocol does not restrict applications to this simple
>challenge-response mechanism for access authentication. Additional
>mechanisms MAY be used, such as encryption at the transport level or
>via
>message encapsulation, and with additional header fields specifying
>authentication information. However, these additional mechanisms are
>not
>defined by this specification.
>
>Proxies MUST be completely transparent regarding user agent
>authentication. That is, they MUST forward the WWW-Authenticate and
>Authorization headers untouched, and MUST NOT cache the response to a
>request containing Authorization.
>
>HTTP/1.1 allows a client to pass authentication information to and from
>a proxy via the Proxy-Authenticate and Proxy-Authorization headers.
>
>
>14.1 Basic Authentication Scheme
>The "basic" authentication scheme is based on the model that the user
>agent must authenticate itself with a user-ID and a password for each
>realm. The realm value should be considered an opaque string which can
>only be compared for equality with other realms on that server. The
>server will service the request only if it can validate the user-ID and
>password for the protection space of the Request-URI. There are no
>optional authentication parameters.
>
>Upon receipt of an unauthorized request for a URI within the protection
>space, the server SHOULD respond with a challenge like the following:
>
>       WWW-Authenticate: Basic realm="WallyWorld"
>
>where "WallyWorld" is the string assigned by the server to identify the
>protection space of the Request-URI.
>
>To receive authorization, the client sends the user-ID and password,
>separated by a single colon (":") character, within a base64  encoded
>string in the credentials.
>
>       basic-credentials = "Basic" SP basic-cookie
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 57]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       basic-cookie   = <base64 [7] encoding of user-pass,
>                        except not limited to 76 char/line>
>
>       user-pass = userid ":" password
>
>       userid    = [ token ]
>
>       password  = *TEXT
>
>If the user agent wishes to send the user-ID "Aladdin" and password
>"open sesame", it would use the following header field:
>
>       Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
>
>The basic authentication scheme is a non-secure method of filtering
>unauthorized access to resources on an HTTP server. It is based on the
>assumption that the connection between the client and the server can be
>regarded as a trusted carrier. As this is not generally true on an open
>network, the basic authentication scheme should be used accordingly. In
>spite of this, clients SHOULD implement the scheme in order to
>communicate with servers that use it.
>
>
>14.2 Digest Authentication Scheme
>The "digest" authentication scheme is [currently described in an
>expired
>Internet-Draft, and this description will have to be improved to
>reference a new draft or include the old one].
>
>
>15 Content Negotiation
>A generic resource has multiple entities associated with it, all of
>which are representations of the content of the resource.  Content
>negotiation is the process of selecting the best representation when a
>GET or HEAD request is made on the generic resource.  HTTP/1.1 has
>provisions for two kinds of content negotiation: opaque negotiation and
>transparent negotiation.
>
>With opaque negotiation, the selection of the best representation is
>done by an algorithm located at the origin server, and unknown to the
>proxies and user agents involved.  Selection is based on the contents
>of
>particular header fields in the request message, or on other
>information
>pertaining to the request, like the network address of the sending
>client.  A typical example of opaque negotiation would be the selection
>of a text/html response in a particular language based on the contents
>of the Accept-Language request header field.  A disadvantage of opaque
>negotiation is that the request headers may not always contain enough
>information to allow for selection.  If the Accept header
>
>        Accept: text/*: q=0.3, text/html, */*: q=0.5
>
>is sent in a request on a generic resource which has a video/mpeg and a
>video/quicktime representation, the selection algorithm in the origin
>server will either have to make a default choice, or return an error
>response which allows the user to decide on further actions.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 58]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>With transparent negotiation, the selection of the best representation
>is done by a distributed algorithm which can perform computation steps
>in the origin server, in proxies, or in the user agent.  Transparent
>negotiation guarantees that, if the user agent supports the transparent
>negotiation algorithm and is correctly configured, the request will
>always correctly yield either the video/mpeg representation, the
>video/quicktime representation, or an error message indicating that the
>resource cannot be displayed by the user agent.
>
>
>15.1  Negotiation Facilities Defined in this Specification
>This specification defines all protocol facilities for opaque
>negotiation, but does not define the distributed algorithm for
>transparent negotiation.  This specification only defines the basic
>facilities (Vary, Alternates, Accept) in the core protocol allowing
>requests on transparently negotiated resources to be correctly handled
>by HTTP/1.1 caches.  All other information about transparent content
>negotiation is found in a separate document[29].
>
>If a generic resource is opaquely negotiated, successful responses to
>requests on the resource will always include a Vary header.  If a
>generic resource is transparently negotiated, successful responses to
>requests on the resource will always include an Alternates header.  If
>a
>successful response contains an Alternates header, it will also always
>contain a Content-Location header.  A future specification may allow a
>combination of opaque and transparent negotiation that would lead to
>the
>inclusion of both a Vary header and an Alternates header in a response.
>
>
>16 Caching in HTTP
>The World Wide Web is a distributed system, and so its performance can
>be improved by the use of caches. These caches are typically placed at
>proxies and in the clients themselves. The HTTP/1.1 protocol includes a
>number of elements intended to make caching work as well as possible.
>Because these elements are inextricable from other aspects of the
>protocol, and because they interact with each other, it is useful to
>describe the basic caching design of HTTP separately from the detailed
>descriptions of methods, headers, response codes, etc.
>
>
>16.1 Semantic Transparency
>Requirements for performance, availability, and disconnected operation
>require us to be able to relax the goal of semantic transparency. The
>HTTP/1.1 protocol allows origin servers, caches, and clients to
>explicitly reduce transparency when necessary. However, because non-
>transparent operation may confuse non-expert users, and may be
>incompatible with certain server applications (such as those for
>ordering merchandise), the protocol requires that transparency may not
>be relaxed
>
>  .  without an explicit protocol-level request (when relaxed by client
>     or origin server)
>  .  without a means for warning the end user (when relaxed by cache or
>     client)
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 59]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>Therefore, the HTTP/1.1 protocol provides these important elements:
>
>  1. Protocol features that provide full semantic transparency when
>this
>     is desired by all parties.
>  2. Protocol features that allow an origin server or end-user client
>to
>     explicitly request and control non-transparent operation.
>  3. Protocol features that allow a cache to attach warnings to
>     responses that do not preserve semantic transparency.
>A basic principle is that it must be possible for the clients to detect
>any potential breakdown of semantic transparency.
>
>Caching would be useless if it did not significantly improve
>performance. The goal of caching in HTTP/1.1 is to eliminate the need
>to
>send requests in many cases, and to eliminate the need to send full
>responses in many other cases. The former reduces the number of network
>round-trips required for many operations; we use an "expiration"
>mechanism for this purpose (see section 16.1.2). The latter reduces
>network bandwidth requirements; we use a "validation" mechanism for
>this
>purpose (see section 13.3).
>
>The server, cache, or client implementer may be faced with design
>decisions not explicitly discussed in this specification. If a decision
>may affect semantic transparency, the implementer ought to err on the
>side of maintaining transparency unless a careful and complete analysis
>shows significant benefits in breaking transparency.
>
>
>16.1.1 Cache Correctness
>If the cache can communicate with the origin-server, then a correct
>cache MUST respond to a request with a response that meets all the
>following conditions:
>
>  1. its end-to-end headers (see section 16.4.1) and entity-body value
>     are equivalent to what the server would have returned for that
>     request if the resource had not been modified since the response
>     was cached. This may be accomplished by revalidating the response
>     with the origin server, if is not fresh.
>  2. it is "fresh enough" (see section 16.1.2). In the default case,
>     this means it meets the least restrictive freshness requirement of
>     the client, server, and cache (see section 18.10); if the origin-
>     server so specifies, it is the freshness requirement of the
>origin-
>     server alone.
>  3. it includes a warning if the freshness demand of the client or the
>     origin-server is violated (see section 16.1.5 and 18.48).
>  4. it is the most up-to-date response appropriate to the request the
>     cache has seen (see section 16.2.6, 16.2.8, and 16.13).
>If the cache can not communicate with the origin server, then a correct
>cache SHOULD respond as above if the response can be correctly served
>from the cache; if not it MUST return an error or warning indicating
>that there was a communication.
>
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 60]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>16.1.2 Cache-control Mechanisms
>The basic cache mechanisms in HTTP/1.1 (server-specified expiration
>times and validators) are implicit directives to caches. In some cases,
>a server or client may need to provide explicit directives to the HTTP
>caches. We use the Cache-Control header for this purpose.
>
>The Cache-Control header allows a client or server to transmit a
>variety
>of directives in either requests or responses. These directives
>typically override the default caching algorithms. As a general rule,
>if
>there is any apparent conflict between header values, the most
>restrictive interpretation should be applied (that is, the one that is
>most likely to preserve semantic transparency). However, in some cases,
>Cache-Control directives are explicitly specified as weakening semantic
>transparency (for example, "max-stale" or "public").
>
>The Cache-Control directives are described in detail in section 18.10.
>
>
>16.1.3 Warnings
>Whenever a cache returns a response that is not semantically
>transparent, it must attach a warning to that effect, using a Warning
>response header. This warning allows clients and user agents to take
>appropriate action.
>
>Warnings may be used for other purposes, both cache-related and
>otherwise. The use of a warning, rather than an error status code,
>distinguish these responses from true failures.
>
>Warnings are always cachable, because they never weaken the
>transparency
>of a response. This means that warnings can be passed to HTTP/1.0
>caches
>without danger; such caches will simply pass the warning along as a
>entity header in the response.
>
>Warnings are assigned numbers between 0 and 99. This specification
>defines the code numbers and meanings of each warning, allowing a
>client
>or cache to take automated action in some (but not all) cases.
>
>Warnings also carry a warning message text in any appropriate natural
>language (perhaps based on the client's Accept headers), and an
>optional
>indication of what language and character set are used.
>
>Multiple warning messages may be attached to a response (either by the
>origin server or by a cache), including multiple warnings with the same
>code number. For example, a server may provide the same warning with
>texts in both English and Basque.
>
>When multiple warnings are attached to a response, it may not be
>practical or reasonable to display all of them to the user. This
>version
>of HTTP does not specify strict priority rules for deciding which
>warnings to display and in what order, but does suggest some
>heuristics.
>
>The Warning header and the currently defined warnings are described in
>section 18.48.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 61]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>16.1.4 Explicit User Agent Warnings
>Many user agents make it possible for users to override the basic
>caching mechanisms. For example, the user agent may allow the user to
>specify that cached entities (even explicitly stale ones) are never
>validated. Or the user agent might habitually add "Cache-Control: max-
>stale=3600" or "Cache-Control: reload" to every request. We recognize
>that there may be situations which require such overrides, although
>user
>agents SHOULD NOT default to any behavior contrary to the HTTP/1.1
>specification. That is, the user should have to explicitly request
>either non-transparent behavior, or behavior that results in abnormally
>ineffective caching.
>
>If the user has overridden the basic caching mechanisms, the user agent
>should explicitly indicate to the user whenever this results in the
>display of information that might not meet the server's transparency
>requirements (in particular, if the displayed entity is known to be
>stale). Since the protocol normally allows the user agent to determine
>if responses are stale or not, this indication need only be displayed
>when this actually happens. The indication need not be a dialog box; it
>could be an icon (for example, a picture of a rotting fish) or some
>other visual indicator.
>
>If the user has overridden the caching mechanisms in a way that would
>abnormally reduce the effectiveness of caches, the user agent should
>continually display an indication (for example, a picture of currency
>in
>flames) so that the user does not inadvertently consume excess
>resources
>or suffer from excessive latency.
>
>
>16.1.5 Exceptions to the Rules and Warnings
>In some cases, the operator of a cache may choose to configure it to
>return stale responses even when not requested by clients. This
>decision
>not be made lightly, but may be necessary for reasons of availability
>or
>performance, especially when the cache is poorly connected to the
>origin
>server. Whenever a cache returns a stale response, it MUST mark it as
>such (using a Warning header). This allows the client software to alert
>the user that there may be a potential problem.
>
>It also allows the user to take steps to obtain a firsthand or fresh
>response, if the user so desires. For this reason, a cache MUST NOT
>return a stale response if the client explicitly requests a first-hand
>or fresh one, unless it is impossible to comply.
>
>
>16.1.6 Client-controlled Behavior
>While the origin server (and to a lesser extent, intermediate caches,
>by
>their contribution to the age of a response) are the primary source of
>expiration information, in some cases the client may need to control a
>cache's decision about whether to return a cached response without
>validating it. Clients do this using several directives of the Cache-
>Control header.
>
>A client's request may specify the maximum age it is willing to accept
>for an unvalidated response; specifying a value of zero forces the
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 62]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>cache(s) to revalidate all responses. A client may also specify the
>minimum time remaining before a response expires. Both of these options
>increase constraints on the behavior of caches, and so cannot decrease
>semantic transparency.
>
>A client may also specify that it will accept stale responses, up to
>some maximum amount of staleness. This loosens the constraints on the
>caches, and so may violate semantic transparency, but may be necessary
>to support disconnected operation, or high availability in the face of
>poor connectivity.
>
>
>16.2 Expiration Model
>
>16.2.1 Server-Specified Expiration
>HTTP caching works best when caches can entirely avoid making requests
>to the origin server. The primary mechanism for avoiding requests is
>for
>an origin server to provide an explicit expiration time in the future,
>indicating that a response may be used to satisfy subsequent requests.
>In other words, a cache can return a fresh response without first
>contacting the server.
>
>Our expectation is that servers will assign future explicit expiration
>times to responses in the belief that the entity is not likely to
>change, in a semantically significant way, before the expiration time
>is
>reached. This normally preserves semantic transparency, as long as the
>server's expiration times are carefully chosen.
>
>If an origin server wishes to force a semantically transparent cache to
>validate every request, it may assign an explicit expiration time in
>the
>past. This means that the response is always stale, and so the cache
>SHOULD validate it before using it for subsequent requests.  (See
>section 18.10.4 for a more restrictive way to force revalidation).
>
>  Note that a firsthand response MUST always be returned to the
>  requesting client, independent of its expiration time, unless the
>  connection to the client is lost.
>
>If an origin server wishes to force any HTTP/1.1 cache, no matter how
>it
>is configured, to validate every request, it should use the "must-
>revalidate" Cache-Control directive.  See section 18.10.
>
>Servers specify explicit expiration times using either the Expires
>header, or the max-age directive of the Cache-Control header.
>
>
>16.2.2 Limitations on the Effect of Expiration Times
>An expiration time cannot be used to force a user agent to refresh its
>display or reload a resource entity; its semantics apply only to
>caching
>mechanisms, and such mechanisms need only check a resource's expiration
>status when a new request for that resource is initiated.
>
>User agents often have history mechanisms, such as "Back" buttons and
>history lists, which can be used to redisplay an entity retrieved
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 63]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>earlier in a session. By default, an expiration time does not apply to
>history mechanisms. If the entity is still in storage, a history
>mechanism should display it even if the entity has expired, unless the
>user has specifically configured the agent to refresh expired history
>documents.
>
>
>16.2.3 Heuristic Expiration
>Since origin servers do not always provide explicit expiration times,
>HTTP caches typically assign heuristic expiration times, employing
>algorithms that use other header values (such as the Last-Modified
>time)
>to estimate a plausible expiration time. The HTTP/1.1 specification
>does
>not provide specific algorithms, but does impose worst-case constraints
>on their results. Since heuristic expiration times may compromise
>semantic transparency, they should be used cautiously, and we encourage
>origin servers to provide explicit expiration times as much as
>possible.
>
>
>16.2.4 Age Calculations
>In order to know if a cached entry is fresh, a cache needs to know if
>its age exceeds its freshness lifetime. We discuss how to calculate the
>latter in section 0; this section describes how to calculate the age of
>a response or cache entry.
>
>In this discussion, we use the term "now" to mean "the current value of
>the clock at the host performing the calculation." All HTTP
>implementations, but especially origin servers and caches, should use
>NTP [RFC1305] or some similar protocol to synchronize their clocks to a
>globally accurate time standard.
>
>Also note that HTTP/1.1 requires origin servers to send a Date header
>with every response, giving the time at which the response was
>generated. We use the term "date_value" to denote a representation of
>the value of the Date header, in a form appropriate for arithmetic
>operations.
>
>HTTP/1.1 uses the "Age" response header to help convey age information
>between caches. The Age header value is the sender's estimate of the
>amount of time since the response was generated at the origin server.
>In
>the case of a cached response that has been revalidated with the origin
>server, the Age value is based on the time of revalidation, not of the
>original response.
>
>In essence, the Age value is the sum of the time that the response has
>been resident in each of the caches along the path from the origin
>server, plus the amount of time it has been in transit along network
>paths.
>
>We use the term "age_value" to denote a representation of the value of
>the Age header, in a form appropriate for arithmetic operations.
>
>An response's age can be calculated in two entirely independent ways:
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 64]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  1. now - date_value, if the local clock is reasonably well
>     synchronized to the origin server's clock. If the result is
>     negative, this is replaced by zero.
>  2. age_value, if all of the caches along the response path implement
>     HTTP/1.1.
>Given that we have two independent ways to compute the age of a
>response
>when it is received, we can combine these as
>
>       corrected_received_age = max(now - date_value, age_value)
>
>and as long as we have either nearly synchronized clocks or
>all-HTTP/1.1
>paths, one gets a reliable (conservative) result.
>
>Note that this correction is applied at each HTTP/1.1 cache along the
>path, so that if there is an HTTP/1.0 cache in the path, the correct
>received age is computed as long as the receiving cache's clock is
>nearly in sync. We don't need end-to-end clock synchronization
>(although
>it is good to have), and there is no explicit clock synchronization
>step.
>
>Because of network-imposed delays, some significant interval may pass
>from the time that a server generates a response, and the time it is
>received at the next outbound cache or client. If uncorrected, this
>delay could result in improperly low ages.
>
>Because the request that resulted in the returned Age value must have
>been initiated prior to that Age value's generation, we can correct for
>delays imposed by the network by recording the time at which the
>request
>was initiated. Then, when an Age value is received, it MUST be
>interpreted relative to the time the request was initiated, not the
>time
>that the response was received. This algorithm results in conservative
>behavior no matter how much delay is experienced. So, we compute:
>
>      corrected_initial_age = corrected_received_age
>                            + (now - request_time)
>
>where "request_time" is the time (according to the local clock) when
>the
>request that elicited this response was sent.
>
>Summary of age calculation algorithm, when a cache receives a response:
>
>      /*
>       * age_value
>       *      is the value of Age: header received by the cache with
>       *              this response.
>       * date_value
>       *      is the value of the origin server's Date: header
>       * request_time
>       *      is the (local) time when the cache made the request
>       *              that resulted in this cached response
>       * response_time
>       *      is the (local) time when the cache received the
>       *              response
>       * now
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 65]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       *      is the current (local) time
>       */
>      apparent_age = max(0, now - date_value);
>      corrected_received_age = max(apparent_age, age_value);
>      response_delay = now - request_time;
>      corrected_initial_age = corrected_received_age + response_delay;
>      resident_time = now - response_time;
>      current_age   = corrected_initial_age + resident_time;
>
>When a cache sends a response, it must add to the corrected_initial_age
>the amount of time that the response was resident locally. It must then
>transmit this total age, using the Age header, to the next recipient
>cache.
>
>  Note that a client can usually tell if a response is firsthand by
>  comparing the Date to its local request-time, and hoping that the
>  clocks are not badly skewed.
>
>
>
>
>16.2.5 Expiration Calculations
>In order to decide whether a response is fresh or stale, we need to
>compare its freshness lifetime to its age. The age is calculated as
>described in section 16.2.4; this section describes how to calculate
>the
>freshness lifetime, and to determine if a response has expired.
>
>We use the term "expires_value" to denote a representation of the value
>of the Expires header, in a form appropriate for arithmetic operations.
>We use the term "max_age_value" to denote an appropriate representation
>of the number of seconds carried by the max-age directive of the Cache-
>Control header in a response (see section 18.11).
>
>The max-age directive takes priority over Expires, so if max-age is
>present in a response, the calculation is simply:
>
>      freshness_lifetime = max_age_value
>
>Otherwise, if Expires is present in the response, the calculation is:
>
>      freshness_lifetime = expires_value - date_value
>
>Note that neither of these calculations is vulnerable to clock skew,
>since all of the information comes from the origin server.
>
>If neither Expires nor Cache-Control max-age appears in the response,
>and the response does not include other restrictions on caching, the
>cache MAY compute a freshness lifetime using a heuristic. This
>heuristic
>is subject to certain limitations; the minimum value may be zero, and
>the maximum value MUST be no more than 24 hours.
>
>Also, if the response does have a Last-Modified time, the heuristic
>expiration value SHOULD be no more than some fraction of the interval
>since that time.  A typical setting of this fraction might be 10%.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 66]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>The calculation to determine if a response has expired is quite simple:
>
>      response_is_fresh = (freshness_lifetime > current_age)
>
>
>16.2.6 Scope of Expiration
>HTTP/1.1's expiration model is that as soon as any variant of a URI
>becomes stale, all variants becomes stale as well.  Thus, "freshness"
>applies to all the variants of URI, rather than any particular variant.
>Dates and expires etc. apply to any cached variant that a proxy might
>have with a URI and not just the one particular entity.
>
>Editor's note: This restriction may be dropped in the next draft; there
>are still discussions about whether this restriction is needed.
>
>
>16.2.7 Disambiguating Expiration Values
>Because expiration values are assigned optimistically, it is possible
>that two caches may contain fresh values for the same resource that are
>different.
>
>If a client performing a retrieval receives a non-firsthand response
>for
>a resource entity  that was already fresh in its own cache, and the
>Date
>header in its existing cache entry is newer than the Date on the new
>response, then the client MAY ignore the response. If so, it MAY retry
>the request with a "Cache-Control: max-age=0" directive (see section
>18.10), to force a check with the origin server.
>
>If a cache that is pooling cached responses from other caches sees two
>fresh responses for the same resource entity with different validators,
>it SHOULD use the one with the newer Date header.
>
>
>16.2.8 Disambiguating Multiple Responses
>Because a client may be receiving responses via multiple paths, so that
>some responses flow through one set of caches and other responses flow
>through a different set of caches, a client may receive responses in an
>order different from that in which the origin server generated them. We
>would like the client to use the most recently generated response, even
>if older responses are still apparently fresh.
>
>Neither the entity tag nor the expiration value can impose an ordering
>on responses, since it is possible that a later response intentionally
>carries an earlier expiration time. However, the HTTP/1.1 specification
>requires the transmission of Date headers on every response, and the
>Date values are ordered to a granularity of one second.
>
>If a client performs a request for a resource entity that it already
>has
>in its cache, and the response it receives contains a Date header that
>appears to be older than the one it already has in its cache, then the
>client SHOULD repeat the request unconditionally, and include
>
>       Cache-Control: max-age=0
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 67]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>to force any intermediate caches to validate their copies directly with
>the origin server, or
>
>      Cache-Control: no-cache
>
>to force any intermediate caches to obtain a new copy from the origin
>server. This prevents certain paradoxes arising from the use of
>multiple
>caches.
>
>If the Date values are equal, then the client may use either response
>(or may, if it is being extremely prudent, request a new response).
>Servers MUST NOT depend on clients being able to choose
>deterministically between responses generated during the same second,
>if
>their expiration times overlap.
>
>
>16.3 Validation Model
>When a cache has a stale entry  that it would like to use as a response
>to a client's request, it first has to check with the origin server (or
>possibly an intermediate cache with a fresh response) to see if its
>cached entry is still usable. We call this "validating" the cache
>entry.
>Since we do not want to have to pay the overhead of retransmitting the
>full response if the cached entry is good, and we do not want to pay
>the
>overhead of an extra round trip if the cached entry is invalid, the
>HTTP/1.1 protocol supports the use of conditional methods.
>
>The key protocol features for supporting conditional methods are those
>concerned with "cache validators." When an origin server generates a
>full response, it attaches some sort of validator to it, which is kept
>with the cache entry. When a client (end-user or cache) makes a
>conditional request for a resource for which it has a cache entry, it
>includes the associated validator in the request.
>
>The server then checks that validator against the current validator for
>the resource entity, and, if they match, it responds with a special
>status code (usually, "304 Not Modified") and no entity body.
>Otherwise,
>it returns a full response (including entity body). Thus, we avoid
>transmitting the full response if the validator matches, and we avoid
>an
>extra round trip if it does not match.
>
>  Note: the comparison functions used to decide if validators match
>  are defined in section 16.3.3.
>
>In HTTP/1.1, a conditional request looks exactly the same as a normal
>request for the same resource, except that it carries a special header
>(which includes the validator) that implicitly turns the method
>(usually, GET) into a conditional.
>
>The protocol includes both positive and negative senses of cache-
>validating conditions. That is, it is possible to request either that a
>method be performed if and only if the validators match, or if and only
>if the validators do not match.
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 68]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  Note: a response that lacks a cache validator may still be cached,
>  and served from cache until it expires, unless this is explicitly
>  prohibited by a Cache-Control directive. However, a cache cannot do
>  a conditional retrieval if it does not have a cache validator for
>  the entity, which means it will not be refreshable after it
>  expires.
>
>
>
>
>16.3.1 Last-modified Dates
>In HTTP/1.0, the only cache validator is the Last-Modified time carried
>by a response. Clients validate entities using the If-Modified-Since
>header. In simple terms, a cache entry is considered to be valid if the
>actual resource entity has not been modified since the original
>response
>was generated.
>
>
>16.3.2 Entity Tags
>HTTP/1.1 introduces the possibility of using an "opaque" validator,
>called an "entity tag," for situations where the Last-Modified date is
>not appropriate. This may include server implementations where it is
>not
>convenient to store modification dates, or where the one-second
>resolution of HTTP date values is insufficient, or where the origin
>server wishes to avoid certain paradoxes that may arise from the use of
>modification dates.
>
>An entity tag is simply a string of octets whose internal structure is
>not known to clients or caches. Caches store entity tags and return
>them
>when making conditional requests. Also, when a cache receives a
>conditional request for a resource for which it has a fresh cache
>entry,
>it may compare entity tags using strict octet-equality. Otherwise,
>entity tags have no semantic value to clients or caches.
>
>To preserve compatibility with HTTP/1.0 clients and caches, and because
>the Last-Modified date may be useful for purposes other than cache
>validation, HTTP/1.1 servers SHOULD send Last-Modified whenever
>feasible.
>
>The headers used to convey entity tags are described in sections Error!
>Reference source not found., Error! Reference source not found., 18.26,
>and 18.46.
>
>
>16.3.3 Weak and Strong Validators
>Since both origin servers and caches will compare two validator values
>to decide if they represent the same or different resource entities,
>one
>normally would expect that if the resource entity  (the entity body or
>any entity headers) changes in any way, then the associated validator
>would change as well. If this is true, then we call this validator a
>"strong validator."
>
>However, there may be cases when a server prefers to change the
>validator only on semantically significant changes, and not when
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 69]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>insignificant aspects of the resource entity change. A validator that
>does not always change when the resource changes is a "weak validator."
>
>One can think of a strong validator as one that changes whenever the
>bits of an entity changes, while a weak value changes whenever the
>meaning of an entity changes. Alternatively, one can think of a strong
>validator as part of an identifier for a specific entity, while a weak
>validator is part of an identifier for a set of semantically equivalent
>entities.
>
>  Note: One example of a strong validator is an integer that is
>  incremented in stable storage every time an entity is changed.
>
>  An entity's modification time, if represented with one-second
>  resolution, could be a weak validator, since it is possible that
>  the resource entity  may be modified twice during a single second.
>
>Entity tags are normally "strong validators," but the protocol provides
>a mechanism to tag an entity tag as "weak."
>
>A "use" of a validator is either when a client generates a request and
>includes the validator in a validating header field, or when a server
>compares two validators.
>
>Strong validators are usable in any context. Weak validators are only
>usable in contexts that do not depend on exact equality of an entity.
>For example, either kind is usable for a conditional GET of a full
>entity. However, only a strong validator is usable for a sub-range
>retrieval, since otherwise the client may end up with an internally
>inconsistent entity body.
>
>The only function that the HTTP/1.1 protocol defines on validators is
>comparison. There are two validator comparison functions, depending on
>whether the comparison context allows the use of weak validators or
>not:
>
>  .  The strong comparison function: in order to be considered equal,
>     both validators must be identical in every way, and neither may be
>     weak.
>  .  The weak comparison function: in order to be considered equal,
>both
>     validators must be identical in every way, but either or both of
>     them may be tagged as "weak" without affecting the result.
>The weak comparison function SHOULD be used for simple (non-subrange)
>GET requests. The strong comparison function MUST be used in all other
>cases.
>
>An entity tag is strong unless it is explicitly tagged as weak. Section
>16.3 gives the syntax for entity tags.
>
>A Last-Modified time, when used as a validator in a request, is
>implicitly weak unless it is possible to deduce that it is strong,
>using
>the following rules:
>
>  .  The validator is being compared by an origin server to the actual
>     current validator for the entity and,
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 70]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  .  That origin server reliably knows that the associated entity did
>     not change twice during the second covered by the presented
>     validator.
>or
>
>  .  The validator is about to be used by a client in an If-Modified-
>     Since or If-Unmodified-Since header, because the client has a
>cache
>     entry for the associated entity, and
>  .  That cache entry includes a Date value, which gives the time when
>     the origin server generated the original response, and
>  .  The presented Last-Modified time is at least 60 seconds before the
>     Date value.
>or
>
>  .  The validator is being compared by an intermediate cache to the
>     validator stored in its cache entry for the entity, and
>  .  That cache entry includes a Date value, which gives the time when
>     the origin server generated the original response, and
>  .  The presented Last-Modified time is at least 60 seconds before the
>     Date value.
>This method relies on the fact that if two different responses were
>generated by the origin server during the same second, but both had the
>same Last-Modified time, then at least one of those responses would
>have
>a Date value equal to its Last-Modified time. The arbitrary 60-second
>limit guards against the possibility that the Date and Last-Modified
>values are generated from different clocks, or at somewhat different
>times during the preparation of the response. An implementation may use
>a value larger than 60 seconds, if it is believed that 60 seconds is
>too
>short.
>
>If a client wishes to perform a sub-range retrieval on a value for
>which
>it has only a Last-Modified time and no opaque validator, it may do
>this
>only if the Last-Modified time is strong in the sense described here.
>
>A cache or origin server receiving a cache-conditional request, other
>than a full-body GET request, must use the strong comparison function
>to
>evaluate the condition.
>
>These rules allow HTTP/1.1 caches and clients to safely perform sub-
>range retrievals on values that have been obtained from HTTP/1.0
>servers.
>
>
>16.3.4 Rules for When to Use Entity Tags and Last-modified Dates
>We adopt a set of rules and recommendations for origin servers,
>clients,
>and caches regarding when various validator types should be used, and
>for what purposes.
>
>HTTP/1.1 origin servers:
>
>  .  SHOULD send an entity tag validator unless performance
>     considerations support the use of weak entity tags, or unless it
>is
>     unfeasible to send a strong entity tag.
>  .  MAY send a weak entity tag instead of a strong one.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 71]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  .  MAY send no entity tag if it is not feasible to generate one.
>  .  SHOULD send a Last-Modified value if it is feasible to send one,
>     unless the risk of a breakdown in semantic transparency that could
>     result from using this date in an If-Modified-Since header would
>     lead to serious problems.
>In other words, the preferred behavior for an HTTP/1.1 origin server is
>to send both a strong entity tag and a Last-Modified value.
>
>In order to be legal, a strong entity tag MUST change whenever the
>associated entity value changes in any way. A weak entity tag SHOULD
>change whenever the associated entity  changes in a semantically
>significant way.
>
>  Note: in order to provide semantically transparent caching, an
>  origin server should avoid reusing a specific strong entity tag
>  value for two different resource entities, or reusing a specific
>  weak entity tag value for two semantically different instances of a
>  resource entity.  Cache entries may persist for arbitrarily long
>  periods, regardless of expiration times, so it may be inappropriate
>  to expect that a cache will never again attempt to validate an
>  entry using a validator that it obtained at some point in the past.
>
>HTTP/1.1 clients:
>
>  .  If an entity tag has been provided by the origin server, MUST use
>     that entity tag in any cache-conditional request (using If-Match
>or
>     If-NoneMatch).
>  .  If only a Last-Modified value has been provided by the origin
>     server, SHOULD use that value in non-subrange cache-conditional
>     requests (using If-Modified-Since).
>  .  If only a Last-Modified value has been provided by an HTTP/1.0
>     origin server, MAY use that value in subrange cache-conditional
>     requests (using If-Unmodified-Since:). The user agent should
>     provide a way to disable this, in case of difficulty.
>  .  If both an entity tag and a Last-Modified value have been provided
>     by the origin server, SHOULD use both validators in cache-
>     conditional requests. This allows both HTTP/1.0 and HTTP/1.1
>caches
>     to respond appropriately.
>An HTTP/1.1 cache, upon receiving a request, MUST use the most
>restrictive validator when deciding whether the client's cache entry
>matches the cache's own cache entry. This is only an issue when the
>request contains both an entity tag and a last-modified-date validator
>(If-Modified-Since or If-Unmodified-Since).
>
>  A note on rationale: The general principle behind these rules is
>  that HTTP/1.1 servers and clients should transmit as much non-
>  redundant information as is available in their responses and
>  requests. HTTP/1.1 systems receiving this information will make the
>  most conservative assumptions about the validators they receive.
>
>  HTTP/1.0 clients and caches will ignore entity tags. Generally,
>  last-modified values received or used by these systems will support
>  transparent and efficient caching, and so HTTP/1.1 origin servers
>  should provide Last-Modified values. In those rare cases where the
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 72]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  use of a Last-Modified value as a validator by an HTTP/1.0 system
>  could result in a serious problem, then HTTP/1.1 origin servers
>  should not provide one.
>
>
>16.3.5 Non-validating Conditionals
>The principle behind entity tags is that only the service author knows
>the semantics of a resource well enough to select an appropriate cache
>validation mechanism, and the specification of any validator comparison
>function more complex than byte-equality would open up a can of worms.
>Thus, comparisons of any other headers (except Last-Modified, for
>compatibility with HTTP/1.0) are never used for purposes of validating
>a
>cache entry.
>
>
>16.4 Constructing Responses From Caches
>The purpose of an HTTP cache is to store information received in
>response to requests, for use in responding to future requests. In many
>cases, a cache simply returns the appropriate parts of a response to
>the
>requester. However, if the cache holds a cache entry based on a
>previous
>response, it may have to combine parts of a new response with what is
>held in the cache entry.
>
>
>16.4.1 End-to-end and Hop-by-hop Headers
>For the purpose of defining the behavior of caches and non-caching
>proxies, we divide HTTP headers into two categories:
>
>  .  End-to-end headers, which must be transmitted to the ultimate
>     recipient of a request or response. End-to-end headers in
>responses
>     must be stored as part of a cache entry and transmitted in any
>     response formed from a cache entry.
>  .  Hop-by-hop headers, which are meaningful only for a single
>     transport-level connection, and are not stored by caches or
>     forwarded by proxies.
>The following HTTP/1.1 headers are hop-by-hop headers:
>
>  .  Connection
>  .  Keep-Alive
>  .  Upgrade
>  .  Public
>  .  Proxy-Authenticate
>  .  Transfer-Encoding
>All other headers defined by HTTP/1.1 are end-to-end headers.
>
>Hop-by-hop headers introduced in future versions of HTTP MUST be listed
>in a Connection header, as described in section 18.11.
>
>
>16.4.2 Non-modifiable Headers
>Some features of the HTTP/1.1 protocol, such as Digest Authentication,
>depend on the value of certain end-to-end headers. A cache or non-
>caching proxy SHOULD NOT modify an end-to-end header unless the
>definition of that header requires or specifically allows that.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 73]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>A cache or non-caching proxy MUST NOT modify any of the following
>fields
>in a request or response, nor may it add any of these fields if not
>already present:
>
>  .  Content-Type
>  .  Content-Encoding
>  .  Content-Length
>  .  Expires
>  .  Last-Modified
>  .  Content-Range
>  .  Content-Location
>  Warning: unnecessary modification of end-to-end headers may cause
>  authentication failures if stronger authentication mechanisms are
>  introduced in later versions of HTTP. Such authentication
>  mechanisms may rely on the values of header fields not listed here.
>
>
>
>
>16.4.3 Combining Headers
>When a cache makes a validating request to a server, and the server
>provides a 304 Not Modified response, the cache must construct a
>response to send to the requesting client.  The cache uses the entity-
>body stored in the cache entry as the entity-body of this outgoing
>response. It uses the end-to-end headers from the incoming response,
>not
>from the cache entry.  Unless it decides to remove the cache entry, it
>must also replace the end-to-end headers stored with the cache entry
>with those received in the incoming response.
>
>In other words, the complete set of end-to-end headers received in the
>incoming response overrides all end-to-end headers stored with the
>cache
>entry. The cache may add Warning headers (see section 18.48) to this
>set.
>
>A cache MUST preserve the order of all headers as received in an
>incoming response.
>
>These rule allows an origin server to completely control the response
>seen by the client of a cache when the cache revalidates an entry, and
>may be necessary for preserving semantic transparency or for certain
>kinds of security mechanisms or future extensions.
>
>
>16.4.4 Combining Byte Ranges
>A response may transfer only a subrange of the bytes of an entity,
>either because the request included one or more Range specifications,
>or
>because a connection was broken prematurely. After several such
>transfers, a cache may have received several ranges of the same entity.
>
>If a cache has a stored non-empty set of subranges for an entity, and
>an
>incoming response transfers another subrange, the cache MAY combine the
>new subrange with the existing set if both the following conditions are
>met:
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 74]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  .  Both the incoming response and the cache entry must have a cache
>     validator.
>  .  The two cache validators must match using the strong comparison
>     function (see section 16.3.3).
>If either requirement is not meant, the cache must use only the most
>recent partial response (based on the Date values transmitted with
>every
>response, and using the incoming response if these values are equal or
>missing), and must discard the other partial information.
>
>
>16.5 Caching and Generic Resources
>Generic resources interacts with caching in several ways:
>
>  .  A generic resource (one subject to content negotiation) may be
>     bound to more than one entity. Each of these entities is called a
>     "variant" of the resource.
>  .  The request-URI may be only one part of the cache key.
>
>16.5.1 Vary Header Use
>Origin servers may respond to requests for generic resources use the
>Vary header (see section 18.46 for a full description) to inform the
>cache which header fields of the request were used to select the
>variant
>returned in the response. A cache can use that response to reply to a
>subsequent request only if the two requests not only specify the same
>URI, but also have the same value for all headers specified in the Vary
>response-header.
>
>The Vary header may also inform the cache that the variant was selected
>using criteria not limited to the request headers; in this case, the
>response MUST NOT be used in a reply to a subsequent request except if
>the cache relays the new request to the origin server in a conditional
>request, and the origin server responds with 304 (Not Modified) and
>includes the same variant-ID (see 13.8.3).
>
>
>16.5.2 Alternates Header Use
>The Alternates header is present in the HTTP/1.1 to enable caching of
>entities from the planned content negotiation facilities. If a cache
>receives an Alternates header in a response from the origin server (and
>implement these planned facilities), it should act as if the response
>carried a "Vary:{accept-headers}" header.  This means that the response
>may be returned in reply to a subsequent request with Accept-* headers
>identical to those in the current request.
>
>
>16.5.3 Variant-ID Use
>If an origin server chooses to use the variant-ID mechanism, it assigns
>a variant-ID (see section 7.12) to each distinct resource entity
>(variant). This assignment can only be made by the origin server. It
>then returns the appropriate variant-ID with each response that applies
>to a specific resource entity (variant), using the ETag header (see
>Error! Reference source not found.).
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 75]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>When sending an entity derived from a particular variant in a response,
>an origin server SHOULD include a variant-ID identifying the variant in
>the ETag header (see section Error! Reference source not found.).  This
>variant-ID can be used for cache replacement and in conditional
>requests
>on the generic resource. When a cache receives a successful response
>with a variant-ID, it SHOULD use this information to replace any
>existing cache entries for the same variant of the corresponding URI.
>That is, it forms a cache key using the URI of the request and the
>variant-ID of the response. If this key matches the key of an existing
>cache entry, it SHOULD replace the existing entry with the new response
>(subject to all of the other rules on caching). See section Error!
>Reference source not found. for more details on update.
>
>When a cache performs a conditional request on a generic resource, and
>it has one or more cache entries for the resource that include variant-
>IDs, the cache MUST transmit the (cache-validator, variant-ID) tuples
>in
>the conditional request, using the variant-set mechanism (see section
>7.13). This tells the server which variants are currently in the
>requester's cache.
>
>  The client MAY choose to transmit only a subset of the (cache-
>  validator, variant-ID) tuples corresponding to its cache entries
>  for this resource.
>
>When a server receives a conditional request that includes a variant-
>set, and the server is able to reply with an appropriate variant
>(either
>because it is the origin server, or because it is an intermediate cache
>that can properly implement the variant selection algorithm), once it
>has selected the variant it should examine the elements of the supplied
>variant-set. If one of these matches the variant-ID of the selected
>variant, and if the cache validators match, the server SHOULD reply
>with
>a 304 (Not Modified) response, including the variant-ID of the selected
>variant. Otherwise, the server should reply as if the request were
>unconditional.
>
>The server may optionally use the variant-set information in its
>selection algorithm. For example, if the selection algorithm yields
>several variants with equal preference, and one of these is already in
>the requester's cache, the server could select that variant and avoid
>an
>extra data transfer. This is a performance optimization; otherwise, the
>variant-selection mechanism is orthogonal to the variant-ID mechanism.
>
>
>16.6 Shared and Non-Shared Caches
>For reasons of security and privacy, it is necessary to make a
>distinction between "shared" and "non-shared" caches. A non-shared
>cache
>is one that is accessible only to a single user. Accessibility in this
>case SHOULD be enforced by appropriate security mechanisms. All other
>caches are considered to be "shared." Other sections of this
>specification place certain constraints on the operation of shared
>caches in order to prevent loss of privacy or failure of access
>controls
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 76]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>16.7 Selecting a Cached Response
>When a cache receives a request it tries to see if it has a cached
>response appropriate for that request, using the matching rules in this
>section. If such a response exists, then the cache can decide if it is
>fresh enough (using the expiration model in section 16.1.2 and the
>freshness requirements of client and origin-server expressed in the
>Cache-Control headers of the request and cached response) to return in
>reply to the request.
>If on a cache lookup there are two or more fresh entries that appear to
>match the request, then the one with the most recent Date value MUST be
>used.
>16.7.1 Plain Resources
>If the cached response was for a plain resource (that is, the response
>includes no Vary or Alternates headers), it matches if the Request-URI
>of the request matches the Request-URI of the of the request that
>caused
>the cached response to be stored. Request-URIs match if their canonical
>forms (see section 7.2.3) are equal.
>
>16.7.2 Generic Resources
>If the cached response was for a generic resource (that is, the
>response
>includes Vary, or Alternates headers), it matches if the Request-URI of
>the request matches the Request-URI of the request that caused the
>cached response to be stored, and the selecting request header field
>values of the request match those of the request that caused the cached
>response to be stored. (See section 18.46 on Vary, which defines the
>canonical form for selecting request headers and the matching rules for
>them.)
>If the response contains "Vary: {other}", then the selecting request
>header field values for its request are defined as never matching a set
>of request headers.
>
>16.8 Errors or Incomplete Response Cache Behavior
>A cache that receives an incomplete response (for example, with fewer
>bytes of data than specified in a Content-length: header) may store the
>response. However, the cache MUST treat this as a partial response.
>Partial responses may be combined as described in section 16.4.4; the
>result might be a full response or might still be partial. A cache MUST
>NOT return a partial response to a client without explicitly marking it
>as such, using the 206 (Partial Content) status code. A cache MUST NOT
>return a partial response using a status code of 200 (OK).
>
>A cache that receives a response with a zero-length Entity-body and no
>explicit indication that the correct length is zero (such as "Content-
>Length: 0") MUST NOT  store the response. The same rule applies to a
>response of any length received without an explicit length indication
>if
>the transport connection was terminated in any unusual way.
>
>If a cache receives a response carrying Retry-After header (see section
>18.40), it may either forward this response to the requesting client,
>or
>act as if the server failed to respond. In the latter case, it MAY
>return a previously received response, although it MUST follow all of
>the rules applying to stale responses. In particular, it MUST NOT
>override the "must-revalidate" Cache-Control directive (see section
>18.10).
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 77]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>16.8.1 Caching and Status Codes
>A response received with a status code of 200 or 206 may be stored by a
>cache and used in reply to a subsequent request, subject to the
>expiration mechanism, unless a Cache-control directive prohibits
>caching.
>
>A response received with any other status code MUST NOT be returned in
>a
>reply to a subsequent request unless it carries at least one of the
>following:
>
>  .  an Expires header
>  .  a max-age Cache-control directive
>  .  a must-revalidate Cache-control directive
>  .  a public Cache-control directive
>
>16.8.2 Handling of Retry-After
>If a cache receives a response carrying a Retry-After header (see
>section 18.40), it may either forward this response to the requesting
>client, or act as if the server failed to respond.  In the latter case,
>it MAY return a previously received response, although it MUST follow
>all of the rules applying to stale responses.  In particular, it MUST
>NOT override the "must-revalidate" Cache-Control directive (see section
>18.10).
>
>
>16.9 Side Effects of GET and HEAD
>Unless the origin server explicitly prohibits the caching of their
>responses, the application of GET and HEAD methods to any resources
>SHOULD NOT have side effects that would lead to erroneous behavior if
>these responses are taken from a cache. They may still have side
>effects, but a cache is not required to consider such side effects in
>its caching decisions. Caches are always expected to observe an origin
>server's explicit restrictions on caching.
>
>We note one exception to this rule: since some applications have
>traditionally used GETs and HEADs with query URLs (those containing a
>"?" in the rel_path part) to perform operations with significant side
>effects, caches MUST NOT treat responses to such URLs as fresh unless
>the server provides an explicit expiration time.
>
>This specifically means that responses from HTTP/1.0 servers for such
>URIs should not be taken from a cache.
>
>See section 19.2 for related information.
>
>
>16.10 Invalidation After Updates or Deletions
>The effect of certain methods at the origin server may cause one or
>more
>existing cache entries to become non-transparently invalid. That is,
>although they may continue to be "fresh," they do not accurately
>reflect
>what the origin server would return for a new request.
>
>There is no way for the HTTP protocol to guarantee that all such cache
>entries are marked invalid.  For example, the request that caused the
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 78]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>change at the origin server may not have gone through the proxy where a
>cache entry is stored.  However, several rules help reduce the
>likelihood of erroneous behavior.
>
>In this section, the phrase "invalidate an entity" means that the cache
>should either remove all instances of that entity from its storage, or
>should mark these as "invalid" and in need of a mandatory revalidation
>before they can be returned in response to a subsequent request.
>
>Some HTTP methods invalidate a single entity.  This is either the
>entity
>referred to by the Request-URI, or by the Location or Content-Location
>response headers (if present).  These methods are:
>
>  .  PUT
>  .  DELETE
>  .  POST
>In order to prevent denial of service attacks, an invalidation based on
>the URI in a Location or Content-Location header MUST only be performed
>if the host part is the same as in the Request-URI.
>
>
>16.11 Write-Through Mandatory
>All methods that may be expected to cause modifications to the origin
>server's resources MUST be written through to the origin server. This
>currently includes all methods except for GET and HEAD. A cache MUST
>NOT
>reply to such a request from a client before having transmitted the
>request to the inbound server, and having received a corresponding
>response from the inbound server.
>
>The alternative (known as "write-back" or "copy-back" caching) is not
>allowed in HTTP/1.1, due to the difficulty of providing consistent
>updates and the problems arising from server, cache, or network failure
>prior to write-back.
>
>
>16.12  Generic Resources and HTTP/1.0 Proxy Caches
>If the correct handling of responses from a generic resource (Section
>15) by HTTP/1.0 proxy caches in the response chain is important,
>HTTP/1.1 origin servers can include the following Expires (Section
>18.22) response header in all responses from the generic resource:
>
>     Expires: Thu, 01 Jan 1980 00:00:00 GMT
>
>If this Expires header is included, the server should usually also
>include a Cache-Control header for the benefit of HTTP/1.1 caches, for
>example
>
>     Cache-Control: max-age=604800
>
>which overrides the freshness lifetime of zero seconds specified by the
>included Expires header.
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 79]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>16.13 Cache Replacement
>If a new cacheable response (see sections 18.10.2, 16.2.6, 16.2.8 and
>16.8) is received from a plain resource while any existing responses
>for
>the same resource are cached, the cache MUST NOT return any of those
>older responses to any  future requests for the resource.
>
>  Note: a new response that has an older Date header value than
>  existing cached responses is not cacheable.
>
>If a new cacheable response is received from a generic resource with a
>certain variant-ID while any old responses with the same variant-ID for
>the same resource are cached, the cache MUST NOT return any of those
>old
>responses to any future requests for the resource.
>
>  Note: In some cases, this may mean that the cache chooses to delete
>  the old response(s) from cache storage to recover space. However,
>  note that there will never be a new response to signal that a
>  variant-ID is no longer in use. It is expected that the cache's
>  update heuristics will eventually cause such old responses to be
>  deleted.
>
>The cache SHOULD use the new response to reply to the current request.
>It may insert it into cache storage and may, if it meets all other
>requirements, use it to respond to any future requests that would
>previously have caused the old response to be returned. If it inserts
>the new response into cache storage it should follow the rules in
>section 16.4.3.
>
>
>16.14 Caching of Negative Responses
>Caching of negative responses has often been a significant performance
>advantage in distributed systems.  In some future draft or
>specification
>we may have more to say about negative caching.
>
>
>16.15 History Lists
>History lists as implemented in many user agents and caches are
>different.  In particular history lists SHOULD NOT try to show a
>semantically transparent view of the current state of a resource
>entity.
>Rather, a history list is meant to show exactly what the user saw at
>the
>time when the resource was retrieved .
>
>This should not be construed to prohibit the history mechanism from
>telling the user that a view may be stale.
>
>
>17 Persistent Connections
>
>17.1 Purpose
>HTTP's greatest strength and its greatest weakness has been its
>simplicity.  Prior to persistent connections, a separate TCP connection
>was established to fetch each URL, increasing the load on HTTP servers,
>and causing congestion on the Internet.   The use of inline images and
>other associated data often requires a client to make multiple requests
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 80]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>of the same server in a short amount of time.   An excellent analysis
>of
>these performance problems is available [30]; analysis and results from
>a prototype implementation are in [33], [34].
>
> Persistent HTTP connections have a number of advantages:
>
>  .  By opening and closing fewer TCP connections, CPU time is saved,
>     and memory used for TCP protocol control blocks is also saved
>  .  HTTP requests and responses can be pipe-lined on a connection.
>     Pipe-lining allows a client to make multiple requests without
>     waiting for each response, allowing a single TCP connection to be
>     used much more efficiently, with much lower elapsed time.
>  .  Network congestion is reduced by reducing the number of packets
>     caused by TCP opens, and by allowing TCP sufficient time to
>     determine the congestion state of the network.
>  .  HTTP can evolve more gracefully; since errors can be reported
>     without the penalty of closing the TCP connection. Clients using
>     future versions of HTTP might optimistically try a new feature,
>but
>     if communicating with an older server, retry with old semantics
>     after an error is reported.
>HTTP implementations SHOULD implement persistent connections.
>
>
>17.2 Overall Operation
>Persistent connections provides a mechanism by which a client and a
>server can negotiate the use of a TCP connection for an extended
>conversation. This negotiation takes place using the Connection and
>Persist header fields. Once this option has been negotiated, the client
>can make multiple HTTP requests over a single transport connection.
>
>
>17.2.1 Negotiation
>To request the use of persistent connections, a client sends a
>Connection header with a connection-token "Persist". If the server
>wishes to accept persistent connections, it will respond with the same
>connection-token. Both the client and server MUST send this connection-
>token with every request and response for the duration of the
>persistent
>connection. If either the client or the server omits the Persist token
>from the Connection header, that request becomes the last one for the
>connection.
>
>A server MUST NOT establish a persistent connection with an HTTP/1.0
>client that uses the above form of the Persist header due to problems
>with the interactions between HTTP/1.1 clients and HTTP/1.0 proxy
>servers. (See section 23.5.2.5 for more information on backwards
>compatibility with HTTP/1.0 clients.)
>
>
>17.2.2 Pipe-lining
>Clients and servers which support persistent connections MAY
>"pipe-line"
>their requests and responses. When pipe-lining, a client will send
>multiple requests without waiting for the responses. The server MUST
>then send all of the responses in the same order that the requests were
>made.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 81]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>A client MAY assume that a server supports persistent connections if
>the
>same server has accepted persistent connections within the past 24
>hours. Clients which assume persistent connections and pipeline
>immediately SHOULD be prepared to retry their connection if the first
>pipe-lined attempt fails. If a client does such a retry, it MUST NOT
>pipeline without first receiving an explicit Persist token from the
>server. Clients MUST also be prepared to resend their requests if the
>server closes the connection before sending all of the corresponding
>responses.
>
>
>17.2.3 Delimiting Entity-Bodies
>When using persistent connections, both the client and the server MUST
>mark the exact endings of transmitted entity-bodies using one of the
>following three techniques:
>
>  1. Send a Content-length field in the header with the exact number of
>     bytes in the entity-body.
>  2. Send the message using chunked Transfer Coding as described in
>     section 7.6. Chunked Transfer Coding allows the server to transmit
>     the data to the client a piece at a time while still communicating
>     an exact ending of the entity-body.
>  3. Close the transport connection after the entity body.
>Sending the Content-length is the preferred technique. Chunked encoding
>SHOULD be used when the size of the entity-body is not known before
>beginning to transmit the entity-body.  Finally, the connection MAY be
>closed and fall back to non-persistent connections, if neither 1 or 2
>are possible.
>
>Clients and servers that support persistent connections MUST correctly
>support receiving via all three techniques.
>
>
>17.3 Proxy Servers
>It is especially important that proxies correctly implement the
>properties of the Connection header field as specified in 14.2.1.
>
>The proxy server MUST negotiate persistent connections separately with
>its clients and the origin servers (or other proxy servers) that it
>connects to.  Each persistent connection applies to only one transport
>link.
>
>A proxy server MUST NOT establish a persistent connection with an
>HTTP/1.0 client.
>
>
>17.4 Interaction with Security Protocols
>It is expected that persistent connections will operate with both SHTTP
>[31] and SSL [32]. When used in conjunction with SHTTP, the SHTTP
>request is prepared normally and the persist connection-token is placed
>in the outermost request block (the one containing the "Secure"
>method).
>When used in conjunction with SSL, a SSL session is started as normal
>and the first HTTP request made using SSL contains the persistent
>connection header.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 82]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>17.5 Practical Considerations
>Servers will usually have some time-out value beyond which they will no
>longer maintain an inactive connection. Proxy servers might make this a
>higher value since it is likely that the client will be making more
>connections through the same server. The use of persistent connections
>places no requirements on the length of this time-out for either the
>client or the server.
>
>When a client or server wishes to time-out it SHOULD issue a graceful
>close on the transport connection. Clients and servers SHOULD both
>constantly watch for the other side of the transport close, and respond
>to it as appropriate. If a client or server does not detect the other
>side's close promptly it could cause unnecessary resource drain on the
>network.
>
>A client, server, or proxy MAY close the transport connection at any
>time. For example, a client MAY have started to send a new request at
>the same time that the server has decided to close the "idle"
>connection. From the server's point of view, the connection is being
>closed while it was idle, but from the client's point of view, a
>request
>is in progress.
>
>This means that clients, servers, and proxies MUST be able to recover
>from asynchronous close events. Client software SHOULD reopen the
>transport connection and retransmit the aborted request without user
>interaction. However, this automatic retry SHOULD NOT be repeated if
>the
>second request fails.
>
>Servers SHOULD always respond to at least one request per connection,
>if
>at all possible. Servers SHOULD NOT close a connection in the middle of
>transmitting a response, unless a network or client failure is
>suspected.
>
>It is suggested that clients which use persistent connections SHOULD
>limit the number of simultaneous connections that they maintain to a
>given server. A single-user client SHOULD maintain AT MOST 2
>connections
>with any server of proxy. A proxy SHOULD use up to 2*N connections to
>another server or proxy, where N is the number of simultaneously active
>users. These guidelines are intended to improve HTTP response times and
>avoid congestion of the Internet or other networks.
>
>
>18 Header Field Definitions
>This section defines the syntax and semantics of all standard HTTP/1.1
>header fields. For Entity-Header fields, both sender and recipient
>refer
>to either the client or the server, depending on who sends and who
>receives the entity.
>
>
>18.1 Accept
>The Accept request-header field can be used to specify certain media
>types which are acceptable for the response.  Accept headers can be
>used
>to indicate that the request is specifically limited to a small set of
>desired types, as in the case of a request for an in-line image.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 83]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>The field MAY be folded onto several lines and more than one occurrence
>of the field is allowed, with the semantics being the same as if all
>the
>entries had been in one field value.
>
>       Accept         = "Accept" ":" #(
>                             media-range
>                             [ ( ":" | ";" )
>
>                               range-parameter
>
>                               *( ";" range-parameter ) ]
>
>                            | extension-token )
>
>       media-range    = ( "*/*"
>                        | ( type "/" "*" )
>                        | ( type "/" subtype )
>                        ) *( ";" parameter )
>
>       range-parameter = ( "q" "=" qvalue )
>                       | extension-range-parameter
>
>       extension-range-parameter = ( token "=" token )
>
>       extension-token = token
>
>The asterisk "*" character is used to group media types into ranges,
>with "*/*" indicating all media types and "type/*" indicating all
>subtypes of that type. The range-parameter q is used to indicate the
>media type quality factor for the range, which represents the user's
>preference for that range of media types.  The default value is q=1. 
>In
>Accept headers generated by HTTP/1.1 clients, the character separating
>media-ranges from range-parameters SHOULD be a ":".  HTTP/1.1 servers
>SHOULD be tolerant of use of the ";" separator by HTTP/1.0 clients.
>
>The example
>
>       Accept: audio/*: q=0.2, audio/basic
>
>SHOULD be interpreted as "I prefer audio/basic, but send me any audio
>type if it is the best available after an 80% mark-down in quality."
>
>If no Accept header is present, then it is assumed that the client
>accepts all media types.  If Accept headers are present, and if the
>server cannot send a response which is acceptable according to the
>Accept headers, then the server SHOULD send an error response with the
>406 (not acceptable) status code, though the sending of an unacceptable
>response is also allowed.
>
>A more elaborate example is
>
>       Accept: text/plain: q=0.5, text/html,
>               text/x-dvi: q=0.8, text/x-c
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 84]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>Verbally, this would be interpreted as "text/html and text/x-c are the
>preferred media types, but if they do not exist, then send the text/x-
>dvi entity, and if that does not exist, send the text/plain entity."
>
>Media ranges can be overridden by more specific media ranges or
>specific
>media types. If more than one media range applies to a given type, the
>most specific reference has precedence. For example,
>
>       Accept: text/*, text/html, text/html;level=1, */*
>
>have the following precedence:
>
>       1) text/html;level=1
>       2) text/html
>       3) text/*
>       4) */*
>
>The media type quality factor associated with a given type is
>determined
>by finding the media range with the highest precedence which matches
>that type. For example,
>
>       Accept: text/*:q=0.3, text/html:q=0.7, text/html;level=1,
>               */*:q=0.5
>
>would cause the following values to be associated:
>
>       text/html;level=1         = 1
>       text/html                 = 0.7
>       text/plain                = 0.3
>       image/jpeg                = 0.5
>       text/html;level=3         = 0.7
>
>  Note: A user agent MAY be provided with a default set of quality
>  values for certain media ranges. However, unless the user agent is
>  a closed system which cannot interact with other rendering agents,
>  this default set SHOULD be configurable by the user.
>
>
>
>
>18.2 Accept-Charset
>The Accept-Charset request-header field can be used to indicate what
>character sets are acceptable for the response. This field allows
>clients capable of understanding more comprehensive or special-purpose
>character sets to signal that capability to a server which is capable
>of
>representing documents in those character sets. The ISO-8859-1
>character
>set can be assumed to be acceptable to all user agents.
>
>       Accept-Charset = "Accept-Charset" ":"
>
>                 1#( charset [ ";" "q" "=" qvalue ] )
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 85]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>Character set values are described in section 7.4. Each charset  may be
>given an associated quality value which represents the user's
>preference
>for that charset.  The default value is q=1.  An example is
>
>       Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
>
>If no Accept-Charset header is present, the default is that any
>character set is acceptable. If an Accept-Charset header is present,
>and
>if the server cannot send a response which is acceptable according to
>the Accept-Charset header, then the server SHOULD send an error
>response
>with the 406 (not acceptable) status code, though the sending of an
>unacceptable response is also allowed.
>
>
>
>
>18.3 Accept-Encoding
>The Accept-Encoding request-header field is similar to Accept, but
>restricts the content-coding values (18.13) which are acceptable in the
>response.
>
>       Accept-Encoding  = "Accept-Encoding" ":"
>                                 #( content-coding )
>
>An example of its use is
>
>       Accept-Encoding: compress, gzip
>
>If no Accept-Encoding header is present in a request, the server MAY
>assume that the client will accept any content coding. If an Accept-
>Encoding header is present, and if the server cannot send a response
>which is acceptable according to the Accept-Encoding  header, then the
>server SHOULD send an error response with the 406 (not acceptable)
>status code.
>
>
>18.4 Accept-Language
>The Accept-Language request-header field is similar to Accept, but
>restricts the set of natural languages that are preferred as a response
>to the request.
>
>       Accept-Language  = "Accept-Language" ":"
>                          1#( language-range [ ";" "q" "=" qvalue ] )
>
>       language-range   = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) )
>                        | "*" )
>
>Each language-range MAY be given an associated quality value which
>represents an estimate of the user's comprehension of the languages
>specified by that range.  The quality value defaults to "q=1" (100%
>comprehension).For example,
>
>       Accept-Language: da, en-gb;q=0.8, en;q=0.7
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 86]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>would mean: "I prefer Danish, but will accept British English (with 80%
>comprehension) and other types of English(with 70% comprehension)."  A
>language-range matches a language-tag if it exactly equals the tag, or
>if it exactly equals a prefix (a sub-sequence starting at the first
>character) of the tag such that the first tag character following the
>prefix is "-".  The special range "*", if present in the
>Accept-Language
>field, matches every tag not matched by any other ranges present in the
>Accept-Language field.
>
>  Note: This use of a prefix matching rule does not imply that
>  language tags are assigned to languages in such a way that it is
>  always true that if a user understands a language with a certain
>  tag, then this user will also understand all languages with tags
>  for which this tag is a prefix.  The prefix rule simply allows the
>  use of prefix tags if this is the case.
>
>The language quality factor assigned to a language-tag by the Accept-
>Language field is the quality value of the longest language-range in
>the
>field that matches the language-range.  If no language-range in the
>field matches the tag, the language quality factor assigned is 0. If no
>Accept-Language header is present in the request, the server SHOULD
>assume that all languages are equally acceptable.  If an
>Accept-Language
>header is present, then all languages which are assigned a quality
>factor greater than 0 are acceptable.  If the server cannot generate a
>response for an audience capable of understanding at least one
>acceptable language, it can send a response that uses one or more un-
>accepted languages.
>
>It may be contrary to the privacy expectations of the user to send an
>Accept-Language header with the complete linguistic preferences of the
>user in every request.  For a discussion of this issue, see section
>19.7.
>
>  Note: As intelligibility is highly dependent on the individual
>  user, it is recommended that client applications make the choice of
>  linguistic preference available to the user. If the choice is not
>  made available, then the Accept-Language header field MUST NOT be
>  given in the request.
>
>
>
>
>18.5 Accept-Ranges
>In some cases, a client may want to know if the server accepts range
>requests using a certain range unit. The server may indicate its
>acceptance of range requests for a resource entity  by providing this
>header in a response for that resource:
>
>       Accept-Ranges     = "Accept-Ranges" ":" acceptable-ranges
>
>       acceptable-ranges = 1#range-unit | "none"
>
>Origin servers that accept byte-range requests MAY send
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 87]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       Accept-Ranges: bytes
>
>but are not required to do so.  Clients MAY generate byte-range
>requests
>without having received this header for the plain resource involved,
>but
>the server MAY ignore such requests.
>
>Origin servers that do not accept any kind of range request for a plain
>resource MAY send
>
>       Accept-Ranges: none
>
>to advise the client not to attempt a range request.
>
>
>18.6 Age
>Caches transmit age values using:
>
>        Age = "Age" ":" age-value
>
>        age-value = delta-seconds
>
>Age values are non-negative decimal integers, representing time in
>seconds.
>
>If a cache receives a value larger than the largest positive integer it
>can represent, or if any of its age calculations overflows, it MUST
>transmit an Age header with a value of 2147483648 (2^31).  Otherwise,
>HTTP/1.1 caches MUST send an Age header in every response.  Caches
>SHOULD use a representation with at least 31 bits of range..
>
>
>18.7 Allow
>The Allow entity-header field lists the set of methods supported by the
>resource identified by the Request-URI. The purpose of this field is
>strictly to inform the recipient of valid methods associated with the
>resource. An Allow header field MUST be present in a 405 (method not
>allowed) response. The Allow header field is not permitted in a request
>using the POST method, and thus SHOULD be ignored if it is received as
>part of a POST entity.
>
>       Allow          = "Allow" ":" 1#method
>
>Example of use:
>
>       Allow: GET, HEAD, PUT
>
>This field cannot prevent a client from trying other methods. However,
>the indications given by the Allow header field value SHOULD be
>followed. The actual set of allowed methods is defined by the origin
>server at the time of each request.
>
>The Allow header field MAY be provided with a PUT request to recommend
>the methods to be supported by the new or modified resource. The server
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 88]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>is not required to support these methods and SHOULD include an Allow
>header in the response giving the actual supported methods.
>
>A proxy MUST NOT modify the Allow header field even if it does not
>understand all the methods specified, since the user agent MAY have
>other means of communicating with the origin server.
>
>The Allow header field does not indicate what methods are implemented
>at
>the server level. Servers MAY use the Public response header field
>(section 18.37) to describe what methods are implemented on the server
>as a whole.
>
>
>18.8 Alternates
>The Alternates response-header field is used by origin servers to
>signal
>that the resource identified by the current request has the capability
>to send different responses depending on the accept headers in the
>request message.  This has an important effect on cache management,
>particularly for caching proxies which service a diverse set of user
>agents.  This effect is covered in section 18.46.
>
>       Alternates           = "Alternates" ":" opaque-field
>
>       opaque-field         = field-value
>
>The Alternates header is included into HTTP/1.1 to make HTTP/1.1 caches
>compatible with a planned content negotiation mechanism.  HTTP/1.1
>allows a future content negotiation standard to define the format of
>the
>Alternates header field-value, as long as the defined format satisfies
>the general rules in section 18.8.
>
>To ensure compatibility with future experimental or standardized
>software, caching HTTP/1.1 clients MUST treat all Alternates headers in
>a response as synonymous to the following Vary header:
>
>         Vary: {accept-headers}
>
>and follow the caching rules associated with the presence of this Vary
>header, as covered in Section 18.46.  HTTP/1.1 allows origin servers to
>send Alternates headers under experimental conditions.
>
>
>18.9 Authorization
>A user agent that wishes to authenticate itself with a server--usually,
>but not necessarily, after receiving a 401 response--MAY do so by
>including an Authorization request-header field with the request. The
>Authorization field value consists of credentials containing the
>authentication information of the user agent for the realm of the
>resource being requested.
>
>       Authorization  = "Authorization" ":" credentials
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 89]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>HTTP access authentication is described in section 14. If a request is
>authenticated and a realm specified, the same credentials SHOULD be
>valid for all other requests within this realm.
>
>When a shared cache (see section 16.6) receives a request containing an
>Authorization field, it MUST NOT return the corresponding response as a
>reply to any other request, unless one of the following specific
>exceptions holds:
>
>  1. If the response includes the "proxy-revalidate" Cache-Control
>     directive, the cache MAY use that response in replying to a
>     subsequent request, but a proxy cache MUST first revalidate it
>with
>     the origin server, using the request headers from the new request
>     to allow the origin server to authenticate the new request.
>  2. If the response includes the "must-revalidate" Cache-Control
>     directive, the cache MAY use that response in replying to a
>     subsequent request, but all caches MUST first revalidate it with
>     the origin server, using the request headers from the new request
>     to allow the origin server to authenticate the new request.
>  3. If the response includes the "public" Cache-Control directive, it
>     may be returned in reply to any subsequent request.
>
>18.10 Cache-Control
>The Cache-Control general-header field is used to specify directives
>that MUST be obeyed by all caching mechanisms along the
>request/response
>chain. The directives specify behavior intended to prevent caches from
>adversely interfering with the request or response. .  These directives
>typically override the default caching algorithms.  Cache directives
>are
>unidirectional in that the presence of a directive in a request does
>not
>imply that the same directive should be given in the response.
>
>Cache directives must be passed through by a proxy or gateway
>application, regardless of their significance to that application,
>since
>the directives may be applicable to all recipients along the
>request/response chain. It is not possible to specify a cache-directive
>for a specific cache.
>
>       Cache-Control   = "Cache-Control" ":" 1#cache-directive
>
>       cache-directive = "public"
>                       | "private" [ "=" <"> 1#field-name <"> ]
>                       | "no-cache" [ "=" <"> 1#field-name <"> ]
>                       | "no-store"
>                       | "no-transform"
>                       | "must-revalidate"
>                       | "proxy-revalidate"
>                       | "only-if-cached"
>                       | "max-age" "=" delta-seconds
>                       | "max-stale" "=" delta-seconds
>                       | "min-fresh" "=" delta-seconds
>                       | "min-vers" "=" HTTP-Version
>
>When a directive appears without any 1#field-name parameter, the
>directive applies to the entire request or response. When such a
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 90]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>directive appears with a 1#field-name parameter, it applies only to the
>named field or fields, and not to the rest of the request or response.
>This mechanism supports extensibility; implementations of future
>versions of the HTTP protocol may apply these directives to header
>fields not defined in HTTP/1.1.
>
>The cache-control directives can be broken down into these general
>categories:
>
>  .  Restrictions on what is cachable; these may only be imposed by the
>     origin server.
>  .  Restrictions on what may be stored by a cache; these may be
>imposed
>     by either the origin server or the end-user client.
>  .  Modifications of the basic expiration mechanism; these may be
>     imposed by either the origin server or the end-user client.
>  .  Controls over cache revalidation and reload; these may only be
>     imposed by an end-user client.
>  .  Restrictions on the number of times a cache entry may be used, and
>     related demographic reporting mechanisms.
>  .  Miscellaneous restrictions
>Caches never add or remove Cache-Control directives to requests or
>responses.
>
>Check: is this true?
>
>
>18.10.1 Cache-Control Restrictions on What is Cachable
>Unless specifically constrained by a Cache-Control directive, a caching
>system may always store a successful response (see section 16.8) as a
>cache entry, may return it without validation if it is fresh, and may
>return it after successful validation. If there is neither a cache
>validator nor an explicit expiration time associated with a response,
>we
>do not expect it to be cached, but certain caches may violate this
>expectation (for example, when little or no network connectivity is
>available).  A client can usually detect that such a response was taken
>from a cache by comparing the Date header to the current time.
>
>  Note that some HTTP/1.0 caches are known to violate this
>  expectation without providing any Warning.
>
>However, in some cases it may be inappropriate for a cache to retain a
>resource entity, or to return it in response to a subsequent request.
>This may be because absolute semantic transparency is deemed necessary
>by the service author, or because of security or privacy
>considerations.
>Certain Cache-Control directives are therefore provided so that the
>server can indicate that certain resource entities, or portions
>thereof,
>may not be cached regardless of other considerations.
>
>Note that section 18.8 normally prevents a shared cache from saving and
>returning a response to a previous request if that request included an
>Authorization header.
>
>The following Cache-Control response directives add or remove
>restrictions on what is cachable:
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 91]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>public 
>  Overrides the restriction in section 18.8 that prevents a shared
>  cache from saving and returning a response to a previous request if
>  that request included an Authorization header. However, any other
>  constraints on caching still apply.
>
>private
>  Indicates that all or part of the response message is intended for a
>  single user and MUST NOT be cached by a shared cache. This allows an
>  origin server to state that the specified parts of the response are
>  intended for only one user and are not a valid response for requests
>  by other users. A private (non-shared) cache may ignore this
>  directive.
>  Note: This usage of the word "private" only controls where the
>  response may be cached, and cannot ensure the privacy of the
>  message content. Note in particular that HTTP/1.0 caches will not
>  recognize or obey this directive.
>
>
>no-cache
>  indicates that all or partof the response message MUST NOT be cached
>  anywhere. This allows an origin server to prevent caching even by
>  caches that have been configured to return stale responses to client
>  requests.
>  Note: HTTP/1.0 caches will not recognize or obey this directive.
>
>TBS: precedence relations between public, private, and no-cache.
>
>
>18.10.2 What May be Stored by Caches
>The "no-store" directive applies to the entire message, and may be sent
>either in a response or in a request. If sent in a request, a cache
>MUST
>NOT store any part of either this request or any response to it. If
>sent
>in a response, a cache MUST NOT store any part of either this response
>or the request that elicited it. This directive applies to both non-
>shared and shared caches.
>
>Even when this directive is associated with a response, users may
>explicitly store such a response outside of the caching system (e.g.,
>with a "Save As" dialog). History buffers may store such responses as
>part of their normal operation.
>
>The purpose of this directive is to meet the stated requirements of
>certain users and service authors who are concerned about accidental
>releases of information via unanticipated accesses to cache data
>structures. While the use of this directive may improve privacy in some
>cases, we caution that it is NOT in any way a reliable or sufficient
>mechanism for ensuring privacy. In particular, HTTP/1.0 caches will not
>recognize or obey this directive, malicious or compromised caches may
>not recognize or obey this directive, and communications networks may
>be
>vulnerable to eavesdropping.
>
>The "min-vers" directive applies to the entire message, and may be sent
>either in a response or in a request. If sent in a request, a cache
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 92]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>whose HTTP version number is less than the specified version MUST NOT
>store any part of either this request or any response to it. If sent in
>a response, a cache whose HTTP version number is less than the
>specified
>version MUST NOT store any part of either this response or the request
>that elicited it, nor may any cache transmit a stored (non-firsthand)
>copy of the response to any client with a lower HTTP version number.
>This directive applies to both non-shared and shared caches, and is
>made
>mandatory to allow for future protocol extensions that may affect
>caching.
>
>  Note that the lowest version that can be sensibly included in a
>  "min-vers" directive is HTTP/1.1, since HTTP/1.0 caches do not obey
>  it.
>
>
>18.10.3 Modifications of the Basic Expiration Mechanism
>The expiration time of a resource entity may be specified by the origin
>server using the Expires header (see section 18.22). Alternatively, it
>may be specified using the "max-age" directive in a response.
>
>If a response includes both an Expires header and a max-age directive,
>the max-age directive overrides the Expires header, even if the Expires
>header is more restrictive. This rule allows an origin server to
>provide, for a given response, a longer expiration time to an HTTP/1.1
>(or later) cache than to an HTTP/1.0 cache. This may be useful if
>certain HTTP/1.0 caches improperly calculate ages or expiration times,
>perhaps due to synchronized clocks.
>
>Other directives allow an end-user client to modify the basic
>expiration
>mechanism, making it either stricter or looser. These directives may be
>specified on a request:
>
>
>max-age
>  Indicates that the client is willing to accept a response whose age
>  is no greater than the specified time in seconds. Unless "max-stale"
>  is also included, the client is not willing to accept a stale
>  response. This directive overrides any policy of the cache.
>
>min-fresh
>  Indicates that the client is willing to accept a response whose
>  freshness lifetime is no less than its current age plus the specified
>  time in seconds. That is, the client wants a that response will still
>  be fresh for at least the specified number of seconds.
>
>max-stale
>  Indicates that the client is willing to accept a response that has
>  exceeded its expiration time by no more than the specified number of
>  seconds. If a cache returns a stale response in response to such a
>  request, it MUST mark it as stale using the Warning header.
>  Note that HTTP/1.0 caches will ignore these directives.
>
>If a cache returns a stale response, either because of a max-stale
>directive on a request, or because the cache is configured to override
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 93]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>the expiration time of a response, the cache MUST attach a Warning
>header to the stale response, using Warning 10 (Response is stale).
>
>
>18.10.4 Cache Revalidation and Reload Controls
>Sometimes an end-user client may want or need to insist that a cache
>revalidate its cache entry with the origin server (and not just with
>the
>next cache along the path to the origin server), or to reload its cache
>entry from the origin server. End-to-end revalidation may be necessary
>if either the cache or the origin server has overestimated the
>expiration time of the cached response. End-to-end reload may be
>necessary if the cache entryhas become corrupted for some reason, and
>the fact that its validator is up-to-date is irrelevant.
>
>End-to-end revalidation may be requested either when the client does
>not
>have its own local cached copy, in which case we call it "unspecified
>end-to-end revalidation", or when the client does have a local cached
>copy, in which case we call it "specific end-to-end revalidation."
>
>The client can specify these three kinds of action using Cache-Control
>request directives:
>
>
>End-to-end reload
>  The request includes "Cache-Control: no-cache" or, for compatibility
>  with HTTP/1.0 clients, "Pragma: no-cache". No field names may be
>  included with the "no-cache" directive in a request. The server MUST
>  NOT use a cached copy when responding to such a request.
>
>Specific end-to-end revalidation
>  The request includes "Cache-Control: max-age=0", which forces each
>  cache along the path to the origin server to revalidate its own
>  entry, if any, with the next cache or server. The initial request
>  includes a cache-validating conditional with the client's current
>  validator.
>
>Unspecified end-to-end revalidation
>  The request includes "Cache-Control: max-age=0", which forces each
>  cache along the path to the origin server to revalidate its own
>  entry, if any, with the next cache or server. The initial request
>  does not include a cache-validating conditional; the first cache
>  along the path (if any) that holds a cache entry for this resource
>  includes a cache-validating conditional with its current validator.
>  Note that HTTP/1.0 caches will ignore these directives, except
>  perhaps for "Pragma: no-cache".
>
>When an intermediate cache is forced, by means of a "max-age=0"
>directive, to revalidate its own cache entry, and the client has
>supplied its own validator in the request, the supplied validator may
>differ from the validator currently stored with the cache entry. In
>this
>case, the cache may use either validator in making its own request
>without affecting semantic transparency.
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 94]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>However, the choice of validator may affect performance. The best
>approach is for the intermediate cache to use its own validator when
>making its request. If the server replies with 304 (Not Modified), then
>the cache should return its now validated copy to the client with a 200
>(OK) response. If the server replies with a new Entity-body and cache
>validator, however, the intermediate cache should compare the returned
>validator with the one provided in the client's request, using the
>strong comparison function. If the client's validator is equal to the
>origin server's, then the intermediate cache simply returns 304 (Not
>Modified). Otherwise, it returns the new Entity-body with a 200 (OK)
>response.
>
>If a request includes the "no-cache" directive, it should not include
>"min-fresh", "max-stale", or "max-age".
>
>In some cases, such as times of extremely poor network connectivity, a
>client may want a cache to return only those responses that it
>currently
>has stored, and not to reload or revalidate with the origin server. To
>do this, the client may include the "only-if-cached" directive in a
>request. If it receives this directive, a cache SHOULD either respond
>using a cached entry that is consistent with the other constraints of
>the request, or respond with a 504 (Gateway Timeout) status. However,
>if
>a group of caches is being operated as a unified system with good
>internal connectivity, such a request MAY be forwarded within that
>group
>of caches.
>
>Because a cache may be configured to ignore a server's specified
>expiration time, and because a client request may include a max-stale
>directive, which has a similar effect, the protocol also includes a
>mechanism for the origin server to require revalidation of a cache
>entry
>on any subsequent use. When the "must-revalidate" directive is present
>in a response received by a cache, that cache MUST NOT use the entry
>after it becomes stale to respond to a subsequent request without first
>revalidating it with the origin server. (I.e., the cache must do an
>end-
>to-end revalidation every time, if, based solely on the origin server's
>Expires or max-age value, the cached response is stale.)
>
>The "must-revalidate" directive is necessary to support reliable
>operation for certain protocol features. In all circumstances an
>HTTP/1.1 cache MUST obey the "must-revalidate" directive; in
>particular,
>if the cache cannot reach the origin server for any reason, it MUST
>generate a 504 (Gateway Timeout) response. Note that HTTP/1.0 caches
>will ignore this directive.
>
>Servers should send the "must-revalidate" directive if and only if
>failure to revalidate a request on the entity could result in incorrect
>operation, such as a silently unexecuted financial transaction.
>Recipients MUST NOT take any automated action that violates this
>directive, and MUST NOT automatically provide an unvalidated copy of
>the
>entity if revalidation fails.
>
>Although this is not recommended, user agents operating under severe
>connectivity constraints may violate this directive but, if so, MUST
>explicitly warn the user that an unvalidated response has been
>provided.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 95]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>The warning MUST be provided on each unvalidated access, and SHOULD
>require explicit user confirmation.
>
>The "proxy-revalidate" directive has the same meaning as the "must-
>revalidate" directive, except that it does not apply to user-agent
>caches.
>
>
>18.10.5 Miscellaneous Restrictions
>In certain circumstances, an intermediate cache (proxy) may find it
>useful to convert the encoding of an entity body. For example, a proxy
>might use a compressed content-coding to transfer the body to a client
>on a slow link.
>
>Because end-to-end authentication of entity bodies and/or entity
>headers
>relies on the specific encoding of these values, such transformations
>may cause authentication failures. Therefore, an intermediate cache
>MUST
>NOT change the encoding of an entity body if the response includes the
>"no-transform" directive.
>
>  Note: the use of hop-by-hop compression in conjunction with Range
>  retrievals may require additional specification in a subsequent
>  draft.
>
>
>18.11 Connection
>HTTP version 1.1 provides a new request and response header field
>called
>"Connection". This header field allows the client and server to specify
>options which should only exist over that particular connection and
>MUST
>NOT be communicated by proxies over further connections. The connection
>header field MAY have multiple tokens separated by commas (referred to
>as connection-tokens).
>
>HTTP version 1.1 proxies MUST parse the Connection header field and for
>every connection-token in this field, remove a corresponding header
>field from the request before the request is forwarded. The use of a
>connection option is specified by the presence of a connection token in
>the Connection header field, not by the corresponding additional header
>field (which may not be present).
>
>When a client wishes to establish a persistent connection it MUST send
>a
>"Persist" connection-token:
>
>       Connection: persist
>
>The Connection header has the following grammar:
>
>       Connection-header = "Connection" ":" 1#(connection-token)
>       connection-token  = token
>
>
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 96]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>18.12 Content-Base
>The Content-Base entity-header field may be used to specify the base
>URI
>for resolving relative URLs within the entity. This header field is
>described as "Base" in RFC 1808 , which is expected to be revised soon.
>
>       Content-Base           = "Content-Base" ":" absoluteURI
>
>If no Content-Base field is present, the base URI of an entity is
>defined either by its Content-Location or the URI used to initiate the
>request, in that order of precedence. Note, however, that the base URI
>of the contents within the entity body may be redefined within that
>entity body.
>
>
>18.13 Content-Encoding
>The Content-Encoding entity-header field is used as a modifier to the
>media-type. When present, its value indicates what additional content
>codings have been applied to the resource entity, and thus what
>decoding
>mechanisms MUST be applied in order to obtain the media-type referenced
>by the Content-Type header field. Content-Encoding is primarily used to
>allow a document to be compressed without losing the identity of its
>underlying media type.
>
>       Content-Encoding        = "Content-Encoding" ":"
>1#content-coding
>
>Content codings are defined in section 7.5. An example of its use is
>
>       Content-Encoding: gzip
>
>The Content-Encoding is a characteristic of the resource entity
>identified by the Request-URI. Typically, the resource entity is stored
>with this encoding and is only decoded before rendering or analogous
>usage.
>
>If multiple encodings have been applied to a resource entity, the
>content codings MUST be listed in the order in which they were applied.
>Additional information about the encoding parameters MAY be provided by
>other Entity-Header fields not defined by this specification.
>
>
>18.14 Content-Language
>The Content-Language entity-header field describes the natural
>language(s) of the intended audience for the enclosed entity. Note that
>this may not be equivalent to all the languages used within the entity.
>
>       Content-Language        = "Content-Language" ":" 1#language-tag
>
>Language tags are defined in section 7.10. The primary purpose of
>Content-Language is to allow a selective consumer to identify and
>differentiate resource variants according to the consumer's own
>preferred language. Thus, if the body content is intended only for a
>Danish-literate audience, the appropriate field is
>
>       Content-Language: dk
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 97]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>If no Content-Language is specified, the default is that the content is
>intended for all language audiences. This may mean that the sender does
>not consider it to be specific to any natural language, or that the
>sender does not know for which language it is intended.
>
>Multiple languages MAY be listed for content that is intended for
>multiple audiences. For example, a rendition of the "Treaty of
>Waitangi," presented simultaneously in the original Maori and English
>versions, would call for
>
>       Content-Language: mi, en
>
>However, just because multiple languages are present within an entity
>does not mean that it is intended for multiple linguistic audiences. An
>example would be a beginner's language primer, such as "A First Lesson
>in Latin," which is clearly intended to be used by an English-literate
>audience. In this case, the Content-Language should only include "en".
>
>Content-Language MAY be applied to any media type -- it SHOULD not be
>limited to textual documents.
>
>
>18.15 Content-Length
>The Content-Length entity-header field indicates the size of the
>Entity-
>Body, in decimal number of octets, sent to the recipient or, in the
>case
>of the HEAD method, the size of the Entity-Body that would have been
>sent had the request been a GET.
>
>       Content-Length = "Content-Length" ":" 1*DIGIT
>
>An example is
>
>       Content-Length: 3495
>
>Applications SHOULD use this field to indicate the size of the Entity-
>Body to be transferred, regardless of the media type of the entity. It
>must be possible for the recipient to reliably determine the end of a
>HTTP/1.1 request method containing an entity body, e.g., because the
>request has a valid Content-Length field, uses Transfer-Encoding:
>chunked or a multipart body.
>
>Any Content-Length greater than or equal to zero is a valid value.
>Section 11.2.2 describes how to determine the length of an Entity-Body
>if a Content-Length is not given.
>
>  Note: The meaning of this field is significantly different from the
>  corresponding definition in MIME, where it is an optional field
>  used within the "message/external-body" content-type. In HTTP, it
>  SHOULD be used whenever the entity's length can be determined prior
>  to being transferred.
>
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 98]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>18.16 Content-Location
>The Content-Location entity-header field is used to define the location
>of the plain resource associated with the entity enclosed in the
>message. A server SHOULD provide a Content-Location if, when including
>an entity in response to a GET request on a generic resource, the
>entity
>corresponds to a specific, non-negotiated location which can be
>accessed
>via the Content-Location URI. A server SHOULD provide a
>Content-Location
>with any 200 (OK) response which was internally (not visible to the
>client) redirected to a resource other than the one identified by the
>request and for which correct interpretation of that resource MAY
>require knowledge of its actual location.
>
>        Content-Location = "Content-Location" ":" absoluteURI
>
>If no Content-Base header field is present, the value of Content-
>Location also defines the base URL for the entity (see Section 18.12).
>
>  Note that the Content-Location information is advisory, and that
>  there is no guarantee that the URI of the Content-Location actually
>  corresponds in any way to the original request URI. For example, a
>  cache cannot reliably assume that the data returned as a result of
>  the request can be returned from a new request on any URI other
>  than the original request.  See section 19.9.
>
>
>18.17 Content-MD5
>The Content-MD5 entity-header field is an MD5 digest of the
>entity-body,
>as defined in RFC 1864 [], for the purpose of providing an end-to-end
>message integrity check (MIC) of the entity-body. (Note: an MIC is good
>for detecting accidental modification of the entity-body in transit,
>but
>is not proof against malicious attacks.)
>
>        ContentMD5      = "Content-MD5" ":" md5-digest
>
>        md5-digest      = <base64 of 128 bit MD5 digest as per RFC
>1864>
>
>The Content-MD5 header may be generated by an origin server to function
>as an integrity check of the entity-body. Only origin-servers may
>generate the Content-MD5 header field; proxies and gateways MUST NOT
>generate it, as this would defeat its value as an end-to-end integrity
>check. Any recipient of the entity-body, including gateways and
>proxies,
>MAY check that the digest value in this header field matches that of
>the
>entity-body as received.
>
>The MD5 digest is computed based on the content of the entity body,
>including any Content-Encoding that has been applied, but not including
>any Transfer-Encoding.  If the entity is received with a Transfer-
>Encoding, that encoding must be removed prior to checking the Content-
>MD5 value against the received entity.
>
>This has the result that the digest is computed on the octets of the
>entity body exactly as, and in the order that, they would be sent if no
>Transfer-Encoding were being applied.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul  [Page 99]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>HTTP extends RFC 1864 to permit the digest to be computed for MIME
>composite media-types (e.g., multipart/* and message/rfc822), but this
>does not change how the digest is computed as defined in the preceding
>paragraph.
>
>  Note: There are several consequences of this. The entity-body for
>  composite types may contain many body-parts, each with its own MIME
>  and HTTP headers (including Content-MD5, Content-Transfer-Encoding,
>  and Content-Encoding headers). If a body-part has a Content-
>  Transfer-Encoding or Content-Encoding header, it is assumed that
>  the content of the body-part has had the encoding applied, and the
>  body-part is included in the Content-MD5 digest as is -- i.e.,
>  after the application. Also, the HTTP Transfer-Encoding header
>  makes no sense within body-parts; if it is present, it is ignored -
>  - i.e. treated as ordinary text.
>
>  Note: while the definition of Content-MD5 is exactly the same for
>  HTTP as in RFC 1864 for MIME entity-bodies, there are several ways
>  in which the application of Content-MD5 to HTTP entity-bodies
>  differs from its application to MIME entity-bodies. One is that
>  HTTP, unlike MIME, does not use Content-Transfer-Encoding, and does
>  use Transfer-Encoding and Content-Encoding. Another is that HTTP
>  more frequently uses binary content types than MIME, so it is worth
>  noting that in such cases, the byte order used to compute the
>  digest is the transmission byte order defined for the type. Lastly,
>  HTTP allows transmission of text types with any of several line
>  break conventions and not just the canonical form using CRLF.
>  Conversion of all line breaks to CRLF should not be done before
>  computing or checking the digest: the line break convention used in
>  the text actually transmitted should be left unaltered when
>  computing the digest.
>
>
>
>
>18.18 Content-Range
>The Content-Range header is sent with a partial entity body to specify
>where in the full entity body the partial body should be inserted.  It
>also indicates the total size of the entity.
>
>       Content-Range = "Content-Range" ":" content-range-spec
>
>When an HTTP message includes the content of a single range (for
>example, a response to a request for a single range, or to request for
>a
>set of ranges that overlap without any holes), this content is
>transmitted with a Content-Range header, and a Content-Length header
>showing the number of bytes actually transferred.  For example,
>
>       HTTP/1.0 206 Partial content
>       Date: Wed, 15 Nov 1995 06:25:24 GMT
>       Last-modified: Wed, 15 Nov 1995 04:58:08 GMT
>       Content-Range: 21010-47021/47022
>       Content-Length: 26012
>       Content-Type: image/gif
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 100]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>18.18.1 MIME multipart/byteranges Content-type
>When an HTTP message includes the content of multiple ranges (for
>
>example, a response to a request for multiple non-overlapping ranges),
>these are transmitted as a multipart MIME message.  The multipart MIME
>content-type used for this purpose is defined in this specification to
>be "multipart/byteranges".
>
>The MIME multipart/byteranges content-type includes two or more parts,
>each with its own Content-Type and Content-Range fields.  The parts are
>separated using a MIME boundary parameter.
>
>For example:
>
>       HTTP/1.0 206 Partial content
>       Date: Wed, 15 Nov 1995 06:25:24 GMT
>       Last-modified: Wed, 15 Nov 1995 04:58:08 GMT
>       Content-type: multipart/byteranges;
>boundary=THIS_STRING_SEPARATES
>
>       --THIS_STRING_SEPARATES
>       Content-type: application/pdf
>      Content-range: bytes 500-999/8000
>
>       ...the first range...
>       --THIS_STRING_SEPARATES
>       Content-type: application/pdf
>      Content-range: bytes 7000-7999/8000
>
>       ...the second range
>       --THIS_STRING_SEPARATES_
>
>
>18.18.2 Additional Rules for Content-Range
>A client that cannot decode a MIME multipart/byteranges message should
>not ask for multiple byte-ranges in a single request.
>
>When a client requests multiple byte-ranges in one request, the server
>SHOULD return them in the order that they appeared in the request.
>
>If the server ignores a byte-range-spec because it is invalid,  the
>server should treat the request as if the invalid Range header field
>did
>not exist (normally, this means return a 200 response containing the
>full resource entity).  The reason is that the only time a client will
>make such an invalid request is when the resource entity has changed
>(shrunk) since the prior request.
>
>
>18.19 Content-Type
>The Content-Type entity-header field indicates the media type of the
>Entity-Body sent to the recipient or, in the case of the HEAD method,
>the media type that would have been sent had the request been a GET.
>
>       Content-Type   = "Content-Type" ":" media-type
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 101]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>Media types are defined in section 7.7. An example of the field is
>
>       Content-Type: text/html; charset=ISO-8859-4
>
>Further discussion of methods for identifying the media type of an
>entity is provided in section 11.2.1.
>
>
>18.20 Date
>The Date general-header field represents the date and time at which the
>message was originated, having the same semantics as orig-date in RFC
>822. The field value is an HTTP-date, as described in section 7.3.1.
>
>       Date           = "Date" ":" HTTP-date
>
>An example is
>
>       Date: Tue, 15 Nov 1994 08:12:31 GMT
>
>If a message is received via direct connection with the user agent (in
>the case of requests) or the origin server (in the case of responses),
>then the date can be assumed to be the current date at the receiving
>end. However, since the date--as it is believed by the origin--is
>important for evaluating cached responses, origin servers SHOULD always
>include a Date header. Clients SHOULD only send a Date header field in
>messages that include an entity body, as in the case of the PUT and
>POST
>requests, and even then it is optional. A received message which does
>not have a Date header field SHOULD be assigned one by the recipient if
>the message will be cached by that recipient or gatewayed via a
>protocol
>which requires a Date.
>
>In theory, the date SHOULD represent the moment just before the entity
>is generated. In practice, the date can be generated at any time during
>the message origination without affecting its semantic value.
>
>  Note: An earlier version of this document incorrectly specified
>  that this field SHOULD contain the creation date of the enclosed
>  Entity-Body. This has been changed to reflect actual (and proper)
>  usage.
>
>Origin servers MUST send a Date field in every response.  However, if a
>cache receives a response without a Date field, it SHOULD attach one
>with the cache's best estimate of the time at which the response was
>originally generated.
>
>The format of the Date is an absolute date and time as defined by HTTP-
>date in Section 7.3; it MUST be in RFC1123-date format.
>
>
>
>
>18.21 ETag
>The ETag header is used to transmit entity tags with variant id's in
>HTTP/1.1 responses.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 102]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>      ETag = "ETag" ":" etag-info
>      etag-info = entity-tag [ ";" variant-id ]
>
>Examples:
>
>      ETag: "xyzzy"
>      ETag: "xyzzy"/W
>      ETag: "xyzzy";"3"
>      ETag: "xyzzy"/W;"3"
>      ETag: ""
>
>  Note that the variant-id is not part of the entity tag. The ETag
>  field is used to transmit a variant-id simply as a matter of
>  compact representation of responses.
>
>
>18.22 Expires
>The Expires entity-header field gives the date/time after which the
>entity should be considered stale. A stale cache entry may not normally
>be returned by a cache (either a proxy cache or an end-user cache)
>unless it is first validated with the origin server (or with an
>intermediate cache that has a fresh copy of the resource entity). See
>section 16.1.2 for further discussion of the expiration model.
>
>The presence of an Expires field does not imply that the original
>resource will change or cease to exist at, before, or after that time.
>
>The format is an absolute date and time as defined by HTTP-date in
>section 7.3; it MUST be in rfc1123-date format:
>
>      Expires = "Expires" ":" HTTP-date
>
>An example of its use is
>
>      Expires: Thu, 01 Dec 1994 16:00:00 GMT
>
>  Note: if a response includes a Cache-Control field with the max-age
>  directive, that directive overrides the Expires field.
>
>HTTP/1.1 clients and caches MUST treat other invalid date formats,
>especially including the value "0", as in the past (i.e., "already
>expired").
>
>To mark a response as "already expired," an origin server should use an
>Expires date that is equal to the Date header value. (See the rules for
>expiration calculations in section 0.)
>
>To mark a response as "never expires," an origin server should use an
>Expires date approximately one year from the time the response is
>generated. HTTP/1.1 servers should not send Expires dates more than one
>year in the future.
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 103]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>18.23 From
>The From request-header field, if given, SHOULD contain an Internet e-
>mail address for the human user who controls the requesting user agent.
>The address SHOULD be machine-usable, as defined by mailbox in RFC 822
>(as updated by RFC 1123 ):
>
>       From   = "From" ":" mailbox
>
>An example is:
>
>       From: webmaster@w3.org
>
>This header field MAY be used for logging purposes and as a means for
>identifying the source of invalid or unwanted requests. It SHOULD NOT
>be
>used as an insecure form of access protection. The interpretation of
>this field is that the request is being performed on behalf of the
>person given, who accepts responsibility for the method performed. In
>particular, robot agents SHOULD include this header so that the person
>responsible for running the robot can be contacted if problems occur on
>the receiving end.
>
>The Internet e-mail address in this field MAY be separate from the
>Internet host which issued the request. For example, when a request is
>passed through a proxy the original issuer's address SHOULD be used.
>
>  Note: The client SHOULD not send the From header field without the
>  user's approval, as it may conflict with the user's privacy
>  interests or their site's security policy. It is strongly
>  recommended that the user be able to disable, enable, and modify
>  the value of this field at any time prior to a request.
>
>
>18.24 Host
>The Host request-header field specifies the Internet host and port
>number of the resource being requested, as obtained from the original
>URL given by the user or referring resource (generally an HTTP URL, as
>described in section 7.2.2).  The Host field value MUST represent  the
>network location of the origin server or gateway given by the original
>URL.  This allows the origin server or gateway to differentiate between
>internally-ambiguous URLs, such as the root "/"  URL of a server for
>multiple host names on a single IP address.
>
>       Host = "Host" ":" host [ ":" port ]    ; Section 7.2.2
>
>A "host" without any trailing port information implies the default port
>for the service requested (e.g., "80" for an HTTP URL).  For example, a
>request on the origin server for <http://www.w3.org/pub/WWW/> MUST
>include:
>
>       GET /pub/WWW/ HTTP/1.1
>       Host: www.w3.org
>
>The Host header field MUST be included in all HTTP/1.1 request messages
>on the Internet (i.e., on any message corresponding to a request for a
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 104]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>URL which includes an Internet host address for the service being
>requested).  If the Host field is not already present, an HTTP/1.1
>proxy
>MUST add a Host field to the request message prior to forwarding it on
>the Internet.  All Internet-based HTTP/1.1 servers MUST respond with a
>400 status code to any HTTP/1.1 request message which lacks a Host
>header field.
>
>
>18.25 If-Modified-Since
>The If-Modified-Since request-header field is used with the GET method
>to make it conditional: if the requested resource entity has not been
>modified since the time specified in this field, a copy of the resource
>entity will not be returned from the server; instead, a 304 (not
>modified) response will be returned without any Entity-Body.
>
>       If-Modified-Since = "If-Modified-Since" ":" HTTP-date
>
>An example of the field is:
>
>       If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
>
>A GET method with an If-Modified-Since header and no Range header
>requests that the identified resource entity be transferred only if it
>has been modified since the date given by the If-Modified-Since header.
>The algorithm for determining this includes the following cases:
>
>
>a)If the request would normally result in anything other than a 200
>  (OK) status, or if the passed If-Modified-Since date is invalid, the
>  response is exactly the same as for a normal GET. A date which is
>  later than the server's current time is invalid.
>
>b)If the resource entity has been modified since the If-Modified-Since
>  date, the response is exactly the same as for a normal GET.
>
>c)If the resource entity  has not been modified since a valid If-
>  Modified-Since date, the server MUST return a 304 (not modified)
>  response.
>The purpose of this feature is to allow efficient updates of cached
>information with a minimum amount of transaction overhead.
>
>  Note that the Range request-header field modifies the meaning of
>  If-Modified-Since; see section 18.38 for full details.
>
>  Note that If-Modified-Since is ignored for generic resources.
>
>  Note that If-Modified-Since times are interpreted by the server,
>  whose clock may not be synchronized with the client.
>
>  Note that if a client uses an arbitrary date in the If-Modified-
>  Since header instead of a date taken from the Last-Modified header
>  for the same request, the client should be aware of the fact that
>  this date is interpreted in the server's understanding of time.
>  The client should consider unsynchronized clocks and rounding
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 105]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  problems due to the different representations of time between the
>  client and server.  This includes the possibility of race
>  conditions if the document has changed between the time it was
>  first requested and the If-Modified-Since date of a subsequent
>  request, and the possibility of clock-skew-related problems if the
>  If-Modified-Date date is derived from the client's clock without
>  correction to the server's clock.  Corrections for different time
>  bases between client and server are at best approximate due to
>  network latency.
>
>
>
>
>18.26 If-Match
>The If-Match request-header field is used with a method to make it
>conditional. A client that has a cache entry for the relevant entity
>supplies the associated entity tag using the If-Match header; if this
>entity tag matches the server's current entity tag for the entity, the
>server SHOULD perform the requested operation as if the If-Match header
>were not present.
>
>If the entity tags do not match, the server MUST NOT perform the
>requested operation, and MUST return a 412 (Precondition failed)
>response with no Entity-Body. This behavior is most useful when the
>client wants to prevent an updating method, such as PUT or POST, from
>modifying a resource entity  that  has changed since the client last
>checked it.
>
>When the If-Match header is used, the server should use the strong
>comparison function (see section 18.26) to compare entity tags.
>
>If the If-Match header is used to make a conditional request on generic
>resource, it may be used to pass a set of validators.  This is done
>using the variant-set mechanism if the client has variant IDs for the
>corresponding cache entries (see sections 16.5.3 and 7.13 ).  The
>server
>selects the appropriate variant based on other request headers; if the
>variant-ID for that resource entity is listed in the If-Match header,
>and if the entity-tag associated with that variant-ID in the header
>matches the current entity-tag of the resource entity, then the
>requested operation SHOULD be performed.  Otherwise, it MUST NOT be
>performed.
>
>      If-Match = "If-Match" ":" if-match-rhs
>      if-match-rhs = opaque-validator | variant-set
>
>An updating request (e.g., a PUT or POST) on a generic  resource should
>include only one variant-set-item, the one associated with the
>particular variant whose value is being conditionally updated.
>
>Examples of plain resource  form:
>
>       If-Match: "xyzzy"
>       If-Match: "xyzzy"/W
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 106]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>Examples of generic resource  form:
>
>       If-Match: "xyzzy";"4"
>       If-Match: "xyzzy";"3", "r2d2xxxx";"5", "c3piozzzz";"7"
>       If-Match: "xyzzy"/W; "3", "r2d2xxxx"/W; "5", "c3piozzzz"/W; "7"
>
>If the request would, without the If-Match header, result in anything
>other than a 2xx status, then the If-Match header is ignored.
>
>The purpose of this feature is to allow efficient updates of cached
>information with a minimum amount of transaction overhead. It is also
>used, on updating requests, to prevent inadvertent modification of the
>wrong variant of a resource.
>
>
>18.27 If-NoneMatch
>The If-NoneMatch request-header field is used with a method to make it
>conditional. A client that has a cache entry for the relevant entity
>supplies the associated entity tag using the If-NoneMatch header; if
>this entity tag matches the server's current entity tag for the entity,
>the server SHOULD return a 304 (Not Modified) response without any
>Entity-Body.
>
>If the entity tags do not match, the server should treat the request as
>if the If-NoneMatch header was not present.
>
>See section 18.26 for rules on how to determine if two entity tags
>match.
>
>If the If-NoneMatch header is used to make a conditional request on
>generic resource, it may be used to pass a set of validators.  This is
>done using the variant-set mechanism if the client has variant IDs for
>the corresponding cache entries (see sections 16.5.3 and 7.13).  The
>server selects the appropriate variant based on other request headers;
>if the variant-ID for that resource entity is listed in the
>If-NoneMatch
>header, and if the entity-tag associated with that variant-ID in the
>header matches the current entity-tag of the resource entity, then the
>requested operation SHOULD NOT be performed.  Otherwise, it SHOULD be
>performed.
>
>      If-NoneMatch = "If-NoneMatch" ":" if-nonematch-rhs
>      if-nonematch-rhs = opaque-validator | variant-set
>
>Examples of plain resource form:
>
>       If-NoneMatch: "xyzzy"
>       If-NoneMatch: "xyzzy"/W
>
>Examples of generic resource form:
>
>       If-NoneMatch: "xyzzy";"4"
>       If-NoneMatch: "xyzzy";"3", "r2d2xxxx";"5", "c3piozzzz";"7"
>       If-NoneMatch: "xyzzy"/W; "3", "r2d2xxxx"/W; "5", "c3piozzzz"/W;7
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 107]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>If the request would, without the If-NoneMatch header, result in
>anything other than a 2xx status, then the If-NoneMatch header is
>ignored.
>
>The purpose of this feature is to allow efficient updates of cached
>information with a minimum amount of transaction overhead.
>
>
>18.28 If-Range
>If a client has a partial copy of an entity in its cache, and wishes to
>have an up-to-date copy of the entire entity in its cache, it could use
>the Range request header with a conditional GET (using either or both
>of
>If-Unmodified-Since and If-Match.)  However, if the condition fails
>because the entity has been modified, the client would then have to
>make
>a second request to obtain the entire current entity body.
>
>The If-Range header allows a client to "short-circuit" the second
>request.  Informally, its meaning is "if the entity is unchanged, send
>me the part(s) that I am missing; otherwise, send me the entire new
>entity.'"
>
>        Range-If = "Range-If" ":" (if-valid-rhs | HTTP-date)
>
>If the client has no entity tag for a plain resource, but does have a
>Last-Modified date, it may use that date in a If-Range header.  (The
>server can detect this because an HTTP-date, unlike any form of if-
>valid-rhs, does not start with a `"' quotation mark.)  Dates may only
>be
>used in If-Range for plain resources, not for generic resources.  The
>If-Range header should only be used together with a Range header, and
>must be ignored if the request does not include a Range header, or if
>the server does not support the sub-range operation.
>
>If the entity tag given in the If-Range header matches the current
>entity tag for the entity, then the server should provide the specified
>sub-range of the entity using a 206 (Partial content) response.  If the
>entity tag does not match, then the server should return the entire
>entity using a 200 (OK) response.
>
>
>18.29 If-Unmodified-Since
>The If-Unmodified-Since request-header field is used with a method to
>make it conditional. If the requested resource entity has not been
>modified since the time specified in this field, the server should
>perform the requested operation as if the If-Unmodified-Since header
>were not present.
>
>If the requested resource entity has been modified since the specified
>time, the server MUST NOT perform the requested operation, and MUST
>return a 412 (Precondition Failed) response with no Entity-Body.
>
>      If-Unmodified-Since = "If-Unmodified-Since" ":" HTTP-date
>
>An example of the field is:
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 108]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
>
>If the request normally (i.e., without the If-Unmodified-Since header)
>would result in anything other than a 2xx status, the If-Unmodified-
>Since header should be ignored.
>
>If the specified date is invalid, the header is ignored.
>
>
>18.30 Last-Modified
>The Last-Modified entity-header field indicates the date and time at
>which the sender believes the resource entity was last modified. The
>exact semantics of this field are defined in terms of how the recipient
>SHOULD interpret it: if the recipient has a copy of this resource
>entity
>which is older than the date given by the Last-Modified field, that
>copy
>SHOULD be considered stale.
>
>       Last-Modified  = "Last-Modified" ":" HTTP-date
>
>An example of its use is
>
>       Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
>
>The exact meaning of this header field depends on the implementation of
>the sender and the nature of the original resource. For files, it may
>be
>just the file system last-modified time. For entities with dynamically
>included parts, it may be the most recent of the set of last-modify
>times for its component parts. For database gateways, it may be the
>last-update time stamp of the record. For virtual objects, it may be
>the
>last time the internal state changed.
>
>An origin server MUST NOT send a Last-Modified date which is later than
>the server's time of message origination. In such cases, where the
>resource's last modification would indicate some time in the future,
>the
>server MUST replace that date with the message origination date.
>
>An origin server should obtain the Last-Modified value of the entity as
>close as possible to the time that it generates the Date value of its
>response. This allows a recipient to make an accurate assessment of the
>entity's modification time, especially if the entity changes near the
>time that the response is generated.
>
>
>18.31 Location
>The Location response-header field is used to redirect the recipient to
>a location other than the Request-URI for completion of the request or
>identification of a new resource. For 201 (created) responses, the
>Location is that of the new resource which was created by the request.
>For 3xx responses, the location SHOULD indicate the server's preferred
>URL for automatic redirection to the resource. The field value consists
>of a single absolute URL.
>
>       Location       = "Location" ":" absoluteURI
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 109]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>An example is
>
>       Location: http://www.w3.org/pub/WWW/People.html
>
>  Note: The Content-Location header field (section 18.16) differs
>  from Location in that the Content-Location identifies the original
>  location of the entity enclosed in the request.  It is therefore
>  possible for a response to contain header fields for both Location
>  and Content-Location.
>
>
>18.32 Max-Forwards
>[JG14]The Max-Forwards general-header field may be used with the TRACE
>method (section 18.32) to limit the number of times that a proxy or
>gateway can forward the request to the next inbound server.  This can
>be
>useful when the client is attempting to trace a request chain which
>appears to be failing or looping in mid-chain.
>
>       Max-Forwards   = "Max-Forwards" ":" 1*DIGIT
>
>The Max-Forwards value is a decimal integer indicating the remaining
>number of times this request message may be forwarded.
>
>Each proxy or gateway recipient of a TRACE request containing a Max-
>Forwards header field SHOULD check and update its value prior to
>forwarding the request.  If the received value is zero (0), the
>recipient SHOULD NOT forward the request; instead, it SHOULD respond as
>the final recipient with a 200 (OK) response containing the received
>request message as the response entity body (as described in Section
>13.7).  If the received Max-Forwards value is greater than zero, then
>the forwarded message SHOULD contain an updated Max-Forwards field with
>a value decremented by one (1).
>
>The Max-Forwards header field SHOULD be ignored for all other methods
>defined by this specification and for any extension methods for which
>it
>is not explicitly referred to as part of that method definition.
>
>
>18.33 Persist
>When the Persist connection-token has been transmitted with a request
>or
>a response a Persist header field MAY also be included. The Persist
>header field takes the following form:
>
>       Persist-header = "Persist" ":" 0#pers-param
>
>       pers-param = param-name "=" word
>       param-name = token
>
>The Persist header itself is optional, and is used only if a parameter
>is being sent. HTTP/1.1 does not define any parameters.
>
>If the Persist header is sent, the corresponding connection token MUST
>be transmitted. The Persist header MUST be ignored if received without
>the connection token.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 110]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>18.34 Pragma
>The Pragma general-header field is used to include implementation-
>specific directives that may apply to any recipient along the
>request/response chain. All pragma directives specify optional behavior
>from the viewpoint of the protocol; however, some systems MAY require
>that behavior be consistent with the directives.
>
>       Pragma                  = "Pragma" ":" 1#pragma-directive
>
>       pragma-directive        = "no-cache" | extension-pragma
>       extension-pragma        = token [ "=" word ]
>
>When the "no-cache" directive is present in a request message, an
>application SHOULD forward the request toward the origin server even if
>it has a cached copy of what is being requested. This pragma directive
>has the same semantics as the "no-cache" cache-directive (see section
>18.10) and is defined here for backwards compatibility with HTTP/1.0.
>Clients SHOULD include both header fields when a "no-cache" request is
>sent to a server not known to be HTTP/1.1 compliant.
>
>Pragma directives MUST be passed through by a proxy or gateway
>application, regardless of their significance to that application,
>since
>the directives may be applicable to all recipients along the
>request/response chain. It is not possible to specify a pragma for a
>specific recipient; however, any pragma directive not relevant to a
>recipient SHOULD be ignored by that recipient.
>
>HTTP/1.1 clients SHOULD NOT send the Pragma request header. HTTP/1.1
>caches SHOULD treat "Pragma: no-cache" as if the client had sent
>"Cache-
>control: no-cache".  No new Pragma directives will be defined in HTTP.
>
>
>18.35 Proxy-Authenticate
>The Proxy-Authenticate response-header field MUST be included as part
>of
>a 407 (Proxy Authentication Required) response. The field value
>consists
>of a challenge that indicates the authentication scheme and parameters
>applicable to the proxy for this Request-URI.
>
>       Proxy-Authentication    = "Proxy-Authentication" ":" challenge
>
>The HTTP access authentication process is described in section 14.
>Unlike WWW-Authenticate, the Proxy-Authenticate header field applies
>only to the current connection and MUST NOT be passed on to downstream
>clients.
>
>
>18.36 Proxy-Authorization
>The Proxy-Authorization request-header field allows the client to
>identify itself (or its user) to a proxy which requires authentication.
>The Proxy-Authorization field value consists of credentials containing
>the authentication information of the user agent for the proxy and/or
>realm of the resource being requested.
>
>       Proxy-Authorization     = "Proxy-Authorization" ":" credentials
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 111]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>The HTTP access authentication process is described in section 14.
>Unlike Authorization, the Proxy-Authorization applies only to the
>current connection and MUST NOT be passed on to upstream servers. If a
>request is authenticated and a realm specified, the same credentials
>SHOULD be valid for all other requests within this realm.
>
>
>18.37 Public
>The Public response-header field lists the set of non-standard methods
>supported by the server. The purpose of this field is strictly to
>inform
>the recipient of the capabilities of the server regarding unusual
>methods. The methods listed may or may not be applicable to the
>Request-
>URI; the Allow header field (section 18.7) SHOULD be used to indicate
>methods allowed for a particular URI. This does not prevent a client
>from trying other methods. The field value SHOULD not include the
>methods predefined for HTTP/1.1 in section 9.1.1.
>
>       Public         = "Public" ":" 1#method
>
>Example of use:
>
>       Public: OPTIONS, MGET, MHEAD
>
>This header field applies only to the server directly connected to the
>client (i.e., the nearest neighbor in a chain of connections). If the
>response passes through a proxy, the proxy MUST either remove the
>Public
>header field or replace it with one applicable to its own capabilities.
>
>
>18.38 Range
>HTTP retrieval requests using conditional or unconditional GET methods
>may request one or more sub-ranges of the entity, instead of the entire
>entity.  This is done using the Range request header:
>
>      Range = "Range" ":" ranges-specifier
>
>A server MAY ignore the Range header.  However, HTTP/1.1 origin servers
>and intermediate caches SHOULD support byte ranges whenever possible,
>since this supports efficient recovery from partially failed transfers,
>and it supports efficient partial retrieval of large entities.
>
>If the server supports the Range header and the specified range or
>ranges are appropriate for the entity:
>
>  .  The presence of a Range header in an unconditional GET modifies
>     what is returned if the GET is otherwise successful.  In other
>     words, the response carries a status code of 206 (Partial Content)
>     instead of 200 (OK).
>  .  The presence of a Range header in a conditional GET (a request
>     using one or both of If-Modified-Since and If-NoneMatch, or one or
>     both of If-Unmodified-Since and If-Match) modifies what is
>returned
>     if the GET is otherwise successful and the condition is true.  It
>     does not affect the 304 (Not Modified) response returned if the
>     conditional is false.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 112]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>In some cases, it may be more appropriate to use the If-Range header
>(see section 18.28) in addition to the Range header.
>
>
>18.39 Referer
>The Referer[sic] request-header field allows the client to specify, for
>the server's benefit, the address (URI) of the resource from which the
>Request-URI was obtained. This allows a server to generate lists of
>back-links to resources for interest, logging, optimized caching, etc.
>It also allows obsolete or mistyped links to be traced for maintenance.
>The Referer field MUST NOT be sent if the Request-URI was obtained from
>a source that does not have its own URI, such as input from the user
>keyboard.
>
>       Referer        = "Referer" ":" ( absoluteURI | relativeURI )
>
>Example:
>
>       Referer: http://www.w3.org/hypertext/DataSources/Overview.html
>
>If a partial URI is given, it SHOULD be interpreted relative to the
>Request-URI. The URI MUST NOT include a fragment.
>
>  Note: Because the source of a link may be private information or
>  may reveal an otherwise private information source, it is strongly
>  recommended that the user be able to select whether or not the
>  Referer field is sent. For example, a browser client could have a
>  toggle switch for browsing openly/anonymously, which would
>  respectively enable/disable the sending of Referer and From
>  information.
>
>
>18.40 Retry-After
>The Retry-After response-header field can be used with a 503 (Service
>Unavailable) response to indicate how long the service is expected to
>be
>unavailable to the requesting client. The value of this field can be
>either an HTTP-date or an integer number of seconds (in decimal) after
>the time of the response.
>
>       Retry-After    = "Retry-After" ":" ( HTTP-date | delta-seconds )
>
>Two examples of its use are
>
>       Retry-After: Wed, 14 Dec 1994 18:22:54 GMT
>       Retry-After: 120
>
>In the latter example, the delay is 2 minutes.
>
>
>18.41 Server
>The Server response-header field contains information about the
>software
>used by the origin server to handle the request. The field can contain
>multiple product tokens (section 7.8) and comments identifying the
>server and any significant subproducts. By convention, the product
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 113]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>tokens are listed in order of their significance for identifying the
>application.
>
>       Server         = "Server" ":" 1*( product | comment )
>
>Example:
>
>       Server: CERN/3.0 libwww/2.17
>
>If the response is being forwarded through a proxy, the proxy
>application MUST NOT add its data to the product list. Instead, it
>SHOULD include a Via field (as described in section 18.47).
>
>  Note: Revealing the specific software version of the server may
>  allow the server machine to become more vulnerable to attacks
>  against software that is known to contain security holes. Server
>  implementers are encouraged to make this field a configurable
>  option.
>
>
>18.42 Title
>The Title entity-header field indicates the title of the entity
>
>       Title          = "Title" ":" *TEXT
>
>An example of the field is
>
>       Title: Hypertext Transfer Protocol -- HTTP/1.1
>
>This field is isomorphic with the <TITLE> element in HTML .
>
>
>18.43 Transfer Encoding
>The Transfer-Encoding general-header field indicates what (if any) type
>of transformation has been applied to the message body in order to
>safely transfer it between the sender and the recipient. This differs
>from the Content-Encoding in that the transfer coding is a property of
>the message, not of the original resource entity.
>
>       Transfer-Encoding       = "Transfer-Encoding" ":" 1#transfer-
>coding
>
>Transfer codings are defined in section 7.6. An example is:
>
>       Transfer-Encoding: chunked
>
>Many older HTTP/1.0 applications do not understand the
>Transfer-Encoding
>header.
>
>
>18.44 Upgrade
>The Upgrade general-header allows the client to specify what additional
>communication protocols it supports and would like to use if the server
>finds it appropriate to switch protocols. The server MUST use the
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 114]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>Upgrade header field within a 101 (Switching Protocols) response to
>indicate which protocol(s) are being switched.
>
>       Upgrade        = "Upgrade" ":" 1#product
>
>For example,
>
>       Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
>
>The Upgrade header field is intended to provide a simple mechanism for
>transition from HTTP/1.1 to some other, incompatible protocol.  It does
>so by allowing the client to advertise its desire to use another
>protocol, such as a later version of HTTP with a higher major version
>number, even though the current request has been made using  HTTP/1.1.
>This eases the difficult transition between incompatible protocols by
>allowing the client to initiate a request in the more commonly
>supported
>protocol while indicating to the server that it would like to use a
>"better" protocol if available (where "better" is determined by the
>server, possibly according to the nature of the method and/or resource
>being requested).
>
>The Upgrade header field only applies to switching application-layer
>protocols upon the existing transport-layer connection.  Upgrade cannot
>be used to insist on a protocol change; its acceptance and use by the
>server is optional.  The capabilities and nature of the application-
>layer communication after the protocol change is entirely dependent
>upon
>the new protocol chosen, although the first action after changing the
>protocol MUST be a response to the initial HTTP request containing the
>Upgrade header field.
>
>The Upgrade header field only applies to the immediate connection.
>Therefore, the "upgrade" keyword MUST be supplied within a Connection
>header field (section 18.11) whenever Upgrade is present in an HTTP/1.1
>message.
>
>The Upgrade header field cannot be used to indicate a switch to a
>protocol on a different connection.  For that purpose, it is more
>appropriate to use a 301, 302, 303, or 305 redirection response.
>
>This specification only defines the protocol name "HTTP" for use by the
>family of Hypertext Transfer Protocols, as defined by the HTTP version
>rules of section 7.1 and future updates to this specification.  Any
>token can be used as a protocol name; however, it will only be useful
>if
>both the client and server associate the name with the same protocol.
>
>
>18.45 User-Agent
>The User-Agent request-header field contains information about the user
>agent originating the request. This is for statistical purposes, the
>tracing of protocol violations, and automated recognition of user
>agents
>for the sake of tailoring responses to avoid particular user agent
>limitations. Although it is not required, user agents SHOULD include
>this field with requests. The field can contain multiple product tokens
>(section 7.8) and comments identifying the agent and any subproducts
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 115]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>which form a significant part of the user agent. By convention, the
>product tokens are listed in order of their significance for
>identifying
>the application.
>
>       User-Agent     = "User-Agent" ":" 1*( product | comment )
>
>Example:
>
>       User-Agent: CERN-LineMode/2.15 libwww/2.17b3
>
>
>18.46 Vary
>The Vary response-header field is used by an origin server to signal
>that the resource identified by the current request is a generic)
>resource.  A generic resource has multiple entities associated with it,
>all of which are representations of the content of the resource.  If a
>GET or HEAD request on a generic resource is received, the origin
>server
>will select one of the associated entities as the entity best matching
>the request.  Selection of this entity is based on the contents of
>particular header fields in the request message, or on other
>information
>pertaining to the request, like the network address of the sending
>client.
>
>A resource being generic has an important effect on cache management,
>particularly for caching proxies which service a diverse set of user
>agents.  All 200 (OK) responses from generic resources MUST contain at
>least one Vary header (section 18.46) or Alternates header (section
>18.8) to signal variance.
>
>If no Vary headers and no Alternates headers are present in a 200 (OK)
>response, then caches may assume, as long as the response is fresh,
>that
>the resource in question is plain, and has only one associated entity.
>Note however that this entity can still change through time, as
>possibly
>indicated by a Cache-Control response header (section 18.10).
>
>After selection of the entity best matching the current request, the
>origin server will usually generate a 200 (OK) response, but it can
>also
>generate other responses like 206 (Partial Content) or 304 (Not
>Modified) if headers which modify the semantics of the request, like
>Range (section 18.38) or If-Match (section 18.26), are present.  An
>origin server need not be capable of selecting an entity for every
>possible incoming request on a generic resource; it can choose to
>generate a 3xx (redirection) or 4xx (client error) type response for
>some requests.
>
>In a request message on a generic resource, the selecting request
>headers are those request headers whose contents were used by the
>origin
>server to select the entity best matching the request. The Vary header
>field specifies the selecting request headers and any other selection
>parameters that were used by the origin server.
>
>       Vary                 = "Vary" ":" 1#selection-parameter
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 116]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       selection-parameter  = request-header-name
>                            | "{accept-headers}"
>                            | "{other}"
>                            | "{" extension-parameter "}"
>
>       request-header-name  = field-name
>
>       extension-parameter  = token
>
>The presence of a request-header-name signals that the request-header
>field with this name is selecting.  Note that the name need not belong
>to a request-header field defined in this specification, and that
>header
>names are case-insensitive.  The presence of the "{accept-headers}"
>parameter signals that all request headers whose names start with
>"accept" are selecting.
>
>The inclusion of the "{other}" parameter in a Vary field signals that
>parameters other than the contents of request headers, for example the
>network address of the sending party, play a role in the selection of
>the response.
>
>  Note: This specification allows the origin server to express that
>  other parameters were used, but does not allow the origin server to
>  specify the exact nature of these parameters.  This is left to
>  future extensions.
>
>If an extension-parameter unknown to the cache is present in a Vary
>header, the cache MUST treat it as the "{other}" parameter. If multiple
>Vary and Alternates header fields are present in a response, these MUST
>be combined to give all selecting parameters.
>
>The field name "Host" MUST never be included in a Vary header; clients
>MUST ignore it if it is present.  The names of fields which change the
>semantics of a GET request, like "Range" and "If-Match" MUST also never
>be included, and MUST be ignored when present.
>
>Servers which use access authentication are not obliged to send "Vary:
>Authorization" headers in responses.  It MUST be assumed that requests
>on authenticated resources can always produce different responses for
>different users.  Note that servers can signal the absence of
>authentication by including "Cache-Control: public" header in the
>response.
>
>A cache MAY store and refresh 200 (OK) responses from a generic
>resource
>according to the rules in section 16.4.  The partial entities in 206
>(Partial Content) responses from generic resources MAY also be used by
>the cache.
>
>When getting a request on a generic resource, a cache can only return a
>cached 200 (OK) response to one of its clients in two particular cases.
>
>First, if a cache gets a request on a generic resource for which it has
>cached one or more responses with Vary or Alternates headers, it can
>relay that request towards the origin server, adding an If-NoneMatch
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 117]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>header listing the etag-info values in the ETag headers (section Error!
>Reference source not found.) of the cached responses which have
>variant-
>IDs.  If it then gets back a 304 (Not Modified) response with the etag-
>info of a cached 200 (OK) response in its ETag header, it can return
>this cached 200 (OK) response to its client, after merging in any of
>the
>304 response headers as specified in section 16.4.2.
>
>Second, if a cache gets a request on a generic resource, it can return
>to its client a cached, fresh 200 (OK) response which has Vary or
>Alternates headers, provided that
>
>
>  .  the Vary and Alternates headers of this fresh response specify
>that
>     only request header fields are selecting parameters,
>
>  .  the specified selecting request header fields of the current
>     request match the specified selecting request header fields of a
>     previous request on the resource relayed towards the origin
>server,
>
>  .  this previous request got a 200 (OK) or 304 (Not Modified)
>response
>     which had the same etag-info value in its ETag header as the
>     cached, fresh 200 (OK) response.
>Two sequences of selecting request header fields match if and only if
>the first sequence can be transformed into the second sequence by only
>adding or removing whitespace at places in fields where this is allowed
>according to the syntax rules in this specification.
>
>If a cached 200 (OK) response MAY be returned to a request on a generic
>resource which includes a Range request header, then a cache MAY also
>use this 200 (OK) response to construct and return a 206 (Partial
>Content) response with the requested range.
>
>  Note: Implementation of support for the second case above is mainly
>  interesting in user agent caches, as a user agent cache will
>  generally have an easy way of determining whether the sequence of
>  request header fields of the current request equals the sequence
>  sent in an earlier request on the same resource.  Proxy caches
>  supporting the second case would have to record diverse sequences
>  of request header fields previously relayed; the implementation
>  effort associated with this may not be balanced by a sufficient
>  payoff in traffic savings.  A planned specification of a content
>  negotiation mechanism will define additional cases in which proxy
>  caches can return a cached 200 (OK) response without contacting the
>  origin server.  The implementation effort associated with support
>  for these additional cases is expected to have a much better
>  cost/benefit ratio.
>
>
>18.47 Via
>The Via general-header field MUST be used by gateways and proxies to
>indicate the intermediate protocols and recipients between the user
>agent and the server on requests, and between the origin server and the
>client on responses. It is analogous to the "Received" field of RFC 822
>and is intended to be used for tracking message forwards, avoiding
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 118]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>request loops, and identifying the protocol capabilities of all senders
>along the request/response chain.
>
>      Via   =   "Via" ":" 1#( received-protocol received-by [ comment ]
>)
>
>      received-protocol = [ protocol-name "/" ] protocol-version
>      protocol-name     = token
>      protocol-version  = token
>      received-by       = ( host [ ":" port ] ) | pseudonym
>      pseudonym         = token
>
>The received-protocol indicates the protocol version of the message
>received by the server or client along each segment of the
>request/response chain.  The received-protocol version is appended to
>the Via field value when the message is forwarded so that information
>about the protocol capabilities of upstream applications remains
>visible
>to all recipients.
>
>The protocol-name is optional if and only if it would be "HTTP".  The
>received-by field is normally the host and optional port number of a
>recipient server or client that subsequently forwarded the message.
>However, if the real host is considered to be sensitive information, it
>MAY be replaced by a pseudonym.  If the port is not given, it MAY be
>assumed to be the default port of the received-protocol.
>
>Multiple Via field values represent each proxy or gateway that has
>forwarded the message.  Each recipient MUST append its information such
>that the end result is ordered according to the sequence of forwarding
>applications.
>
>Comments MAY be used in the Via header field to identify the software
>of
>the recipient proxy or gateway, analogous to the User-Agent and  Server
>header fields.  However, all comments in the Via field are optional and
>MAY be removed by any recipient prior to forwarding the message.
>
>For example, a request message could be sent from an HTTP/1.0 user
>agent
>to an internal proxy code-named "fred", which uses HTTP/1.1 to forward
>the request to a public proxy at nowhere.com, which completes the
>request by forwarding it to the origin server at www.ics.uci.edu.  The
>request received by www.ics.uci.edu would then have the following Via
>header field:
>
>       Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
>
>Proxies and gateways used as a portal through a network firewall SHOULD
>NOT, by default, forward the names and ports of hosts within the
>firewall region. This information SHOULD only be propagated if
>explicitly enabled. If not enabled, the received-by host of any host
>behind the firewall SHOULD be replaced by an appropriate pseudonym for
>that host.
>
>For organizations that have strong privacy requirements for hiding
>internal structures, a proxy MAY combine an ordered subsequence of Via
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 119]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>header field entries with identical received-protocol values into a
>single such entry.  For example,
>
>       Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy
>
>   could be collapsed to
>
>       Via: 1.0 ricky, 1.1 mertz, 1.0 lucy
>
>Applications SHOULD NOT combine multiple entries unless they are all
>under the same organizational control and the hosts have already been
>replaced by pseudonyms.  Applications MUST NOT combine entries which
>have different received-protocol values.
>
>  Note: The Via header field replaces the Forwarded header field
>  which was present in earlier drafts of this specification.
>
>
>18.48 Warning
>Warning headers are sent with responses using:
>
>       Warning    = "Warning" ":" warn-code SP warn-agent SP warn-text
>       warn-code  = 2DIGIT
>       warn-agent = ( host [ ":" port ] ) | pseudonym
>                       ; the name or pseudonym of the server adding
>                       ; the Warning header, for use in debugging
>       warn-text  = quoted-string
>
>A response may carry more than one Warning header.
>
>The warn-text should be in a natural language and character set that is
>most likely to be intelligible to the human user receiving the
>response.
>This decision may be based on any available knowledge, such as the
>location of the cache or user, the Accept-Language field in a request,
>the Content-Language field in a response, etc. The default language is
>English and the default character set is ISO-8599-1.
>
>If a character set other than ISO-8599-1 is used, it must be encoded in
>the warn-text using the method described in RFC 1522 [14].
>
>Any server or cache may add Warning headers to a response. New Warning
>headers should be added after any existing Warning headers. A cache
>MUST
>NOT delete any Warning header that it received with a response.
>However,
>if a cache successfully validates a cache entry, it SHOULD remove any
>Warning headers previously attached to that entry. It MUST then add any
>Warning headers received in the validating response. In other words,
>Warning headers are those that would be attached to the most recent
>relevant response.
>
>When multiple Warning headers are attached to a response, the user
>agent
>SHOULD display as many of them as possible, in the order that they
>appear in the response. If it is not possible to display all of the
>warnings, the user agent should follow these heuristics:
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 120]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  .  Warnings that appear early in the response take priority over
>those
>     appearing later in the response.
>  .  Warnings in the user's preferred character set take priority over
>     warnings in other character sets but with identical warn-codes and
>     warn-agents.
>Systems that generate multiple Warning headers should order them with
>this user-agent behavior in mind.
>
>This is a list of the currently-defined warn-codes, each with a
>recommended warn-text in English, and a description of its meaning.
>
>
>10 Response is stale
>  MUST be included whenever the returned response is stale. A cache may
>  add this warning to any response, but may never remove it until the
>  response is known to be fresh.
>
>11 Revalidation failed
>  MUST be included if a cache returns a stale response because an
>  attempt to revalidate the response failed, due to an inability to
>  reach the server. A cache may add this warning to any response, but
>  may never remove it until the response is successfully revalidated.
>
>12 Disconnected operation
>   SHOULD be included if the cache is intentionally disconnected from
>  the rest of the network for a period of time.
>
>99 Miscellaneous warning
>  The warning text may include arbitrary information to be presented to
>  a human user, or logged. A system receiving this warning MUST NOT
>  take any automated action.
>
>
>
>18.49 WWW-Authenticate
>The WWW-Authenticate response-header field MUST be included in 401
>(Unauthorized) response messages. The field value consists of at least
>one challenge that indicates the authentication scheme(s) and
>parameters
>applicable to the Request-URI.
>
>       WWW-Authenticate        = "WWW-Authenticate" ":" 1#challenge
>
>The HTTP access authentication process is described in section 14. User
>agents MUST take special care in parsing the WWW-Authenticate field
>value if it contains more than one challenge, or if more than one WWW-
>Authenticate header field is provided, since the contents of a
>challenge
>may itself contain a comma-separated list of authentication parameters.
>
>
>19 Security Considerations
>This section is meant to inform application developers, information
>providers, and users of the security limitations in HTTP/1.1 as
>described by this document. The discussion does not include definitive
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 121]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>solutions to the problems revealed, though it does make some
>suggestions
>for reducing security risks.
>
>
>19.1 Authentication of Clients
>As mentioned in section 14, the Basic authentication scheme is not a
>secure method of user authentication, nor does it in any way protect
>the
>Entity-Body, which is transmitted in clear text across the physical
>network used as the carrier. HTTP does not prevent additional
>authentication schemes and encryption mechanisms from being employed to
>increase security or the addition of enhancements (such as schemes to
>use one-time passwords) to Basic authentication.
>
>The most serious flaw in Basic authentication is that it results in the
>essentially clear text transmission of the user's password over the
>physical network.  It is this problem which Digest Authentication
>attempts to address.
>
>Because Basic authentication involves the clear text transmission of
>passwords it SHOULD never be used (without enhancements) to protect
>sensitive or valuable information.
>
>A common use of Basic authentication is for identification purposes --
>requiring the user to provide a user name and password as a means of
>identification, for example, for purposes of gathering accurate usage
>statistics on a server.  When used in this way it is tempting to think
>that there is no danger in its use if illicit access to the protected
>documents is not a major concern.  This is only correct if the server
>issues both user name and password to the users and in particular does
>not allow the user to choose his or her own password.  The danger
>arises
>because naive users frequently reuse a single password to avoid the
>task
>of maintaining multiple passwords.
>
>If a server permits users to select their own passwords, then the
>threat
>is not only illicit access to documents on the server but also illicit
>access to the accounts of all users who have chosen to use their
>account
>password.  If users are allowed to choose their own password that also
>means the server must maintain files containing the (presumably
>encrypted) passwords.  Many of these may be the account passwords of
>users perhaps at distant sites.  The owner or administrator of such a
>system could conceivably incur liability if this information is not
>maintained in a secure fashion.
>
>Basic Authentication is also vulnerable to spoofing by counterfeit
>servers.  If a user can be led to believe that he is connecting to a
>host containing information protected by basic authentication when in
>fact he is connecting to a hostile server or gateway then the attacker
>can request a password, store it for later use, and feign an error.
>This type of attack is not possible with Digest Authentication[26].
>Server implementers SHOULD guard against the possibility of this sort
>of
>counterfeiting by gateways or CGI scripts.  In particular it is very
>dangerous for a server to simply turn over a connection to a gateway
>since that gateway can then use the persistent connection mechanism to
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 122]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>engage in multiple transactions with the client while impersonating the
>original server in a way that is not detectable by the client.
>
>
>19.2 Safe Methods
>The writers of client software should be aware that the software
>represents the user in their interactions over the Internet, and should
>be careful to allow the user to be aware of any actions they may take
>which may have an unexpected significance to themselves or others.
>
>In particular, the convention has been established that the GET and
>HEAD
>methods should never have the significance of taking an action other
>than retrieval. These methods should be considered  "safe. " This
>allows
>user agents to represent other methods, such as POST, PUT and DELETE,
>in
>a special way, so that the user is made aware of the fact that a
>possibly unsafe action is being requested.
>
>Naturally, it is not possible to ensure that the server does not
>generate side-effects as a result of performing a GET request; in fact,
>some dynamic resources consider that a feature. The important
>distinction here is that the user did not request the side-effects, so
>therefore cannot be held accountable for them.
>
>
>19.3 Abuse of Server Log Information
>A server is in the position to save personal data about a user's
>requests which may identify their reading patterns or subjects of
>interest. This information is clearly confidential in nature and its
>handling may be constrained by law in certain countries. People using
>the HTTP protocol to provide data are responsible for ensuring that
>such
>material is not distributed without the permission of any individuals
>that are identifiable by the published results.
>
>
>19.4 Transfer of Sensitive Information
>Like any generic data transfer protocol, HTTP cannot regulate the
>content of the data that is transferred, nor is there any a priori
>method of determining the sensitivity of any particular piece of
>information within the context of any given request. Therefore,
>applications SHOULD supply as much control over this information as
>possible to the provider of that information. Four header fields are
>worth special mention in this context: Server, Via, Referer and From.
>
>Revealing the specific software version of the server may allow the
>server machine to become more vulnerable to attacks against software
>that is known to contain security holes. Implementers SHOULD make the
>Server header field a configurable option.
>
>Proxies which serve as a portal through a network firewall SHOULD take
>special precautions regarding the transfer of header information that
>identifies the hosts behind the firewall. In particular, they SHOULD
>remove, or replace with sanitized versions, any Via fields generated
>behind the firewall.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 123]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>The Referer field allows reading patterns to be studied and reverse
>links drawn. Although it can be very useful, its power can be abused if
>user details are not separated from the information contained in the
>Referer. Even when the personal information has been removed, the
>Referer field may indicate a private document's URI whose publication
>would be inappropriate.
>
>The information sent in the From field might conflict with the user's
>privacy interests or their site's security policy, and hence it SHOULD
>NOT be transmitted without the user being able to disable, enable, and
>modify the contents of the field. The user MUST be able to set the
>contents of this field within a user preference or application defaults
>configuration.
>
>We suggest, though do not require, that a convenient toggle interface
>be
>provided for the user to enable or disable the sending of From and
>Referer information.
>
>
>19.5 Attacks Based On File and Path Names
>Implementations of HTTP origin servers SHOULD be careful to restrict
>the
>documents returned by HTTP requests to be only those that were intended
>by the server administrators. If an HTTP server translates HTTP URIs
>directly into file system calls, the server MUST take special care not
>to serve files that were not intended to be delivered to HTTP clients.
>For example, UNIX, Microsoft Windows, and other operating systems use
>".." as a path component to indicate a directory level above the
>current
>one. On such a system, an HTTP server MUST disallow any such construct
>in the Request-URI if it would otherwise allow access to a resource
>outside those intended to be accessible via the HTTP server. Similarly,
>files intended for reference only internally to the server (such as
>access control files, configuration files, and script code) MUST be
>protected from inappropriate retrieval, since they might contain
>sensitive information. Experience has shown that minor bugs in such
>HTTP
>server implementations have turned into security risks.
>
>
>19.6 Personal Information
>HTTP clients are often privy to large amounts of personal information
>(e.g. the user's name, location, mail address, passwords, encryption
>keys, etc.), and SHOULD be very careful to prevent unintentional
>leakage
>of this information via the HTTP protocol to other sources.  We very
>strongly recommend that a convenient interface be provided for the user
>to control dissemination of such information, and that designers and
>implementers be particularly careful in this area. History shows that
>errors in this area are often both serious security and/or privacy
>problems, and often generate very adverse publicity for the
>implementer's company.
>
>
>19.7 Privacy Issues Connected to Accept headers
>Accept request headers can reveal information about the user to all
>servers which are accessed.  The Accept-Language header in particular
>can reveal information the user would consider to be of a private
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 124]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>nature, because the understanding of particular languages is often
>strongly correlated to the membership of a particular ethnic group.
>User agents which offer the option to configure the contents of an
>Accept-Language header to be sent in every request are strongly
>encouraged to let the configuration process include a message which
>makes the user aware of the loss of privacy involved.
>
>An approach that limits the loss of privacy would be for a user agent
>to
>omit the sending of  Accept-Language headers by default, and to ask the
>user whether it should start sending Accept-Language headers to a
>server
>if it detects, by looking for any Vary or Alternates response headers
>generated by the server, that such sending could improve the quality of
>service.
>
>Elaborate user-customized accept header fields sent in every request,
>in
>particular if these include quality values, can be used by servers as
>relatively reliable and long-lived user identifiers. Such user
>identifiers would allow content providers to do click-trail tracking,
>and would allow collaborating content providers to match cross-server
>click-trails or form submissions of individual users.  Note that for
>many users not behind a proxy, the network address of the host running
>the user agent will also serve as a long-lived user identifier.  In
>environments where proxies are used to enhance privacy, user agents
>should be conservative in offering accept header configuration options
>to end users.  As an extreme privacy measure, proxies could filter the
>accept headers in relayed requests.  General purpose user agents which
>provide a high degree of header configurability should warn users about
>the loss of privacy which can be involved.
>
>
>19.8 DNS Spoofing
>Clients using HTTP rely heavily on the Domain Name Service, and are
>thus
>generally prone to security attacks based on the deliberate miss-
>association of IP addresses and DNS names.  The deployment of DNSSEC
>should help this situation.  In advance of this deployment, however,
>clients need to be cautious in assuming the continuing validity of an
>IP
>number/DNS name association.
>
>In particular, HTTP clients SHOULD rely on their name resolver for
>confirmation of an IP number/DNS name association, rather than caching
>the result of previous host name lookups.  Many platforms already can
>cache host name lookups locally when appropriate, and they SHOULD be
>configured to do so.  These lookups should be cached, however, only
>when
>the TTL (Time To Live) information reported by the name server makes it
>likely that the cached information will remain useful.
>
>If HTTP clients cache the results of host name lookups in order to
>achieve a performance improvement, they MUST observe the TTL
>information
>reported by DNS.
>
>If HTTP clients do not observe this rule, they could be spoofed when a
>previously-accessed server's IP address changes.  As renumbering is
>expected to become increasingly common, the possibility of this form of
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 125]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>attack will grow.  Observing this requirement thus reduces this
>potential security vulnerability.
>
>This requirement also improves the load-balancing behavior of clients
>for replicated servers using the same DNS name and reduces the
>likelihood of a user's experiencing failure in accessing sites which
>use
>that strategy.
>
>
>19.9 Location Headers and Spoofing
>If a single server supports multiple organizations that do not trust
>one
>another, then it must check the values of Location and Content-Location
>headers in responses that are generated under control of said
>organizations to make sure that they do not attempt to invalidate
>resources over which they have no authority.
>
>
>20 Acknowledgments
>This specification makes heavy use of the augmented BNF and generic
>constructs defined by David H. Crocker for RFC 822 . Similarly, it
>reuses many of the definitions provided by Nathaniel Borenstein and Ned
>Freed for MIME . We hope that their inclusion in this specification
>will
>help reduce past confusion over the relationship between HTTP and
>Internet mail message formats.
>
>The HTTP protocol has evolved considerably over the past four years. It
>has benefited from a large and active developer community--the many
>people who have participated on the www-talk mailing list--and it is
>that community which has been most responsible for the success of HTTP
>and of the World-Wide Web in general. Marc Andreessen, Robert Cailliau,
>Daniel W. Connolly, Bob Denny, John Franks, Jean-Francois Groff,
>Phillip
>M. Hallam-Baker, Hakon W. Lie, Ari Luotonen, Rob McCool, Lou Montulli,
>Dave Raggett, Tony Sanders, and Marc VanHeyningen deserve special
>recognition for their efforts in defining early aspects of the
>protocol.
>
>This document has benefited greatly from the comments of all those
>participating in the HTTP-WG. In addition to those already mentioned,
>the following individuals have contributed to this specification:
>
>       Gary Adams                         Harald Tveit Alvestrand
>       Keith Ball                         Brian Behlendorf
>       Paul Burchard                      Maurizio Codogno
>       Mike Cowlishaw                     Roman Czyborra
>       Michael A. Dolan                   Alan Freier
>       Marc Hedlund                       Koen Holtman
>       Alex Hopmann                       Bob Jernigan
>       Shel Kaphan                        Rohit Khare
>       Martijn Koster                     Alexei Kosut
>       David M. Kristol                    Daniel LaLiberte
>       Paul J. Leach                      Albert Lunde
>       John C. Mallery                    Jean-Philippe Martin-Flatin
>       Larry Masinter                     Mitra
>       Gavin Nicol                        Scott Powers
>       Bill Perry                         Jeffrey Perry
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 126]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       Owen Rees                          Luigi Rizzo
>       David Robinson                     Marc Salomon
>       Rich Salz                          Jim Seidman
>       Chuck Shotton                      Eric W. Sink
>       Simon E. Spero                     Richard N. Taylor
>       Robert S. Thau                     Francois Yergeau
>       Mary Ellen Zurko                   David Morris
>       Greg Herlihy                       Bill (BearHeart) Weinman
>       Allan M. Schiffman
>
>
>Much of the content and presentation of the caching design is due to
>suggestions and comments from individuals including: Shel Kaphan, Paul
>Leach, Koen Holtman, David Morris, Larry Masinter, and Roy Fielding.
>
>Most of the specification of ranges is based on work originally done by
>Ari Luotonen and John Franks, with additional input from Steve Zilles
>and Roy Fielding.
>
>XXX need acks for subgroup work.
>
>
>
>
>21 References
>
>[1]     H. Alvestrand. "Tags for the identification of languages." RFC
>
>  1766, UNINETT, March 1995.
>
>[2]     F. Anklesaria, M. McCahill, P. Lindner, D. Johnson, D. Torrey,
>  B. Alberti. "The Internet Gopher Protocol: (a distributed document
>
>  search and retrieval protocol)", RFC 1436, University of Minnesota,
>  March 1993.
>
>[3]     T. Berners-Lee. "Universal Resource Identifiers in WWW" A
>
>  Unifying Syntax for the Expression of Names and Addresses of Objects
>  on the Network as used in the World-Wide Web." RFC 1630, CERN, June
>  1994.
>
>[4]     T. Berners-Lee, L. Masinter, M. McCahill.
>  "Uniform Resource Locators (URL)." RFC 1738, CERN, Xerox PARC,
>
>  University of Minnesota, December 1994.
>
>[5]     T. Berners-Lee, D. Connolly.
>  "HyperText Markup Language Specification - 2.0." RFC 1866, MIT/LCS,
>
>  November 1995.
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 127]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>[6]     T. Berners-Lee, R. Fielding, H. Frystyk.
>  "Hypertext Transfer Protocol - HTTP/1.0." Work in Progress (draft-
>
>  ietf-http-v10-spec-04.txt), MIT/LCS, UC Irvine, September 1995.
>
>[7]     N. Borenstein, N. Freed.
>  "MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms
>
>  for Specifying and Describing the Format of Internet Message Bodies."
>  RFC 1521, Bellcore, Innosoft, September 1993.
>
>[8]     R. Braden.
>  "Requirements for Internet hosts - application and support." STD 3,
>
>  RFC 1123, IETF, October 1989.
>
>[9]     D. H. Crocker.
>  "Standard for the Format of ARPA Internet Text Messages." STD 11, RFC
>
>  822, UDEL, August 1982.
>
>[10]    F. Davis, B. Kahle, H. Morris, J. Salem, T. Shen, R. Wang, J.
>  Sui, M. Grinbaum. "WAIS Interface Protocol Prototype Functional
>  Specification." (v1.5), Thinking Machines Corporation, April 1990.
>
>[11]    R. Fielding. "Relative Uniform Resource Locators." RFC 1808, UC
>
>  Irvine, June 1995.
>
>[12]    M. Horton, R. Adams.
>  "Standard for interchange of USENET messages." RFC 1036 (Obsoletes
>
>  RFC 850), AT&T Bell Laboratories, Center for Seismic Studies,
>  December 1987.
>
>[13]    B. Kantor, P. Lapsley. "Network News Transfer Protocol A
>
>  Proposed Standard for the Stream-Based Transmission of News." RFC
>  977, UC San Diego, UC Berkeley, February 1986.
>
>[14]    K. Moore. "MIME (Multipurpose Internet Mail Extensions) Part
>Two
>
>  : Message Header Extensions for Non-ASCII Text." RFC 1522, University
>  of Tennessee, September 1993.
>
>[15]    E. Nebel, L. Masinter. "Form-based File Upload in HTML." RFC
>
>  1867, Xerox Corporation, November 1995.
>
>[16]    J. Postel. "Simple Mail Transfer Protocol." STD 10, RFC 821,
>
>  USC/ISI, August 1982.
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 128]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>[17]    J. Postel. "Media Type Registration Procedure." RFC 1590,
>
>  USC/ISI, March 1994.
>
>[18]    J. Postel, J. K. Reynolds. "File Transfer Protocol (FTP)" STD
>9,
>
>  RFC 959, USC/ISI, October 1985.
>
>[19]    J. Reynolds, J. Postel. "Assigned Numbers." STD 2, RFC 1700,
>
>  USC/ISI, October 1994.
>
>[20]    K. Sollins, L. Masinter.
>  "Functional Requirements for Uniform Resource Names." RFC 1737,
>
>  MIT/LCS, Xerox Corporation, December 1994.
>
>[21]    US-ASCII. Coded Character Set - 7-Bit American Standard Code
>for
>  Information Interchange. Standard ANSI X3.4-1986, ANSI, 1986.
>
>[22]    ISO-8859. International Standard -- Information Processing --
>  8-bit Single-Byte Coded Graphic Character Sets --
>  Part 1: Latin alphabet No. 1, ISO 8859-1:1987.
>  Part 2: Latin alphabet No. 2, ISO 8859-2, 1987.
>  Part 3: Latin alphabet No. 3, ISO 8859-3, 1988.
>  Part 4: Latin alphabet No. 4, ISO 8859-4, 1988.
>  Part 5: Latin/Cyrillic alphabet, ISO 8859-5, 1988.
>  Part 6: Latin/Arabic alphabet, ISO 8859-6, 1987.
>  Part 7: Latin/Greek alphabet, ISO 8859-7, 1987.
>  Part 8: Latin/Hebrew alphabet, ISO 8859-8, 1988.
>  Part 9: Latin alphabet No. 5, ISO 8859-9, 1990.
>
>[23]    Meyers, M. Rose "The Content-MD5 Header Field." RFC 1864,
>
>  Carnegie Mellon, Dover Beach Consulting, October, 1995.
>
>[24]    B. Carpenter, Y. Rekhter, "Renumbering Needs Work". RFC 1900,
>
>  IAB, February 1996.
>
>[25]    Gzip is available from the GNU project at
>  <URL:ftp://prep.ai.mit.edu/pub/gnu/>.  A more formal specification is
>
>  currently a work in progress.
>
>[26]    Work In Progress for Digest authentication of the IETF HTTP
>  working group.
>
>[27]    TBS, Work in progress (XXX should put RFC in here_ )
>
>[28]    Mills, D, "Network Time Protocol, Version 3", Specification,
>
>  Implementation and Analysis RFC 1305, University of Delaware, March,
>  1992.
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 129]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>[29]    Work in progress of the HTTP working group (XXX is this correct
>  reference for incomplete work?).
>
>[30]    S. Spero. "Analysis of HTTP Performance Problems"
>  <URL:http://sunsite.unc.edu/mdma-release/http-prob.html>
>
>[31]    E. Rescorla, A. Schiffman "The Secure HyperText Transfer
>  Protocol" Internet-Draft (work in progress).
>
>[32]    A. Freier, P Karlton, P. Kocher. "SSL Version 3.0" Internet-
>  Draft" (work in progress).
>
>[33]    Jeffrey C. Mogul. "The Case for Persistent-Connection HTTP". 
>In
>  Proc.SIGCOMM '95 Symposium on Communications Architectures and
>  Protocols, pages 299-313. Cambridge, MA, August, 1995.
>
>[34]    Jeffrey C. Mogul. "The Case for Persistent-Connection HTTP".
>  Research, Report 95/4, Digital Equipment Corporation Western Research
>  Laboratory, May, 1995.,
>  <URL
>  :http://www.research.digital.com/wrl/techreports/abstracts/95.4.html>
>
>
>[35]    Work in progress of the HTTP working group on state management.
>
>22 Authors' Addresses
>
>Roy T. Fielding
>
>Department of Information and Computer Science
>University of California
>Irvine, CA 92717-3425, USA
>Fax: +1 (714) 824-4056
>Email: fielding@ics.uci.edu
>
>Henrik Frystyk Nielsen
>
>W3 Consortium
>MIT Laboratory for Computer Science
>545 Technology Square
>Cambridge, MA 02139, USA
>Fax: +1 (617) 258 8682
>Email: frystyk@w3.org
>
>Tim Berners-Lee
>
>Director, W3 Consortium
>MIT Laboratory for Computer Science
>545 Technology Square
>Cambridge, MA 02139, USA
>Fax: +1 (617) 258 8682
>Email: timbl@w3.org
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 130]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>Jim Gettys
>
>MIT Laboratory for Computer Science
>545 Technology Square
>Cambridge, MA 02139, USA
>Fax: +1 (617) 258 8682
>Email: jg@w3.org
>
>Jeffrey C. Mogul
>
>Western Research Laboratory
>Digital Equipment Corporation
>250 University Avenue
>Palo Alto, California, 94305, U.S.A.
>Email: mogul@wrl.dec.com
>
>
>
>
>23 Appendices
>These appendices are provided for informational reasons only -- they do
>not form a part of the HTTP/1.1 specification.
>
>
>23.1 Internet Media Type message/http
>In addition to defining the HTTP/1.1 protocol, this document serves as
>the specification for the Internet media type "message/http". The
>following is to be registered with IANA .
>
>       Media Type name:         message
>       Media subtype name:      http
>       Required parameters:     none
>       Optional parameters:     version, msgtype
>
>              version: The HTTP-Version number of the enclosed message
>                       (e.g., "1.1"). If not present, the version can
>be
>                       determined from the first line of the body.
>
>              msgtype: The message type -- "request" or "response". If
>not
>                       present, the type can be determined from the
>first
>                       line of the body.
>
>       Encoding considerations: only "7bit", "8bit", or "binary" are
>                                permitted
>
>       Security considerations: none
>
>
>23.2 Tolerant Applications
>Although this document specifies the requirements for the generation of
>HTTP/1.1 messages, not all applications will be correct in their
>implementation. We therefore recommend that operational applications be
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 131]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>tolerant of deviations whenever those deviations can be interpreted
>unambiguously.
>
>Clients SHOULD be tolerant in parsing the Status-Line and servers
>tolerant when parsing the Request-Line. In particular, they SHOULD
>accept any amount of SP or HT characters between fields, even though
>only a single SP is required.
>
>The line terminator for HTTP-header fields is the sequence CRLF.
>However, we recommend that applications, when parsing such headers,
>recognize a single LF as a line terminator and ignore the leading CR.
>
>
>23.3 Differences Between  HTTP Bodies and RFC 1521 Internet Message
>Bodies
>HTTP/1.1 uses many of the constructs defined for Internet Mail (RFC 822
>) and the Multipurpose Internet Mail Extensions (MIME ) to allow
>entities to be transmitted in an open variety of representations and
>with extensible mechanisms. However, RFC 1521 discusses mail, and HTTP
>has a few features that are different than those described in RFC 1521.
>These differences were carefully chosen to optimize performance over
>binary connections, to allow greater freedom in the use of new media
>types, to make date comparisons easier, and to acknowledge the practice
>of some early HTTP servers and clients.
>
>At the time of this writing, it is expected that RFC 1521 will be
>revised. The revisions may include some of the practices found in
>HTTP/1.1 but not in RFC 1521.
>
>This appendix describes specific areas where HTTP differs from RFC
>1521.
>Proxies and gateways to strict MIME environments SHOULD be aware of
>these differences and provide the appropriate conversions where
>necessary. Proxies and gateways from MIME environments to HTTP also
>need
>to be aware of the differences because some conversions may be
>required.
>
>
>23.3.1 Conversion to Canonical Form
>RFC 1521 requires that an Internet mail entity be converted to
>canonical
>form prior to being transferred, as described in Appendix G of RFC 1521
>. Section 7.7.1 of this document describes the forms allowed for
>subtypes of the "text" media type when transmitted over HTTP.  RFC 1521
>requires that content with a  typeof "text" represent line breaks as
>CRLF and forbids the use of CR or LF outside of line break sequences.
>HTTP allows CRLF, bare CR, and bare LF to indicate a line break within
>text content when a message is transmitted over HTTP.
>
>Where it is possible, a proxy or gateway from HTTP to a strict RFC 1521
>environment SHOULD translate all line breaks within the text media
>types
>described in section 7.7.1 of this document to the RFC 1521 canonical
>form of CRLF. Note, however, that this may be complicated by the
>presence of a Content-Encoding and by the fact that HTTP allows the use
>of some character sets which do not use octets 13 and 10 to represent
>CR
>and LF, as is the case for some multi-byte character sets.
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 132]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>23.3.2 Conversion of Date Formats
>HTTP/1.1 uses a restricted set of date formats (section 7.3.1) to
>simplify the process of date comparison. Proxies and gateways from
>other
>protocols SHOULD ensure that any Date header field present in a message
>conforms to one of the HTTP/1.1 formats and rewrite the date if
>necessary.
>
>
>23.3.3 Introduction of Content-Encoding
>RFC 1521 does not include any concept equivalent to HTTP/1.1's Content-
>Encoding header field. Since this acts as a modifier on the media type,
>proxies and gateways from HTTP to MIME-compliant protocols MUST either
>change the value of the Content-Type header field or decode the Entity-
>Body before forwarding the message. (Some experimental applications of
>Content-Type for Internet mail have used a media-type parameter of
>";conversions=<content-coding>" to perform an equivalent function as
>Content-Encoding. However, this parameter is not part of RFC 1521.)
>
>
>23.3.4 No Content-Transfer-Encoding
>HTTP does not use the Content-Transfer-Encoding (CTE) field of RFC
>1521.
>Proxies and gateways from MIME-compliant protocols to HTTP MUST remove
>any non-identity CTE ("quoted-printable" or "base64") encoding prior to
>delivering the response message to an HTTP client.
>
>Proxies and gateways from HTTP to MIME-compliant protocols are
>responsible for ensuring that the message is in the correct format and
>encoding for safe transport on that protocol, where "safe transport" is
>defined by the limitations of the protocol being used. Such a proxy or
>gateway SHOULD label the data with an appropriate Content-Transfer-
>Encoding if doing so will improve the likelihood of safe transport over
>the destination protocol.
>
>
>23.3.5 HTTP Header Fields in Multipart Body-Parts
>In RFC 1521, most header fields in multipart body-parts are generally
>ignored unless the field name begins with "Content-". In HTTP/1.1,
>multipart body-parts may contain any HTTP header fields which are
>significant to the meaning of that part.
>
>
>23.3.6 Introduction of Transfer-Encoding
>HTTP/1.1 introduces the Transfer-Encoding header field (section 18.43).
>Proxies/gateways MUST remove any transfer coding prior to forwarding a
>message via a MIME-compliant protocol. The process for decoding the
>"chunked" transfer coding (section 7.6) can be represented in pseudo-
>code as:
>
>       length := 0
>       read chunk-size and CRLF
>       while (chunk-size > 0) {
>          read chunk-data and CRLF
>          append chunk-data to Entity-Body
>          length := length + chunk-size
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 133]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>          read chunk-size and CRLF
>       }
>       read entity-header
>       while (entity-header not empty) {
>          append entity-header to existing header fields
>          read entity-header
>       }
>       Content-Length := length
>       Remove "chunked" from Transfer-Encoding
>
>
>
>
>23.3.7 MIME-Version
>HTTP is not a MIME-compliant protocol (see Appendix 23.3). However,
>HTTP/1.1 messages may include a single MIME-Version general-header
>field
>to indicate what version of the MIME protocol was used to construct the
>message. Use of the MIME-Version header field indicates that the
>message
>is in full compliance with the MIME protocol (as defined in ).
>Proxies/gateways are responsible for ensuring full compliance (where
>possible) when exporting HTTP messages to strict MIME environments.
>
>       MIME-Version   = "MIME-Version" ":" 1*DIGIT "." 1*DIGIT
>
>MIME version "1.0" is the default for use in HTTP/1.1. However,
>HTTP/1.1
>message parsing and semantics are defined by this document and not the
>MIME specification.
>
>
>23.4 Changes from HTTP/1.0
>This section will summarize major differences between versions HTTP/1.0
>and HTTP/1.1.
>
>
>23.4.1 Changes to Simplify Multi-homed Web Servers and Conserve IP
>Addresses
>The requirements that clients and servers support the Host  request-
>header, report an error if the Host request-header (section 18.24) is
>missing from an HTTP/1.1 request,  and accept absolute URIs (Section
>9.1.2) are among the most important changes from HTTP/1.0.
>
>In HTTP/1.0 there is a one-to-one relationship of IP addresses and
>servers. There is no other way to distinguish the intended server of a
>request than the IP address to which that request is directed. The
>HTTP/1.1 change will allow the Internet, once HTTP/1.0 clients and
>servers are no longer common, to support multiple Web sites from a
>single IP address, greatly simplifying large operational Web servers,
>where allocation of many IP addresses to a single  host has created
>serious problems.  The Internet will also be able to recover the IP
>addresses that have been used for the sole purpose of allowing root-
>level domain names to be used in HTTP URLs. Given the rate of growth of
>the Web, and the number of servers already deployed, it is extremely
>important that implementations of HTTP/1.1 correctly implement these
>new
>requirements:
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 134]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>  .  both clients and servers MUST support the Host request-header
>
>  .  Host request-headers are required in HTTP/1.1 requests.
>
>  .  servers MUST report an error if an HTTP/1.1 request does not
>     include a Host request-header
>
>  .  servers MUST accept absolute URIs
>
>23.5 Additional Features
>This appendix documents protocol elements used by some existing HTTP
>implementations, but not consistently and correctly across most
>HTTP/1.1
>applications. Implementers should be aware of these features, but
>cannot
>rely upon their presence in, or interoperability with, other HTTP/1.1
>applications.  Some of these describe proposed experimental features,
>and some describe features that experimental deployment found lacking
>that are now addressed in the base HTTP/1.1 specification.
>
>
>23.5.1 Additional Request Methods
>
>23.5.1.1 PATCH
>The PATCH method is similar to PUT except that the entity contains a
>list of differences between the original version of the resource
>identified by the Request-URI and the desired content of the resource
>entity  after the PATCH action has been applied. The list of
>differences
>is in a format defined by the media type of the entity (e.g.,
>"application/diff") and MUST include sufficient information to allow
>the
>server to recreate the changes necessary to convert the original
>version
>of the resource entity to the desired version.
>
>If the request passes through a cache and the Request-URI identifies a
>currently cached entity, that entity MUST be removed from the cache.
>Responses to this method are not cachable.
>
>For compatibility with HTTP/1.0 applications, all PATCH requests MUST
>include a valid Content-Length header field unless the server is known
>to be HTTP/1.1 compliant. When sending a PATCH request to an HTTP/1.1
>server, a client MUST use a valid Content-Length or the "chunked"
>Transfer-Encoding. The server SHOULD respond with a 400 (Bad Request)
>message if it cannot determine the length of the request message's
>content, or with 411 (Length Required) if it wishes to insist on
>receiving a valid Content-Length.
>
>The actual method for determining how the patched resource is placed,
>and what happens to its predecessor, is defined entirely by the origin
>server. If the original version of the resource being patched included
>a
>Content-Version header field, the request entity MUST include a
>Derived-
>From header field corresponding to the value of the original Content-
>Version header field. Applications are encouraged to use these fields
>for constructing versioning relationships and resolving version
>conflicts.
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 135]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>PATCH requests must obey the entity transmission requirements set out
>in
>section 13.4.1.
>
>Caches that implement PATCH should invalidate cached responses as
>defined in section 16.10 for PUT.
>
>
>23.5.1.2 LINK
>The LINK method establishes one or more Link relationships between the
>existing resource identified by the Request-URI and other existing
>resources. The difference between LINK and other methods allowing links
>to be established between resources is that the LINK method does not
>allow any Entity-Body to be sent in the request and does not directly
>result in the creation of new resources.
>
>If the request passes through a cache and the Request-URI identifies a
>currently cached entity, that entity MUST be removed from the cache.
>Responses to this method are not cachable.
>
>Caches that implement LINK should invalidate cached responses as
>defined
>in section 16.10 for PUT.
>
>
>23.5.1.3 UNLINK
>The UNLINK method removes one or more Link relationships from the
>existing resource identified by the Request-URI. These relationships
>may
>have been established using the LINK method or by any other method
>supporting the Link header. The removal of a link to a resource does
>not
>imply that the resource ceases to exist or becomes inaccessible for
>future references.
>
>If the request passes through a cache and the Request-URI identifies a
>currently cached entity, that entity MUST be removed from the cache.
>Responses to this method are not cachable.
>
>Caches that implement UNLINK should invalidate cached responses as
>defined in section 16.10 for PUT.
>
>
>23.5.1.4 PUT
>To support the PATCH method, if the entity being PUT was derived from
>an
>existing resource which included a Content-Version header field, the
>new
>entity MUST include a Derived-From header field corresponding to the
>value of the original Content-Version header field. Multiple Derived-
>From values may be included if the entity was derived from multiple
>resources with Content-Version information. Applications are encouraged
>to use these fields for constructing versioning relationships and
>resolving version conflicts.
>
>
>23.5.2 Additional Header Field Definitions
>
>23.5.2.1 Content-Version
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 136]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>The Content-Version entity-header field defines the version tag
>associated with a rendition of an evolving entity. Together with the
>Derived-From field described in section 23.5.2.2, it allows a group of
>people to work simultaneously on the creation of a work as an iterative
>process. The field SHOULD be used to allow evolution of a particular
>work along a single path. It SHOULD NOT be used to indicate derived
>works or renditions in different representations. It MAY also me used
>as
>an opaque value for comparing a cached entity's version with that of
>the
>current resource entity.
>
>       Content-Version = "Content-Version" ":" quoted-string
>
>Examples of the Content-Version field include:
>
>       Content-Version: "2.1.2"
>       Content-Version: "Fred 19950116-12:26:48"
>       Content-Version: "2.5a4-omega7"
>
>The value of the Content-Version field SHOULD be considered opaque to
>all parties but the origin server. A user agent MAY suggest a value for
>the version of an entity transferred via a PUT request; however, only
>the origin server can reliably assign that value.
>
>
>23.5.2.2 Derived-From
>The Derived-From entity-header field can be used to indicate the
>version
>tag of the resource from which the enclosed entity was derived before
>modifications were made by the sender. This field is used to help
>manage
>the process of merging successive changes to a resource, particularly
>when such changes are being made in parallel and from multiple sources.
>
>       Derived-From   = "Derived-From" ":" quoted-string
>
>An example use of the field is:
>
>       Derived-From: "2.1.1"
>
>The Derived-From field is required for PUT and PATCH requests if the
>entity being sent was previously retrieved from the same URI and a
>Content-Version header was included with the entity when it was last
>retrieved.
>
>
>23.5.2.3 Link
>The Link entity-header field provides a means for describing a
>relationship between two resources, generally between the requested
>resource and some other resource. An entity MAY include multiple Link
>values. Links at the metainformation level typically indicate
>relationships like hierarchical structure and navigation paths. The
>Link
>field is semantically equivalent to the <LINK> element in HTML .
>
>       Link           = "Link" ":" #("<" URI ">" *( ";" link-param )
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 137]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>       link-param     = ( ( "rel" "=" relationship )
>                          | ( "rev" "=" relationship )
>                          | ( "title" "=" quoted-string )
>                          | ( "anchor" "=" <"> URI <"> )
>                          | ( link-extension ) )
>
>       link-extension = token [ "=" ( token | quoted-string ) ]
>
>       relationship   = sgml-name
>                      | ( <"> sgml-name *( SP sgml-name) <"> )
>
>       sgml-name      = ALPHA *( ALPHA | DIGIT | "." | "-" )
>
>Relationship values are case-insensitive and MAY be extended within the
>constraints of the sgml-name syntax. The title parameter MAY be used to
>label the destination of a link such that it can be used as
>identification within a human-readable menu. The anchor parameter MAY
>be
>used to indicate a source anchor other than the entire current
>resource,
>such as a fragment of this resource or a third resource.
>
>Examples of usage include:
>
>       Link: <http://www.cern.ch/TheBook/chapter2>; rel="Previous"
>
>       Link: <mailto:timbl@w3.org>; rev="Made"; title="Tim Berners-Lee"
>
>The first example indicates that chapter2 is previous to this resource
>in a logical navigation path. The second indicates that the person
>responsible for making the resource available is identified by the
>given
>e-mail address.
>
>
>23.5.2.4 URI
>The URI header field has, in past versions of this specification, been
>used as a combination of the existing Location, Content-Location, and
>Alternates header fields. Its primary purpose has been to include a
>list
>of additional URIs for the resource, including names and mirror
>locations.  However, it has become clear that the combination of many
>different functions within this single field has been a barrier to
>consistently and correctly implementing any of those functions.
>Furthermore, we believe that the identification of names and mirror
>locations would be better performed via the Link header field. The URI
>header field is therefore deprecated in favor of those other fields.
>
>       URI-header    = "URI" ":" 1#( "<" URI ">" )
>
>
>23.5.2.5 Compatibility with HTTP/1.0 Persistent Connections
>Some clients and servers may wish to be compatible with some previous
>implementations of persistent connections in HTTP/1.0 clients and
>servers.  These implementations are faulty, and the new facilities in
>HTTP/1.1 are designed to rectify these problems.   The fear was that
>some existing 1.0 clients may be sending Keep-Alive to a proxy server
>that doesn't understand Connection, which would then erroneously
>forward
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 138]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>it to the next inbound server, which would establish the Keep-Alive
>connection and result in a dead 1.0 proxy waiting for the close on the
>response.  The result is that 1.0 clients must be prevented from using
>Keep-Alive when talking to proxies.
>
>However, talking to proxies is the most important use of persistent
>connections, so that is clearly unacceptable.  Therefore, we need some
>other mechanism for indicating a persistent connection is desired,
>which
>is safe to use even when talking to an old proxy that ignores
>Connection.  As it turns out, there are two ways to accomplish that:
>
>1. 
>  Introduce a new keyword (persist) which is declared to be valid only
>  when received from an HTTP/1.1 message.
>
>2. 
>  Declare persistence to be the default for HTTP/1.1 messages and
>  introduce a new keyword (close) for declaring non-persistence.
>
>The following describes the original, buggy form of persistent
>connections.
>
>When connecting to an origin server an HTTP client MAY send the Keep-
>Alive connection-token in addition to the Persist connection-token:
>
>       Connection: Keep-Alive,Persist
>
>An HTTP/1.0 server would then respond with the Keep-Alive connection
>token and the client may proceed with an HTTP/1.0 (or Keep-Alive)
>persistent connection.
>
>An HTTP/1.1 server may also establish persistent connections with
>HTTP/1.0 clients upon receipt of a Keep-Alive connection token.
>However, a persistent connection with an HTTP/1.0 client cannot make
>use
>of the chunked transfer-coding, and therefore MUST use a Content-Length
>for marking the ending boundary of each Entity-Body.
>
>A client MUST NOT send the Keep-Alive connection token to a proxy
>server
>as HTTP/1.0 proxy servers do not obey the rules of HTTP/1.1 for parsing
>the Connection header field.
>
>
>23.5.2.5.1 The Keep-Alive Header
>When the Keep-Alive connection-token has been transmitted with a
>request
>or a response a Keep-Alive header field MAY also be included. The Keep-
>Alive header field takes the following form:
>
>       Keep-Alive-header = "Keep-Alive" ":" 0# keepalive-param
>
>       keepalive-param = param-name "=" value
>
>The Keep-Alive header itself is optional, and is used only if a
>parameter is being sent. HTTP/1.1 does not define any parameters.
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 139]
>
>
>
>INTERNET-DRAFT            HTTP/1.1      Friday, May 03, 1996
>
>
>If the Keep-Alive header is sent, the corresponding connection token
>MUST be transmitted. The Keep-Alive header MUST be ignored if received
>without the connection token.
>
>
>23.5.3 Compatibility with Previous Versions
>It is beyond the scope of a protocol specification to mandate
>compliance
>with previous versions.  HTTP/1.1 was deliberately designed, however,
>to
>make supporting previous versions easy.  While we are contemplating a
>separate document containing advice to implementers, we feel it worth
>noting that at the time of composing this specification, we would
>expect
>commercial HTTP/1.1 servers to:
>
>
>  .  recognize the format of the Request-Line for HTTP/0.9, 1.0, and
>1.1
>     requests;
>
>  .  understand any valid request in the format of HTTP/0.9, 1.0, or
>     1.1;
>
>  .  respond appropriately with a message in the same major version
>used
>     by the client.
>And  we would expect HTTP/1.1 clients to:
>
>
>  .  recognize the format of the Status-Line for HTTP/1.0 and 1.1
>     responses;
>
>  .  understand any valid response in the format of HTTP/0.9, 1.0, or
>     1.1.
>For most implementations of HTTP/1.0, each connection is established by
>the client prior to the request and closed by the server after sending
>the response.  A few implementations implement the Keep-Alive version
>of
>persistent connections described in section 23.5.2.5.1.
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>Fielding, Frystyk, Berners-Lee, Gettys, and Mogul [Page 140]
>
>

Received on Friday, 3 May 1996 00:52:35 UTC