<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
   <!ENTITY rfc2119 SYSTEM 'bibxml/reference.RFC.2119.xml'>
   <!ENTITY rfc2246 SYSTEM 'bibxml/reference.RFC.2246.xml'>
   <!ENTITY rfc2396 SYSTEM 'bibxml/reference.RFC.2396.xml'>
   <!ENTITY rfc2616 SYSTEM 'bibxml/reference.RFC.2616.xml'>
   <!ENTITY rfc2617 SYSTEM 'bibxml/reference.RFC.2617.xml'>
   <!ENTITY rfc3023 SYSTEM 'bibxml/reference.RFC.3023.xml'>
   <!ENTITY rfc3339 SYSTEM 'bibxml/reference.RFC.3339.xml'>
   <!ENTITY rfc3986 SYSTEM 'bibxml/reference.RFC.3986.xml'>
   <!ENTITY rfc3987 SYSTEM 'bibxml/reference.RFC.3987.xml'>
   <!ENTITY SOAP SYSTEM 'bibxml/reference.W3C.REC-soap12-part1-20030624.xml'>
   <!ENTITY SOAP2 SYSTEM 'bibxml/reference.W3C.REC-soap12-part2-20030624.xml'>
   <!ENTITY WEBARCH SYSTEM 'bibxml/reference.W3C.REC-webarch-20041215.xml'>
   <!ENTITY XML SYSTEM 'bibxml/reference.W3C.REC-xml-20040204.xml'>
]>
<!-- 

$LastChangedDate: 2005-05-09 20:59:38 -0400 (Mon, 09 May 2005) $
$LastChangedRevision: 100 $

--> 

<!--<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>-->

<?rfc toc="yes" ?>
<?rfc symrefs="yes" ?>
<?rfc sortrefs="yes"?>
<?rfc iprnotified="yes" ?>
<?rfc strict="yes" ?>
<?rfc compact="no" ?>
<?rfc comments="yes" ?>
<?rfc inline="yes" ?>
<?rfc tocdepth="3" ?>
<!-- 
1. Update the docName
2. Update the date
3. Update the Revision History.
-->
<!-- To Do
x 1. change <delete> to DELETE
    x 2. Update RSD to 1.0 "location" att name to "apiLink" or drop 
    x 3. Put all documents in a namespace
    x 4. Do aarons search interface.
    5. Add in all the right headers for at least the first two examples, Host, Content-Length, etc.
    x 6. Change POST to PUT for updating Entries?
    xxx 7. change to x.atom+xml--> <!-- changed to atom+xml -RS -->
    <!--8. Add in 'categories' to Introspection.
    9. HTTP status code is used to indicate method call success or failure, I would
    like to see more error information structured in XML and packed into HTTP Response
    body, that will allow implementation to provide detailed and probably tracable error
    messages and allows client side software make informed error handling decision;
    x 10. Change copyright.
    x 11. Remove RSD
    x 12. Add Kens copy (went with the wiki markup)

    13. Add atom-recent
    14. Clarify that atom-start-range starts from the most recent post
    15. Add performance/http compliance section that says:
    1. use ETags/Last-Modified on GETs
    2. use gzip
    3. note that dispatching on VERB and mime-type are web server functions
    4. 
    16. Add a glossary, then use the terms consistently.
    17. Change PUT response 205 to 200.
    -->
    <rfc category="std" ipr="full3978" docName="draft-ietf-atompub-protocol-04.txt">
      <front>
    <title>The Atom Publishing Protocol</title>
    <author initials='J.C.' surname="Gregorio" fullname='Joe Gregorio' role="editor">
      <organization>BitWorking, Inc</organization>
      <address>
        <postal>
          <street>1002 Heathwood Dairy Rd.</street>
          <city>Apex</city> <region>NC</region> <code>27502</code>
          <country>US</country>
        </postal>
        <phone>+1 919 272 3764</phone>
        <email>joe@bitworking.com</email>
        <uri>http://bitworking.com/</uri>
      </address>
    </author>
    
    <author initials="R." surname="Sayre" fullname="Robert Sayre" role="editor">
      <organization/>
      <address>
	<email>rfsayre@boswijck.com</email>
	<uri>http://boswijck.com</uri>
      </address>
    </author>
    <date day="9" month="May" year="2005"/>
    <abstract>
      
      <t>This memo presents a protocol for using XML (Extensible
      Markup Language) and HTTP (HyperText Transport Protocol) to
      edit content. </t>

      <t>The Atom Publishing Protocol is an application-level
      protocol for publishing and editing Web resources belonging
      to periodically updated websites. The protocol at its core
      is the HTTP transport of Atom-formatted representations. The
      Atom format is documented in the Atom Syndication Format
      (draft-ietf-atompub-format-06.txt).
      </t>

    </abstract>
    
    <note title="Editorial Note">
      <t>To provide feedback on this Internet-Draft, join the
      <eref target="http://www.imc.org/atom-protocol/index.html">atom-protocol mailing list (http://www.imc.org/atom-protocol/index.html)</eref>.
      </t>
    </note>
      </front>

      <middle>
    
    <section title="Introduction">
      
      <t>The Atom Publishing Protocol is an application-level
      protocol for publishing and editing Web resources using HTTP
      <xref target="RFC2616"/> and XML 1.0 <xref
      target="W3C.REC-xml-20040204"/>.
      </t>              
    </section>

    <section title="Notational Conventions">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
      "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
      and "OPTIONAL" in this document are to be interpreted as
      described in <xref target="RFC2119"/>.
      </t> 
    </section>

    <section title="Terminology" anchor="terminology">
        <t>URI/IRI - A Uniform Resource Identifier and Internationalized Resource Identifier, respectively. 
            These terms (and the distinction between them) are defined in <xref target="RFC3986"/> and <xref target="RFC3987"/>.
        </t>

	<t>Resource - an item identified by a URI <xref target="W3C.REC-webarch-20041215"  />.</t>

        <t>Collection Resource - A resource that contains a listing of 
            Member Resources and meets the 
            requirements in <xref target="collections_func" /> of this specification.
        </t>

        <t>Member Resource - A resource whose URI is listed by 
            a Collection Resource.</t>

    </section>





    <section title="The Atom Publishing Protocol Model">
      
      <t>The Atom Publishing Protocol operates on collections of
      Web resources. All collections support the same basic
      interactions, as do the resources within the collections.
      The patterns of interaction are based on the common HTTP
      verbs.
      </t>
      <t>
      <list style="symbols">
        <t>GET is used to retrieve a representation of a resource or perform a read-only query.</t>
        <t>POST is used to create a new, dynamically-named resource.</t>
        <t>PUT is used to update a known resource.</t>
        <t>DELETE is used to remove a resource.</t>
      </list>
      
      </t>

      <section title="Collections" anchor="collections_intro">
        <t>
          The APP groups resources into "Collections", which are
          analogous to the "folders" or "directories" found in
          many file systems.
        </t>
      </section>

      <section title="Discovery" anchor="orientation">
        <t>
          To discover the location of the collections exposed by
          an APP service, the client must locate and request an
          <xref target="at-your-service">Introspection Document</xref>.
        </t>
        <figure>
          <artwork>
Client                      Server 
|                                |     
|  1.) GET Introspection         |     
|-------------------------------&gt;|     
|                                |     
|  2.) Introspection Doc         |     
|&lt;-------------------------------|     
|                                |
          </artwork>
        </figure>
        <t>
          <list style="numbers">
        <t>
          The client sends a GET request to the Service
          Description Resource.
        </t>
        <t>
            The server responds with an Introspection
          Document containing the locations of collections
          provided by the service. The content of this
          document can vary based on aspects of the client
          request, including, but not limited to,
          authentication credentials.
        </t>
          </list>
        </t>
      </section>
      
      <section title="Listing" anchor="listing">

        <t>Once the client has discovered the location of a
        collection, it can request a listing of the collection's
        membership. However, collections might be extremely large,
        so servers are likely to list a small subset of the
        collection by default. <!--Clients that wish to exercise
        greater control over the subset returned by the server can
        include an <xref target="atom-query">Atom-Query</xref>
        header in their request.--></t>

        <figure>
          <artwork>
Client                      Server 
|                                |     
|  1.) GET to Collection URI     |     
|-------------------------------&gt;|     
|                                |     
|  2.) 200 OK, Atom Feed Doc     |    
|&lt;-------------------------------|     
|                                |
          </artwork>
        </figure>

        <t>
          <list style="numbers">
        <t>
          The client sends a GET request to the Collection's URI.
        </t>
        <t>
          The server responds with an Atom Feed Document containing
          a full or partial listing of the collection's membership.
        </t>
          </list>
        </t>

      </section>

      <section title="Authoring" anchor="authoring">
        <t>
	  After locating a collection, a client can add entries by
	  sending a request to the collection; other changes are
	  accomplished by sending HTTP requests to its member
	  resources.
        </t>


        <section title="Create" anchor="create_coll_member_model">
          <figure>
        <artwork>
Client                      Server 
|                                |     
|  1.) POST to Collection URI    |     
|-------------------------------&gt;|     
|                                |     
|  2.) 201 Created @ Location    |    
|&lt;-------------------------------|     
|                                |
        </artwork>
          </figure>
          <t>
        <list style="numbers">
          <t>The client sends a representation of a member to
          the server via HTTP POST.  The Request URI is that
          of the Collection.</t>

          <t>The server responds with a response of "201
          Created" and a "Location" header containing the URI
          of the newly-created resource.</t>
        </list>
          </t>
        </section>
       

        <section title="Read">
          <figure>
        <artwork>
Client                      Server 
|                                |
|  1.) GET or HEAD to Member URI |     
|-------------------------------&gt;|     
|                                |     
|  2.) 200 OK                    |    
|&lt;-------------------------------|
|                                |

        </artwork>
          </figure>

          <t>
        <list style="numbers">
          <t>                                   
            The client sends a GET (or HEAD) request to the
            member's URI.
          </t>
          <t>
            The server responds with an appropriate representation.         
          </t>
        </list>
          </t>
        </section>

        <section title="Update">
          <figure>
        <artwork>
Client                      Server
|                                |
|  1.) PUT to Member URI         |     
|-------------------------------&gt;|     
|                                |     
|  2.) 200 OK                    |    
|&lt;-------------------------------|
        </artwork>
          </figure>

          <t>
        <list style="numbers">
          <t>
            The client PUTs an updated representation to the member's URI.
          </t>
          <t>
            The server responds with a representation of the member's new state. 
          </t>
        </list>
          </t>
        </section>

        <section title="Delete">
          <figure>
        <artwork>
Client                      Server 
|                                |
|  1.) DELETE to Member URI      |     
|-------------------------------&gt;|     
|                                |     
|  2.) 204 No Content            |    
|&lt;-------------------------------|     
|                                |
        </artwork>
          </figure>

          <t>
        <list style="numbers">
          <t>
            The client sends a DELETE request to the member's URI.
          </t>
          <t>
            The server responds with successful status code.
          </t>
        </list>
          </t>        
        </section>
      </section>

      <section title="Success and Failure">

        <t>
          HTTP defines classes of response. HTTP status codes of
          the form 2xx signal that a request was successful. HTTP
          status codes of the form 4xx or 5xx signal that an error
          has occurred, and the request has failed. Consult the
          HTTP specification for more detailed definitions of each
          status code.
        </t>

      </section>

    </section>
                  
    <section title="Collections" anchor="collections_func">
       
      <t>An Atom Collection is a set of related resources. All members
      of a collection have an "updated" property, and the collection
      is considered to be ordered by this property. </t>

      <section title="Collection Documents" anchor="collection_doc">

          <t>An example Collection Document.</t>

          <figure>
        <artwork name="collectionDoc" />
          </figure>
       
          <t>Atom Collection Documents have the 
              media-type 'application/atomcoll+xml', see
              <xref target="iana"/>.</t>

          <section title="Element Definitions" anchor="collection_elements">
          

        <section title="The 'app:collection' Element">
          <t>
            The 'app:collection' element represents an Atom
            Collection. A collection document does not necessarily
            list every member of the collection.
          </t>
          
          <t>
            <figure>
              <artwork name="app:coll"/>
            </figure>
          </t>

          <t>
            <list style="symbols">
              <t>
		'app:collection' elements MAY contain any
		number of 'app:member' elements.
              </t>
	      <t>
		'app:collection' elements MAY contain a 'next'
		attribute which identifies a collection document
		containing member elements updated earlier in
		time.
	      </t>
            </list>
          </t>

          <t>
            The members listed in a collection document MUST
            constitute a consecutive sequence of the collection's
            members, ordered by their "updated" properties. That is, a
            collection document MUST contain a contiguous subset of
            the members of the collection ordered by their 'updated'
            property.
          </t>

        </section>

        <section title="The 'app:member' Element">

          <t>The 'app:member' represents a single member resource.</t>

          <t>
            <figure>
              <artwork name="app:member" />
            </figure>
          </t>

          <t>
            <list style="symbols">
              <t>'app:member' elements MUST include an 'href'
              attribute, whose value conveys the URI used
              to edit the member source</t>
              <t>'app:member' elements MAY include an
              "<xref target="hrefreadonly">hrefreadonly</xref>" attribute.</t>
              <t>'app:member' elements MUST include a 'title'
              attribute, whose value is a human-readable name
              or description for the item.</t>
              <t>'app:member' elements MUST include an 'updated'
              attribute, whose value is the 'updated' property of the
              collection member.  Its format MUST conform to the
              date-time production in <xref target="RFC3339"/>.</t>
            </list>
          </t>

        </section>
        
        <section title="The 'hrefreadonly' Attribute" anchor="hrefreadonly">
          
          <t>
            This optional attribute identifies a URI which, on
            a GET request, responds equivalently to how the
            "href" URI would respond to the same
            request. Clients SHOULD NOT apply to this URI any
            HTTP methods that would be expected to modify the
            state of the resource (e.g. PUT, POST or DELETE).
            A PUT or POST request to this URI MAY NOT affect
            the underlying resource.  If the "hrefreadonly"
            attribute is not given, its value defaults to the
            "href" value.  If the "hrefreadonly" attribute is
            present, and its value is an empty string, then
            there is no URI that can be treated in the way
            such a value would be treated.
          </t>

          
          <t>
            Clients SHOULD use the "href" value to manipulate
            the resource within the context of the APP
            itself. Clients SHOULD prefer the "hrefreadonly"
            value in any other context.  For example, if the
            resource is an image, a client may replace the
            image data using a PUT on the "href" value, and
            may even display a preview of the image by
            fetching the "href" URI. But when creating a
            public, read-only reference to the same image
            resource, the client should use the "hrefreadonly"
            value. If the "hrefreadonly" value is an empty
            string, the client SHOULD NOT make public
            reference to the "href" value.
        </t>

    </section>

    <t><cref>Define extensibility for Collection Documents.</cref></t>

  </section>

</section>

    <section title="Collection Resource" anchor="collection_resource">

      	<t>
	  This specification defines two HTTP methods for use with
	  collection resources: GET and POST.
	</t>
    <section title="GET" toc="exclude">
        <t>
	  Collections can contain extremely large numbers of
	  resources. A naive client such as a web spider or web
	  browser would be overwhelmed if the response to a GET
	  reflected the full membership of the collection, and the
	  server would waste large amounts of bandwidth and processing
	  time on clients unable to handle the response. As a result,
	  responses to a simple GET request represent a
	  server-determined subset of the collection's membership.
	</t>
		  
	<t>
	  In addition, the client MAY send a 'Range' header with a
	  range type of 'udpated', indicating the subset of the
	  collection to be returned. The 'Range' header is described
	  in <xref target="collection_range_header" />.
	</t> 

	 <t>
	   This specification defines two serializations for Atom
	   Collections. Servers MUST provide both, but MAY also
	   provide additional serializations.
	</t>

	<t>
	  <list style="numbers">
	    <t>Atom Collection Documents (application/atomcoll+xml),  <xref target="collection_doc" />.</t>
	    <t>Atom Collection Documents wrapped by a SOAP envelope (application/soap+xml),
	    <xref format="title" target="W3C.REC-soap12-part1-20030624" />.</t>
	  </list> 
	</t>

	<t>
	  Clients use the HTTP 'Accept' request header to indicate
	  their preference.</t>

	<t>
        <figure >
          <preamble>
            Example Request, with Accept header
          </preamble>
          <artwork>
GET /collection HTTP/1.1
Host: example.org
User-Agent: Agent/1.0
Accept: application/atomcoll+xml
          </artwork>
          <postamble>
            Here, the server could return any subset of the
            collection as an Atom Collection Document.
          </postamble>
        </figure>
          </t>

          <t>
        <figure >
          <preamble>
            Example Response, Atom Collection Document
          </preamble>
          <artwork><![CDATA[
HTTP/1.1 200 OK
Date: Fri, 25 Mar 2005 17:15:33 GMT
Last-Modified: Mon, 04 Oct 2004 18:31:45 GMT
ETag: "2b3f6-a4-5b572640"
Accept-Ranges: updated 
Content-Length: nnnn
Content-Type: application/atomcoll+xml; charset="utf-8"

<?xml version="1.0" encoding="utf-8"?>
<collection xmlns="http://purl.org/atom/app#">
...
  <member href="http://example.org/1" 
          hrefreadonly="http://example.com/1/bar" 
          title="Example 1" 
          updated="2003-12-13T18:30:02Z" />
...
</collection>

]]></artwork>
        </figure>
          </t>

	  <t>
	    <figure >
	      <preamble>
		Example Request, with SOAP Accept header
	      </preamble>
	      <artwork>
GET /collection HTTP/1.1
Host: example.org
User-Agent: Cosimo/1.0
Accept: application/soap+xml
	      </artwork>
	      <postamble>
		Here, the server could return any subset of the
		collection as an Atom Feed Document wrapped by a SOAP
		envelope.
	      </postamble>
	    </figure>
	  </t>

	  <t>
	    <figure >
	      <preamble>
		Example Response, Atom Feed Document wrapped by a SOAP envelope
	      </preamble>
	      <artwork><![CDATA[
HTTP/1.1 200 OK
Date: Fri, 25 Mar 2005 17:15:33 GMT
Last-Modified: Mon, 04 Oct 2004 18:31:45 GMT
ETag: "2b3f6-a4-5b572640-89"
Accept-Ranges: bytes
Content-Length: nnnn
Content-Type: application/soap+xml; charset="utf-8"

<?xml version="1.0" encoding="utf-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
   <env:Header />
   <env:Body>
      <collection xmlns="http://purl.org/atom/app#">
      ...
      <member href="http://example.org/1" 
              hrefreadonly="http://example.com/1/bar" 
              title="Example 1" 
              updated="2003-12-13T18:30:02Z" />
      ...
      </collection>
   </env:Body>
</env:Envelope>
]]></artwork>
	    </figure>
	  </t>

      </section>
	      
	  <section title="POST">

	    <t>
	      In addition to GET, a Collection Resource also accepts
	      POST requests. The client POSTs a representation of the
	      desired resource to the Collection Resource. Note that
	      some collections only allow members of a specific
	      media-type and a POST MAY generate a response with a
	      status code of 415 ("Unsupported Media Type").
	    </t>

	    <t>
	      In the case of a successful creation, the status code
	      MUST be 201 ("Created"). 
	    </t>

	    <t>
	      <figure >
		<preamble>
		  Example Request, Create a resource in a collection.
		</preamble>
		  <artwork>
POST /collection HTTP/1.1
Host: example.org
User-Agent: Cosimo/1.0
Accept: application/atomcoll+xml
Content-Type: image/png
Content-Length: nnnn
Name: trip-to-beach.png

...binary data...
		  </artwork>
		  <postamble>
		    Here, the client is adding a new image resource to
		    a collection. The Name: header indicates the
		    client's desired name for the resource, see <xref
		    target="collection_name_header"/>. 
		  </postamble>
		</figure>
		</t>

		<t>
		  <figure >
		    <preamble>
		      Example Response, resource created successfully.
		    </preamble>
		    <artwork><![CDATA[
HTTP/1.1 201 Created
Date: Fri, 25 Mar 2005 17:17:11 GMT
Content-Length: nnnn 
Content-Type: application/atomcoll+xml; charset="utf-8"
Location: http://example.org/images/trip-to-the-beach-01.png

<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://purl.org/atom/app#">
    <member href="http://example.org/images/trip-to-beach.png" 
        hrefreadonly="http://example.com/ed/im/trip-01.png" 
        title="trip-to-beach.png" 
        updated="2005-03-25T17:17:09Z" />
</collection>
]]></artwork>
		  </figure>
		</t>
		

	      </section>


	  <section title="Usage Scenarios" anchor="collections_model_usage">
	    <!--<t><cref source="Sayre">I want to delete this whole section</cref></t>-->
	    <t>
            These scenarios illustrate common idioms for interactin
            with Collections. 
	    </t>
	    <t>
	      The Atom Collection can be used by clients in two
	      ways. In the first case the client encounters a
	      Collection for the first time and is doing an initial
	      syncronization, that is, retrieving a list of all the
	      members of the collections and possibly retrieving all
	      the members of the collection also. The client can
	      perform a non-partial GET on the collection resource and
	      it will receive a collection document that either
	      contains all the members of the collection, or the
	      collection document root element 'collection' will
	      contain a 'next' attribute pointing to the next
	      collection document. By repeatedly following the 'next'
	      attribute from document to document the client can find
	      all the members of the collection.
	    </t>
	    <t>
	      In the second case the client has already done an
	      initial sync, and now needs to re-sync, because the
	      client was just restarted, or some time has passed since
	      a re-sync, etc. The client does a partial GET on the
	      collection document, supplying a Range header that
	      begins from the last time the client sync'd to the
	      current time. The collection document returned will
	      contain only those members of the collection that have
	      changed since the last time the client syncronized.
	    </t>
	  </section>




          <section title="Range: Header" anchor="collection_range_header">

              <t>
                  HTTP/1.1 allows a client to request that only part (a
                  range of) the collection to be included within the
                  response. HTTP/1.1 uses range units in the Range header
                  field. A collection can be broken down into subranges
                  according to the members 'updated' property. If a Range:
                  header is present in the request, its value explictly
                  identifies the a time interval interval in which all the
                  members 'updated' property must fall to be included in
                  the response.
              </t>

              <figure>
                  <artwork>
   Range = "Range" ":" ranges-specifier
                  </artwork>
              </figure>

              <t>
                  The value of the Range: header should be a pair of ISO
                  8601 dates, separated by a slash character; either date
                  may be optionally omitted, in which case the range is
                  understood as stretching to infinity on that end.
              </t>

              <figure>
                  <artwork>
   ranges-specifier = updated-ranges-specifier
   updated-ranges-specifier = updated-unit "=" updated-range
   updated-unit = "updated"
   updated-range = [iso-date] "/" [iso-date]
                  </artwork>
              </figure>

              <t>
		The response to a collection request MUST be a
		collection document, all of whose 'member' elements
		fall within the requested range. The request range is
		considered a closed set, that is, if a 'member'
		element matches one end of the range exactly it MUST
		be included in the response. If no members fall in the
		requested range, the server MUST respond with a
		collection document containing no 'member' elements.
              </t>
              <t>The inclusion of the Range: header in a request 
                  changes the request to a "partial GET" <xref target="RFC2616"/>.
              </t>

          </section>

          <section title="Accept-Ranges: Header" anchor="collection_accept_ranges">
	   
              <t>
		The response to a non-partial GET request MUST include
		an Accept-Ranges header that indicates that the server
		accepts 'updated' range requests.
              </t>

              <figure>
                  <artwork>
  Accept-Ranges     = "Accept-Ranges" ":" acceptable-ranges
  acceptable-ranges = updated-unit ( 1#range-unit )
                  </artwork>
              </figure>
          </section>

          <section title="Name: Header" anchor="collection_name_header">
	     <t><cref>this is new...</cref></t>
	     <t>
	       The POST to a Collection Resource MAY contain a Name:
	       header that indicates the clients suggested name for
	       the resource. The server MAY ignore the Name: header or
	       modify the requested name to suit local conventions.
	     </t>

              <figure>
		<artwork>
  Name     = "Name" ":" relative-part
		</artwork>
	     </figure>
         <t>The relative-part production is defined in <xref target="RFC3986"/>.</t>
          </section>


      </section>


    </section>



 <!--   <section title="Collection Member" anchor="collection_member_resources">
        <t>The creation of a new resource in a collection is described
            in <xref target="collection_resource" />.  Once a resource has
            been created it MAY be editable.  An editable resource will have
            its URI returned in 'href' attribute of the 'member' element
            when it is listed in a Collection Document.
        </t>

        <section title="Member Representations" anchor="member_represenations">
            <t>The representations for members of a collection may or may not be 
                constrained. The allowable representations are specified for
                each particular type of collection.
            </t>
        </section>

    </section>-->

    <section title="Entry Collection" anchor="author_entry">

        <t>
	  Entry Collections are Collections that restrict their
	  membership to Atom entries. This specification defines two
	  serializations for Atom entries. Servers MUST provide
	  both serializations.
	</t>

	<t>
	  <list style="numbers">
	    <t>Atom Entry Documents (application/atom+xml),  <xref target="AtomFormat" />.</t>
	    <t>Atom Entry Documents wrapped by a SOAP envelope (application/soap+xml),
	    <xref format="title" target="W3C.REC-soap12-part1-20030624" />.</t>
	  </list> 
	</t>

	<t>
	  Clients use the HTTP 'Accept' request header to indicate
	  their preference <xref target="RFC2616"/>. If no 'Accept' header is present in the
	  request, the server is free to choose any serialization. When an HTTP request 
	  contains a body, clients MUST include a 'Content-Type' header, and servers
	  MUST accept both application/atom+xml and application/soap+xml message bodies.
	</t>

	<section title="Editing Entry Resources">
	  
	  <t>Atom entries are edited by sending HTTP requests to an individual
	  entry's URI. Servers can determine the processing necessary to interpret 
	  a request by examining the request's HTTP method and 'Content-Type'
	  header.</t>

	  <t>If the request method is POST and the 'Content-Type' is
	  application/soap+xml, the SOAP document MUST contain a
	  Web-Method property <xref format="title"
	  target="W3C.REC-soap12-part2-20030624" />. This specifcation
	  defines two values for that property, PUT and DELETE.</t>


	  <texttable>

	    <preamble>Processing Client Requests</preamble>
	    <ttcol align="right"></ttcol>
	    <ttcol align="center">GET</ttcol>
	    <ttcol align="center">PUT</ttcol>
	    <ttcol align="center">DELETE</ttcol>
	    <ttcol align="center">POST</ttcol>
	    
	    <c>No Body</c>
	    <c>Read</c>
	    <c>x</c>
	    <c>Delete</c>
	    <c>x</c>

	    <c>Atom Body</c>
	    <c>x</c>
	    <c>Update</c>
	    <c>x</c>
	    <c>x</c>

	    <c>SOAP Body with Web-Method PUT</c>
	    <c>x</c>
	    <c>x</c>
	    <c>x</c>
	    <c>Update</c>

	    <c>SOAP Body with Web-Method DELETE</c>
	    <c>x</c>
	    <c>x</c>
	    <c>x</c>
	    <c>Delete</c>

	  </texttable>

	</section>

 	<section title="Role of Atom Entry Elements During Editing" anchor="constraints">
        
          <t>The elements of an Atom Entry Document are either a
          'Writable Element' or a 'Round Trip Element'.</t>

	  <t>Writable Element - An element of an Atom Entry 
	  whose value is editable by the client and 
	  not enforced by the server.
	  </t>

	  <t> 
	    Round Trip Element - An element of an Atom Entry 
            whose value is enforced by the server and not editable
            by the client.
	  </t>

	  <t>That
          categorization will determine the elements' disposition
          during editing.</t>
            

	      <texttable anchor='table_example'>
		<ttcol align='center'>Atom Entry Element</ttcol>
		<ttcol align='center'>Property</ttcol>
		<c>atom:author</c>
		<c>Writable</c>
		<c>atom:category</c>
		<c>Writable</c>
		<c>atom:content</c>
		<c>Writable</c>
		<c>atom:contributor</c>
		<c>Writable</c>
		<c>atom:id</c>
		<c>Round Trip</c>
		<c>atom:link</c>
		<c>Writable</c>
		<c>atom:published</c>
		<c>Writable</c>
		<c>atom:source</c>
		<c>Writable</c>
		<c>atom:summary</c>
		<c>Writable</c>
		<c>atom:title</c>
		<c>Writable</c>
		<c>atom:updated</c>
		<c>Round Trip</c>
	      </texttable>
	 

      </section>
    </section>

    <section title="Generic Collection" anchor="author_generic">

        <t>
	  Generic Collections are Collections that do not 
	  have uniform restrictions on the representations of 
	  the member resources.
        </t>

	<section title="Editing Generic Resources">
	  
	  <t>Member resources are edited by sending HTTP requests to an individual
	  resource's URI. Servers can determine the processing necessary to interpret 
	  a request by examining the request's HTTP method and 'Content-Type'
	  header.</t>

	  <texttable>
	    <preamble>Processing Client Requests</preamble>
	    <ttcol align="right"></ttcol>
	    <ttcol align="center">GET</ttcol>
	    <ttcol align="center">PUT</ttcol>
	    <ttcol align="center">DELETE</ttcol>
	    <ttcol align="center">POST</ttcol>
	    
	    <c>No Body</c>
	    <c>Read</c>
	    <c>x</c>
	    <c>Delete</c>
	    <c>x</c>

	    <c>Any Body</c>
	    <c>x</c>
	    <c>Update</c>
	    <c>x</c>
	    <c>x</c>

	  </texttable>

	</section>

    </section>

       <section title="Introspection" anchor="at-your-service">

           <t>
	     In order for authoring to commence, a client must first
	     discover the capabilities and locations of collections
	     offered.
           </t>

           <section title="Introspection Document" anchor="service_document">

	     <t>
	       The Introspection Document describes "workspaces",
	       which are server-defined groupings of
	       collections. There is no requirement that servers
	       support multiple workspaces, and a collection may
	       appear in more than one workspace.
          <!-- <cref>I really would prefer that the extensibility of the Introspection document be done via namespaced elements. -Joe</cref>-->
	     </t>

	     <t>The Introspection Document has the 
	     media-type 'application/atomserv+xml', see
	     <xref target="iana"/></t>

               <figure>
         <artwork name="introspectionDoc" />
                  </figure>

                  <section title="Element Definitions" anchor="service_document_elements">

                      <section title="The 'app:service' Element">

                          <t>The "service" element is the document element of a
                              Service Document, acting as a container for service
                              data associated with one or more workspaces.</t>

                          <t>
                              <figure>
                                 <artwork name="app:service" />
                               </figure>
                          </t>

                          <t>The following child elements are defined by this
                              specification:</t>

                          <t>
                              <list style="symbols">
                                  <t>app:service elements MAY contain any number
                                      of app:workspace elements.</t>
                              </list>
                          </t>

                      </section>

                      <section title="The 'app:workspace' Element">

                          <t>
                              The 'workspace' element element contains
                              information elements about the collections of
                              resources available for editing.
                          </t>

                          <t>
                              <figure>
                                  <artwork name="app:workspace" />
                              </figure>
                          </t>


                          <t>The following attributes and child elements are
                              defined by this specification:</t>

                          <t>
                              <list style="symbols">
                                  <t>app:workspace elements MUST contain a 'title'
                                      attribute, which conveys a human-readable name
                                      for the workspace</t>
                                  <t>app:workspace elements MAY contain any number
                                      of app:collection elements.</t>
                              </list>
                          </t>

                      </section>

                      <section title="The 'app:collection' Element">

                          <t>
                              The 'app:collection' element describes 
                              collections and their member resources.
                          </t>

			  <t><cref source="R. Sayre">We have
			  a collection element that's different than
			  the root element of the collection
			  document. Messy.</cref></t>

                          <t>
                              <figure>
                                  <artwork name="app:collection" />
                             </figure>
                         </t>

                         <t>The following attributes are defined by this
                             specification:</t>

                         <t>
                             <list style="symbols">
                                 <t>app:collection elements MUST contain a 'title'
                                     attribute, whose value conveys a human-readable name
                                     for the workspace</t>
                                 <t>app:collection elements MAY contain a <xref target="attContents">'contents'
                                         attribute</xref>. If it is not present, it's value is considered to be 'generic'.</t>
                                 <t>app:collection elements MUST contain an 'href' attribute, whose value conveys the
                                     URI of the collection.</t>
                             </list>
                         </t>

                         <section title="The 'contents' Attribute" anchor="attContents">
                             <t>
                                 The 'contents' attribute conveys the nature of a
                                 collection's member resources. This
                                 specification defines two initial values for the
                                 'contents' attribute:</t>

                             <t> <list style="symbols">
                                     <t>entry</t>
                                     <t>generic</t>
                                 </list>
                             </t>
                             <t>
                                 Extensibility for 'content' values is handled 
                                 <cref>Same as atom:link</cref>. 
                             </t>
                             <section title="entry" toc="exclude">
                                 <t>A value of 'entry' for the contents
                                     attribute indicates that the Collection
                                     is an <xref target="author_entry">
                                         Entry Collection</xref>.
                                 </t>
                             </section>
                             <section title="generic" toc="exclude">
                                 <t>A value of 'generic' for the contents
                                     attribute indicates that the Collection
                                     is a <xref target="author_generic">
                                         Generic Collection</xref>.
                                 </t>
                             </section>
                         </section>

                     </section>

                 </section>

             </section>

             <section title="Introspection Resource">

                 <t>To retrieve an Introspection Document, the client
                     sends a GET request to its URI.</t>

                 <figure>
                     <artwork>
GET /service-desc HTTP/1.1
Host: example.org
User-Agent: Cosimo/1.0
Accept: application/atomserv+xml
                     </artwork>
                 </figure>

                 <t>The server responds to a GET request by returning an Introspection  
                     Document in the message body.</t>

                 <figure>
                     <artwork><![CDATA[
HTTP/1.1 200 OK
Date: Mon, 21 Mar 2005 19:20:19 GMT
Server: CountBasic/2.0
Last-Modified: Mon, 21 Mar 2005 19:17:26 GMT
ETag: "4c083-268-423f1dc6"
Content-Length: nnnn 
Content-Type: application/atomserv+xml

<?xml version="1.0" encoding='utf-8'?>
<service xmlns="http://purl.org/atom/app#">
    ...
</service>
                 ]]></artwork>
                 </figure>

                 <section title="Discovery" anchor="introspection_discovery">
                     <t><cref>Add in desc of an HTML link element that
                     points to the Introspection Resource, or add it to the autodisco draft</cref></t>
                 </section> 
             </section>
         </section>

      <section title="Securing the Atom Protocol">

        <t>All instances of publishing Atom entries SHOULD be protected by authentication 
        to prevent posting or editing by unknown sources. Atom servers and clients MUST 
        support one of the following authentication mechanisms, and SHOULD support 
        both.
        </t>
        <t>
          <list style="symbols">
        <t>HTTP Digest Authentication <xref target="RFC2617" /></t>
        <t>[@@TBD@@ CGI Authentication ref]</t>
          </list>
        </t>
        <t>
          Atom servers and clients MAY support encryption of the Atom session using TLS <xref target="RFC2246" />.
        </t>
        <t>
          There are cases where an authentication mechanism may
          not be required, such as a publicly editable Wiki, or
          when using the PostURI to post comments to a site that
          does not require authentication to create comments.
        </t>
        
         <section title="[@@TBD@@ CGI Authentication]" toc="exclude">
          <t>
        This authentication method is included as part of the
        protocol to allow Atom servers and clients that cannot
        use HTTP Digest Authentication but where the user can
        both insert its own HTTP headers and create a CGI
        program to authenticate entries to the server. This
        scenario is common in environments where the user
        cannot control what services the server employs, but
        the user can write their own HTTP services.
          </t>
        </section>
      </section>
      <section title="Security Considerations">
        <t>Because Atom is a publishing protocol, it is important that only 
        authorized users can create and edit entries.</t>
        <t>
          The security of Atom is based on HTTP Digest
          Authentication and/or [@@TBD@@ CGI Authentication].  Any
          weaknesses in either of these authentication schemes
          will obviously affect the security of the Atom
          Publishing Protocol.
        </t>
        <t>Both HTTP Digest Authentication and [@@TBD@@ CGI
        Authentication] are susceptible to dictionary-based
        attacks on the shared secret. If the shared secret is a
        password (instead of a random string with sufficient
        entropy), an attacker can determine the secret by
        exhaustively comparing the authenticating string with
        hashed results of the public string and dictionary
        entries.
        </t>
        <t>See RFC 2617 for more detailed description of the security 
        properties of HTTP Digest Authentication.</t>
        <t>@@TBD@@ Talk here about using HTTP basic and digest authentication.</t>
        <t>@@TBD@@ Talk here about denial of service attacks using large XML files, 
        or the billion laughs DTD attack.
        </t>
      </section>
      <section title="IANA Considerations" anchor="iana">
	<t>A Atom Collection Document, when serialized as XML 1.0, can be identified with
	the following media type:</t>
	      

	<t>
	  <list style="hanging">
	    <t hangText="MIME media type name:"> application</t>
	    <t hangText="MIME subtype name:"> atomcoll+xml</t>
	    <t hangText="Mandatory parameters:"> None.</t>
	    <t hangText="Optional parameters:">
	      <list style="hanging">
		<t hangText='"charset":'> This parameter has identical
		    semantics to the charset parameter of the
		    "application/xml" media type as specified in <xref
		    target="RFC3023"/>.</t>
	      </list>
	    </t>
	
	    <t hangText="Encoding considerations:"> Identical to those
	    of "application/xml" as described in <xref
	    target="RFC3023"/>, section 3.2.</t>

	    <t hangText="Security considerations:"> As defined in this
	    specification. <cref>update upon publication</cref></t>

	    <t>In addition, as this media type uses the "+xml"
	    convention, it shares the same security considerations as
	    described in <xref target="RFC3023"/>, section 10.</t>

	    <t hangText="Interoperability considerations:"> There are
	    no known interoperability issues.</t>
	    
	    <t hangText="Published specification:"> This
	    specification. <cref>update upon publication</cref></t>
		
	    <t hangText="Applications that use this media type:"> No
	    known applications currently use this media type.</t>
	  </list>
	</t>

	    <t>Additional information:</t> 

	    <t>
	      <list style="hanging"> 
		
		<t hangText="Magic number(s):"> As specified for
		"application/xml" in <xref target="RFC3023"/>, section
		3.2.</t>

		<t hangText="File extension:"> .atomcoll</t> 

		<t hangText="Fragment identifiers:"> As specified for
		"application/xml" in <xref target="RFC3023"/>, section 5.</t>

		<t hangText="Base URI:"> As specified in <xref
		target="RFC3023"/>, section 6.</t> 

		<t hangText="Macintosh File Type code:"> TEXT</t>

		<t hangText="Person and email address to contact for further information:"> Joe Gregorio &lt;joe@bitworking.org&gt;</t>

		<t hangText="Intended usage:">
		COMMON</t> <t hangText="Author/Change controller:"> IESG</t> 
	      </list>
	    </t>
	    
	    <t>An Atom Introspection Document, when serialized as XML 1.0, can be identified with
	    the following media type:</t>	

	    <t>
	      <list style="hanging"> 
		<t hangText="MIME media type name:"> application</t>
		<t hangText="MIME subtype name:"> atomserv+xml</t>
		<t hangText="Mandatory parameters:"> None.</t> 
		<t hangText="Optional parameters:"> 
		  <list style="hanging"> 
		    <t hangText='"charset":'> This parameter has identical
		    semantics to the charset parameter of the
		    "application/xml" media type as specified in <xref
		    target="RFC3023"/>.</t>
		  </list> 
		</t>
	      
		<t hangText="Encoding considerations:"> Identical to those of
		"application/xml" as described in <xref target="RFC3023"/>,
		section 3.2.</t>

		<t hangText="Security considerations:"> As defined in this
		specification. <cref>update upon publication</cref></t>

		<t>In addition, as this media type uses the "+xml" convention,
		it shares the same security considerations as described in
		<xref target="RFC3023"/>, section 10.</t>

		<t hangText="Interoperability considerations:"> There are no
		known interoperability issues.</t>

		<t hangText="Published specification:"> This
		specification. <cref>update upon publication</cref></t>
		
		<t hangText="Applications that use this media type:"> No known
		applications currently use this media type.</t>

	      </list>
	    </t>

	    <t>Additional information:</t> 

	    <t>
	      <list style="hanging"> 
		
		<t hangText="Magic number(s):"> As specified for
		"application/xml" in <xref target="RFC3023"/>, section
		3.2.</t>

		<t hangText="File extension:"> .atomsrv</t> 

		<t hangText="Fragment identifiers:"> As specified for
		"application/xml" in <xref target="RFC3023"/>, section 5.</t>

		<t hangText="Base URI:"> As specified in <xref
		target="RFC3023"/>, section 6.</t> 

		<t hangText="Macintosh File Type code:"> TEXT</t>

		<t hangText="Person and email address to contact for further information:"> Joe Gregorio &lt;joe@bitworking.org&gt;</t>

		<t hangText="Intended usage:">
		COMMON</t> <t hangText="Author/Change controller:"> This
		specification's author(s). <cref>update upon publication</cref></t>
	    </list>
	    </t>	      

      </section>
      

    </middle>
    <back> 
      <references title='Normative References'>
        <reference anchor="AtomFormat"> 
               <front> 
             <title>The Atom Syndication Format</title> 
             <author initials="M." surname="Nottingham" fullname="Mark Nottingham">
               <organization/>
             </author>
             <author initials="R." surname="Sayre" fullname="Robert Sayre">
             <organization/>
             </author>
             <date month="April" year="2005" /> 
               </front> 
               <seriesInfo name="" value="work-in-progress" /> 
            </reference>

      &rfc2119; &rfc2246; <!--&rfc2396;--> &rfc2616; &rfc2617; &rfc3023; &rfc3339; &rfc3986; &rfc3987; &SOAP; &SOAP2; &XML;</references>

      <references title="Informative References">
	
	&WEBARCH;
	
      </references>

      <section title="Revision History">
        <t>draft-ietf-atompub-protocol-04 - 
        Add ladder diagrams, reorganize, add SOAP interactions 
        </t>
        
	<t>draft-ietf-atompub-protocol-03 - 
	Incorporates PaceSliceAndDice3 and PaceIntrospection.
        </t>


               <t>draft-ietf-atompub-protocol-02 - 
                   Incorporates Pace409Response, PacePostLocationMust,
                   and PaceSimpleResourcePosting.
               </t>

               <t>draft-ietf-atompub-protocol-01 - 
                   Added in sections on Responses for the EditURI.
                   Allow 2xx for response to EditURI PUTs.
                   Elided all mentions of WSSE. Started adding in some
                   normative references. Added the section "Securing the 
                   Atom Protocol". Clarified that it is possible that the PostURI and FeedURI
                   could be the same URI. Cleaned up descriptions for Response codes
                   400 and 500.
               </t>
               <t>Rev draft-ietf-atompub-protocol-00 - 5Jul2004 - 
                   Renamed the file and re-titled the document to conform
                   to IETF submission guidelines. Changed MIME type to match the one
                   selected for the Atom format. Numerous typographical fixes.
                   We used to have two 'Introduction' sections. One of them was
                   moved into the Abstract the other absorbed the Scope section.
                   IPR and copyright notifications were added. 
               </t>
               <t>Rev 09 - 10Dec2003 - Added the section on SOAP enabled clients
                   and servers.</t>
               
               <t>Rev 08 - 01Dec2003 - Refactored the specification, merging the Introspection
                  file into the feed format. Also dropped the distinction between the 
                  type of URI used to create new entries and the kind used to create comments.
                  Dropped user preferences.</t>

                <t>Rev 07 - 06Aug2003 - Removed the use of the RSD file for auto-discovery. Changed copyright
                    until a final standards body is chosen. Changed query parameters for the search facet
                    to all begin with atom- to avoid name collisions. Updated all the Entries to follow
                    the 0.2 version. Changed the format of the search results and template file
                    to a pure element based syntax.
                </t>

                <t>Rev 06 - 24Jul2003 - Moved to PUT for updating Entries.
                    Changed all the mime-types to application/x.atom+xml. Added template 
                    editing. Changed 'edit-entry' to 'create-entry' in the Introspection file
                    to more accurately reflect it's purpose.
                </t>

                <t>Rev 05 - 17Jul2003 - Renamed everything Echo into Atom. Added
                    version numbers in the Revision history.
                    Changed all the mime-types to application/atom+xml.
                </t>

                <t>Rev 04 - 15Jul2003 - Updated the RSD version used from 0.7 to 1.0. Change the method of deleting
                    an Entry from POSTing &lt;delete/&gt; to using the HTTP DELETE verb. Also changed the 
                    query interface to GET instead of POST. Moved Introspection Discovery to be up under
                    Introspection. Introduced the term 'facet' for the services listed in the Introspection file.
                </t>

                <t>Rev 03 - 10Jul2003 - Added a link to the Wiki near the front of the 
                    document. Added a section on finding an Entry. Retrieving an Entry
                    now broken out into it's own section. Changed the HTTP status code for
                    a successful editing of an Entry to 205.
                </t>

                <t>Rev 02 - 7Jul2003 - Entries are no longer returned from POSTs, instead they are retrieved via GET.
                    Cleaned up figure titles, as they are rendered poorly in HTML. All content-types 
                    have been changed to application/atom+xml.
                </t>

                <t>Rev 01 - 5Jul2003 - Renamed from EchoAPI.html to follow the more commonly used format: 
                    draft-gregorio-NN.html. Renamed all
                    references to URL to URI. Broke out introspection into it's own section. Added the Revision History section.
                    Added more to the warning that the example URIs are not normative.
                </t>
            </section>

    </back>
      </rfc>






