Internet DRAFT - draft-snell-httpbis-mget

draft-snell-httpbis-mget







Network Working Group                                         J.M. Snell
Internet-Draft                                            March 12, 2013
Intended status: Informational
Expires: September 13, 2013


HTTP/2.0 Discussion: Using Multiple Request URI's in Idempotent and Safe
                                Requests
                      draft-snell-httpbis-mget-00

Abstract

   This memo describes a proposed mechanism for specifying multiple
   request URI's within Idempotent methods (i.e.  "Multi-GET", "Multi-
   Delete")

Status of This Memo

   This Internet-Draft is submitted to IETF in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at http://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted 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."

   This Internet-Draft will expire on September 13, 2013.

Copyright Notice

   Copyright (c) 2013 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (http://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.

Table of Contents

   1.  Using Multiple-Request URIs . . . . . . . . . . . . . . . . .   2



Snell                  Expires September 13, 2013               [Page 1]

Internet-Draft          application/merge-patch               March 2013


     1.1.  "Globbed" Requests  . . . . . . . . . . . . . . . . . . .   5
   2.  Security Considerations . . . . . . . . . . . . . . . . . . .   6
   3.  Normative References  . . . . . . . . . . . . . . . . . . . .   6
   Author's Address  . . . . . . . . . . . . . . . . . . . . . . . .   6

1.  Using Multiple-Request URIs

   This document introduces the concept of allowing Idempotent and Safe
   HTTP/2 requests to contain multiple, independent Request URIs.  For
   example, if a User-Agent wishes to retrieve multiple image resources
   from a server, it could send a single GET request separately listing
   each of the resources being requested:

                      An example "Multi-GET" request

            +---------+--------------------------------------+
            | Header  | Value                                |
            +---------+--------------------------------------+
            | :method | GET                                  |
            | :path   | "/images/foo.png", "/images/bar.png" |
            | :host   | example.org                          |
            +---------+--------------------------------------+


   Upon receiving this request, a server supporting multiple Request
   URIs would respond by initiating two distinct response streams back
   to the requesting-user agent, one for each of the requested
   resources:

    UA             SERVER
   ----------------------
     |                |
     |  MGET REQUEST  |
     |--------------->|
     |                |
     | Resp#1:foo.png |
     |<---------------|
     | Resp#2:bar.png |
     |<---------------|
     |                |











Snell                  Expires September 13, 2013               [Page 2]

Internet-Draft          application/merge-patch               March 2013


   This singular Multiple-GET request is semantically equivallent to
   sending two simultaneous, separate GET requests for each of the two
   resources.  There is no implicit or explicit ordering or relationship
   between the resources being requested.  Each has their own distinct
   response stream, with it's own headers and response status code.  The
   server can choose to return the requested resources in any order it
   chooses.

    All request header fields included in the request apply equally to
      each of the listed request URIs.  To perform a conditional GET
     request using the If-None-Match request header, for example, the
     entity tags for each of the requested resources would be listed:

       +---------------+-------------------------------------------+
       | Header        | Value                                     |
       +---------------+-------------------------------------------+
       | :method       | GET                                       |
       | :path         | "/images/foo.png", "/images/bar.png"      |
       | :host         | example.org                               |
       | if-none-match | "some-opaque-etag", "another-opaque-etag" |
       +---------------+-------------------------------------------+


   The condition would be evaluated for each of the requested URIs; that
   is, each of the listed Entity Tags would be evaluated against each of
   the individual requested resources, preserving the existing semantics
   of the conditional headers and enforcing the notion that a Multi-GET
   is semantically equivalent to multiple, simultaneous independent GET
   requests.

   Because each of the requested resources are returned using separately
   identifiable response streams, each with their own set of metadata,
   response status codes and data frames, intermediate caches with
   support for Multiple Request URIs can simply and transparently "do
   the right thing".

    UA             CACHE            SERVER
   ----------------------------------------
     |                |                |
     |  MGET REQUEST  |                |
     |foo.png, bar.png|                |
     |--------------->|  GET REQUEST   |
     |                |    bar.png     |
     | Resp#1:foo.png |--------------->|
     |<---------------|                |
     |                |  Resp:bar.png  |
     | Resp#2:bar.png |<---------------|
     |<---------------|                |



Snell                  Expires September 13, 2013               [Page 3]

Internet-Draft          application/merge-patch               March 2013


     |                |                |


   Here, the intermediate cache receives the initial GET containing
   multiple request URIs and determines that one of the resources
   (foo.png) can be served from it's cache, while the second (bar.png)
   needs to be fetched from the origin server.  From the User-Agents
   point of view, this action is entirely transparent.

   Because such requests are semantically equivalent to multiple,
   simultaneous individual requests, translating to and from HTTP/1
   becomes a simple matter of splitting out each request URI into its
   own distinct HTTP/1 request, each with its own exact copy of the full
   set of request header fields.  Intermediaries should be able to
   handle the translation in a manner that is completely transparent to
   the User-Agent.

    UA             PROXY            SERVER
   ----------------------------------------
     |                |                |
     |  MGET REQUEST  |                |
     |foo.png, bar.png|                |
     |--------------->|  GET REQUEST   |
     |                |    foo.png     |
     |                |--------------->|
     |                |  GET REQUEST   |
     |                |    bar.png     |
     |                |--------------->|
     |                |  Resp:foo.png  |
     |                |<---------------|
     | Resp#1:foo.png |                |
     |<---------------|  Resp:bar.png  |
     | Resp#2:bar.png |<---------------|
     |<---------------|                |
     |                |                |


   Multiple Request URIs are only permitted on requests methods that are
   known to be both Safe and Idempotent with one notable exception: The
   DELETE method, which is Idempotent but not Safe MAY include multiple
   request URIs.

                      An example Multi-HEAD Request:








Snell                  Expires September 13, 2013               [Page 4]

Internet-Draft          application/merge-patch               March 2013


            +---------+--------------------------------------+
            | Header  | Value                                |
            +---------+--------------------------------------+
            | :method | HEAD                                 |
            | :path   | "/images/foo.png", "/images/bar.png" |
            | :host   | example.org                          |
            +---------+--------------------------------------+


                     An example Multi-DELETE Request:

            +---------+--------------------------------------+
            | Header  | Value                                |
            +---------+--------------------------------------+
            | :method | DELETE                               |
            | :path   | "/images/foo.png", "/images/bar.png" |
            | :host   | example.org                          |
            +---------+--------------------------------------+


   In particular, Multiple Request URIs MUST NOT ever be used for POST
   or PUT requests and SHOULD NOT be used for any other request method
   carrying a request entity unless the method is known to be both Safe
   and Idempotent.

   Server support for Multiple-Request URIs within HTTP/2
   implementations ought to be required.  If, however, the working group
   decides that the mechanism is to be optional, a server endpoint not
   supporting multiple request URIs can return a 400 "Bad Request" error
   when it receives such requests.  A mechanism such as Mark
   Nottingham's proposed "Browser Hints" format can be used to
   communicate to User-Agents whether or not multiple request URIs are
   supported on a given host.

   Whether and when to bundle multiple request URIs into a single GET
   request is entirely up to the requesting HTTP/2 client.  A user-agent
   that is attempting to optimize page load times, for instance, could
   choose to send a mix of multi- and single-request URI requests to the
   server depending on whatever strategy it chooses for optimization.

1.1.  "Globbed" Requests

   This document specifically rules out the notion of "globbed" Multi-
   Requests.  That is, sending a request with a single "wildcard"
   request URI that returns multiple independent streams, e.g.:

                      An example "Multi-GET" request




Snell                  Expires September 13, 2013               [Page 5]

Internet-Draft          application/merge-patch               March 2013


                       +---------+-----------------+
                       | Header  | Value           |
                       +---------+-----------------+
                       | :method | GET             |
                       | :path   | "/images/*.png" |
                       | :host   | example.org     |
                       +---------+-----------------+


   The reason this is not defined is because such requests play havoc
   with the existing HTTP Caching Model, greatly complicates
   implementation and carries with it a variety of security risks.

2.  Security Considerations

   TBD

3.  Normative References

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119, March 1997.

Author's Address

   James M Snell

   Email: jasnell@gmail.com























Snell                  Expires September 13, 2013               [Page 6]