<?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 WEBARCH SYSTEM 'bibxml/reference.W3C.REC-webarch-20041215.xml'>
   <!ENTITY XML SYSTEM 'bibxml/reference.W3C.REC-xml-20040204.xml'>
   <!ENTITY XMLNS SYSTEM 'bibxml/reference.W3C.REC-xml-names-19990114.xml'>
   <!ENTITY XMLBASE SYSTEM 'bibxml/reference.W3C.REC-xml-base-20010627.xml'>
]>
<!-- 

$LastChangedDate: 2005-10-30 13:34:45 -0500 (Sun, 30 Oct 2005) $
$LastChangedRevision: 162 $

--> 

<!--<?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
   1. Add app:member-type registry to IANA section.
    -->
    
<!--
Bill todo:06


-->
    <rfc category="std" ipr="full3978" docName="draft-ietf-atompub-protocol-06.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='B.' surname="de hOra" fullname='Bill de hOra' role="editor">
                <organization>Propylon Ltd.</organization>
                <address>
                    <postal>
                        <street>45 Blackbourne Square, Rathfarnham Gate</street>
                        <city>Dublin</city> <region>Dublin</region> <code>D14</code>
                        <country>IE</country>
                    </postal>
                    <phone>+353-1-4927444</phone>
                    <email>bill.dehora@propylon.com</email>
                    <uri>http://www.propylon.com/</uri>
                </address>
            </author>    

            <date day="27" month="October" year="2005"/>
            <abstract>

                <t>The Atom Publishing Protocol (APP) is an application-level
                    protocol for publishing and editing Web resources. The protocol is based on
                    HTTP transport of Atom-formatted representations. The
                    Atom format is documented in the Atom Syndication Format
                    (draft-ietf-atompub-format-11.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"/>. The protocol supports the creation of arbitrary web resources and 
                    provides facilities for:</t>

<t>
                <list style="symbols">
                    <t>Collections: Sets of resources, which may be retrieved in whole or in part.</t>
                    <t>Introspection: Discovering and describing collections.</t>
                    <t>Editing: Creating, updating and deleting resources.</t>
                </list>
</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> 


		<t>Note: The Introspection Document allows the use of IRIs <xref target="RFC3987"/>, as
		well as URIs <xref target="RFC3986"/>. Every URI is an IRI, so any URI can be
		used where an IRI is needed. How to map an IRI to a URI is specified in Section 3.1 of
		Internationalized Resource Identifiers (IRIs) <xref target="RFC3987"/>.</t>
            </section>

            <section title="Terminology" anchor="terminology">

                <t>For convenience, this protocol may be referred to as "Atom Protocol" or
                    "APP". 
                </t>

                <t>The phrase "the IRI of a document" in this specification is
                shorthand for "an IRI which, when dereferenced, is expected to
                produce that document as a representation".
                </t>

                <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 -  A network data object or service that can be identified by a IRI,
                    as defined in <xref target="RFC2616"/>. See <xref target="W3C.REC-webarch-20041215"/> for 
further discussion on resources.
                </t>

                <t>representation -  An entity included with a request or response 
                    as defined in <xref target="RFC2616"/>.
                </t>
                
                <t>collection - A resource that contains a 
                    set of member IRIs, as described in 
                    <xref target="collection_resource"/> of this specification.
                </t>

                <t>member - A resource whose IRI is listed in a collection.
                </t>

                <t>IRI template - A parameterized string that becomes
                    a IRI when the parameters are filled in.
                    See <xref target="templates"/>.
                </t>

                <t>introspection document - A document that describes the 
                    location and capabilities of one or more collections.
                    See <xref target="appdocs"/>
                </t>

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

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


            <section title="Protocol Model">

                <t>
                    The Atom Publishing Protocol uses HTTP 
  to edit resources on the web. 
                    It provides a list based mechanism for 
                    managing collections of editable resources called member resources.
                   Collections contain the IRIs and 
                    metadata describing member resources. 
                    The APP uses these HTTP verbs:
                </t>
                <t>
                    <list style="symbols">
                        <t>GET is used to retrieve a representation of a resource or perform a 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>
                    <t>
                        This diagram shows the APP model:
                    </t>

<figure>
<artwork>
 +---------------+  
 | Introspection |   +------------+
 |               |-->| Collection |
 +---------------+   |            |
                     |            |   +--------+    
                     |            |-->| Member |    
                     |            |   +--------+    
                     |            |                
                     |            |      .          
                     |            |      .          
                     |            |      .          
                     |            |                
                     |            |   +--------+    
                     |            |-->| Member |    
                     |            |   +--------+    
                     |            |                 
                     +------------+                 
   </artwork>
</figure>

<t>The introspection document contains the IRIs of one or more
    collections. A collection contains IRIs and metadata describing
    member resources. The protocol allows
    editing of resources with representations of any media-type.
Some types of collections are specialized and restrict the resource
    representations of their members.
</t>
</section>

<section title="Protocol Operations" anchor="operation">

<section title="Retrieving an Introspection Document" anchor="find-collections">
<figure>
<artwork>
Client                                   Server 
  |                                           |
  |  1.) GET to IRI of Introspection Document |     
  |------------------------------------------&gt;|     
  |                                           |     
  |  2.) Introspection Document               |    
  |&lt;------------------------------------------|
  |                                           |
</artwork>
</figure>

<t>
<list style="numbers">
  <t>The client sends a GET request to the IRI of the introspection document.</t>
  <t>The server responds with the introspection document which enumerates 
      the IRIs of all the collections, and the capabilities of those 
      collections, that the service supports.</t>
</list>   
</t>
</section>



<section title="Creating a Resource" anchor="post-to-create">

<figure>
<artwork>
Client                                   Server 
  |                                           |
  |  1.) POST to IRI of Collection            |     
  |------------------------------------------&gt;|     
  |                                           |     
  |  2.) 201 Created                          |    
  |&lt;------------------------------------------|
  |                                           |
</artwork>
</figure>

<t>
<list style="numbers">
  <t>The client POSTs a representation to the IRI of the collection.</t>
  <t>If the member resource was created successfully the server responds with a status code of 201 and a Location: header
      that contains the IRI of the newly created member resource.</t>
</list>   
</t>
    
</section>

<section title="Editing a Resource" anchor="edit">

<t>Once a resource has been created and its IRI is known, that
IRI may be used to retrieve, update, and delete it.</t>

    <section title="Retrieving a Resource">

<figure>
<artwork>
Client                                   Server 
  |                                           |
  |  1.) GET to Member IRI                    |     
  |------------------------------------------&gt;|     
  |                                           |     
  |  2.) Member Representation                |    
  |&lt;------------------------------------------|
  |                                           |
</artwork>
</figure>

<t>
<list style="numbers">
  <t>The client sends a GET request to the member's IRI to retrieve its representation .</t>
  <t>The server responds with the representation of the resource.</t>
</list>   
</t>
</section>
 
<section title="Updating a Resource">

<figure>
<artwork>
Client                                     Server
  |                                           |
  |  1.) PUT to Member IRI                    |     
  |------------------------------------------&gt;|     
  |                                           |     
  |  2.) 200 OK                               |    
  |&lt;------------------------------------------|
</artwork>
</figure>

<t>
<list style="numbers">
   <t>The client PUTs an updated representation to the member's IRI.</t>
   <t>Upon a successful update of the resource the server responds with a status code of 200.</t>
</list>
</t>   
</section>

<section title="Deleting a Resource">
<figure>
<artwork>
Client                                     Server 
  |                                           |
  |  1.) DELETE to Member Resource IRI        |     
  |------------------------------------------&gt;|     
  |                                           |     
  |  2.) 200 Ok                               |    
  |&lt;------------------------------------------|     
  |                                           |
</artwork>
</figure>

<t>
<list style="numbers">
  <t>The client sends a DELETE request to the member's IRI.</t>
   <t>Upon the successful deletion of the resource the server responds with a status code of 200.</t>
</list> 
</t>
<t>Note: deleting a member also removes it from all the collections to which it belongs.
    </t>
</section>   
</section> 


      
<section title="Listing Collections" anchor="listing">

<t>
    To enumerate the members of a collection
    the client sends a GET to its IRI.
    This IRI is constructed from
    information in the introspection document.
    An Atom Feed Document is returned with one Atom
    Entry for each member resource that matches the selection criteria in the IRI.
    See <xref target="templates"/> and <xref target="atom-entry-extensions"/> 
for a  description of the feed contents.
</t>
        <figure>
          <artwork>
Client                          Server 
  |                                |     
  |  1.) GET to List IRI           |     
  |-------------------------------&gt;|     
  |                                |     
  |  2.) 200 OK, Atom Feed Doc     |    
  |&lt;-------------------------------|     
  |                                |
          </artwork>
        </figure>

        <t>
          <list style="numbers">
        <t>
          The client sends a GET request to the membership list IRI.
        </t>
        <t>
          The server responds with an Atom Feed Document containing
          the IRIs of all the collection members that 
          match the selection criteria.
        </t>
          </list>
        </t>

      </section>

       


    <section title="Success and Failure">

        <t>
	  The Atom Protocol uses HTTP status codes to signal the results
	  of protocol operations.
          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. Consult the HTTP
          specification <xref target="RFC2616"/> for the definitions of HTTP status codes.
        </t>

      </section>


 </section>

            <section title="XML-related Conventions" anchor="xml-conv">

                <t> The data format in this specification is 
		specified in terms of the XML Information Set,
		serialised as XML 1.0 <xref target="W3C.REC-xml-20040204"/>. Atom Publishing
		Protocol Documents MUST be well-formed XML. This specification does not define
		any DTDs for Atom Protocol, and hence does not require them to be valid (in the
		sense used by XML).</t>
		

		<section title="Referring to Information Items" anchor="i-items">
                    <t>This specification uses a shorthand for
                    two common terms:
		    the phrase "Information Item" is omitted when
                    naming Element Information Items and Attribute Information Items.
                    Therefore, when this specification uses the term "element," it is
                    referring to an Element Information Item in Infoset terms.  Likewise,
                    when it uses the term "attribute," it is referring to an Attribute
                    Information Item.
                </t></section>


	      <section title="XML Namespace Usage" anchor="xmlns">

                <t>The Namespace URI 
                    <xref target="W3C.REC-xml-names-19990114"/> for the
                    data format described in this specification is: 
                </t>
                <figure>
                    <artwork>
http://purl.org/atom/app#</artwork>
                </figure>
               <t> This specification uses the prefix "app:" for the Namespace
               URI. The choice of namespace prefix is not semantically
               significant.
                </t>
                <t>This specification also uses the prefix "atom:"
                    for the Namespace URI identified in <xref target="AtomFormat"/>. 
                </t></section>

		<section title="RELAX NG Schema">
                <t>
                    Some sections of this specification are illustrated with fragments of
                    a non-normative RELAX NG Compact schema <xref target="RNC"/>.  However, the
                    text of this specification provides the definition of conformance.  A
                    complete schema appears in Appendix B.
                </t></section>
     <section title="Use of xml:base and xml:lang" anchor="baselang">

         <t>XML elements defined by this specification MAY have an xml:base attribute
             <xref target="W3C.REC-xmlbase-20010627"/>. When xml:base is used, it serves
             the function described in section 5.1.1 of <xref target="RFC3986"/>,
             establishing the base URI (or IRI) for resolving any relative references found
             within the effective scope of the xml:base attribute. </t>

         <t>Any element defined by this specification MAY have an xml:lang
         attribute, whose content indicates the natural language for the element
         and its descendents. The language context is only significant for
         elements and attributes declared to be "Language-Sensitive" by this
         specification. Requirements regarding the content and interpretation of
         xml:lang are specified in Section 2.12 of XML 1.0 <xref
         target="W3C.REC-xml-20040204"/>, .

             <figure>
 <artwork>appCommonAttributes =
   attribute xml:base { atomUri }?,
   attribute xml:lang { atomLanguageTag }?,
   undefinedAttribute*</artwork>
             </figure>     

         </t>

     </section>
            </section>

 <section title="Introspection Documents" anchor="appdocs">

     <section title="Introduction" anchor="appdocs_intro">
         <t> For authoring to commence, a client needs to first discover the
         capabilities and locations of collections offered. This is done using 
         Introspection Documents. An Introspection Document describes
         workspaces, which are server-defined groupings of collections.
         </t>
     </section>

     <section title="Example" anchor="appdocs_example">

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

         <t>This Introspection Document describes two workspaces. 
             The first, called 'Main Site', has two collections
             called 'My Blog Entries' and 'Pictures' whose IRIs
             are 'http://example.org/reilly/main' and 'http://example.org/reilly/pic'
             respectively.
             'My Blog Entries' is an Entry collection and 
             'Pictures' is a Media collection. Entry and Media collections
             are discussed in <xref target="member-type"/>.
         </t>
         <t>The second workspace is called 'Side Bar Blog' and has a 
             single collection called 'Remaindered Links' whose collection
             IRI is 'http://example.org/reilly/list'. 'Remaindered
             Links' is an Entry collection.
         </t>


     <t>Introspection documents are identified with the "application/atomserv+xml" media type (see
         <xref target="iana"/>).
     </t>

     <t> While an introspection document allows multiple 
         workspaces, there is no requirement that a service support multiple workspaces.
         In addition, a collection MAY appear in more than one workspace.
     </t>

     </section>


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

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

        <t>The root of an introspection document is the app:service element. </t>

         <figure>
             <artwork>namespace app = "http://purl.org/atom/app#" 
start = appService
             </artwork>
         </figure>


            <t>The "app:service" element is the container for
                introspection information associated with one or more
                workspaces. An app:service element MUST contain one or more app:workspace elements.</t>

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

        </section>

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

            <t>
                The 'app:workspace' element contains information
                elements about the collections of resources
                available for editing. The app:workspace element 
                MUST contain one or more app:collection elements.
            </t>

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

            <section title="The 'title' Attribute">
                <t>The app:workspace element MUST contain a 'title'
                    attribute, which conveys a human-readable name for the
                    workspace. This attribute is Language-Sensitive.</t>
            </section>

        </section>


        <section title="The 'app:collection' Element">
            <t>
                The app:collection contains information 
                elements that describe the location
                and capabilities of a collection.
            </t>
            <t>
                <figure>
                    <artwork name="app:collection"/>
                </figure>
            </t>

            <section title="The 'title' Attribute">
                <t> The app:collection element MUST contain a 'title'
                    attribute, whose value conveys a human-readable name
                    for the collection. This attribute is
                    Language-Sensitive.
                </t>
            </section>
            <section title="The 'href' Attribute">
                <t>The app:collection element MUST contain an 'href'
                    attribute, whose value conveys the IRI of the
                    collection.
                </t>
            </section>

            <t>
                This specification defines two child elements for app:collection:
                <list style="symbols">
                    <t>
                        app:member-type: a single element that contains the type of
                        members that the collection can contain.
                    </t>
                    <t>
                        app:list-template: a single element that contains a IRI template
                        of a membership list. (See <xref target="templates"/>).
                    </t>
                </list>
            </t>
        </section>

        <section title="The 'app:member-type' Element" anchor="member-type">
            <t>
                The app:collection element MUST contain one 'app:member-type'
                element. The app:member-type element value specifies the types
                of members that can appear in the collection.
            </t>
            <t>
                <figure>
                    <artwork name="app:member" />
                </figure>
            </t>
            <t>
                An Entry POSTed to a collection MUST meet the constraints of the
                app:member-type element.
            </t>
            <t>
                This specification defines two initial values for the app:member-type IANA registry:
                <list style="symbols">
                    <t>
                        "entry" - The collection contains only member
                        resources whose representation MUST be an Atom Entry.
                        Further constraints on the representations of members
                        in a collection of type "entry" are listed in <xref target="author_entry"/>.
                    </t>
                    <t>
                        "media" - The collection contains member resources
                        whose representation can be of any media type. Additional
                        constraints are listed in <xref target="author_generic"/>.
                    </t>
                </list>
            </t>
            <t>In general the value of app:member-type MUST be a string that is
            non-empty, and matches either the "isegment-nz-nc" or the "IRI"
            production in <xref target="RFC3987"/>. Note that use of a relative
            reference other than a simple name is not allowed. If a name is
            given, implementations MUST consider the link relation type to be
            equivalent to the same name registered within the IANA Registry of
            Link Relations <xref target="iana"/>, and thus the IRI that would be
            obtained by appending the value of the rel attribute to the string
            "http://www.iana.org/assignments/member-type/".
            </t>
        </section>

        <section title="The 'app:list-template' Element" anchor="list-template">
            <t>
                 The app:collection element MUST contain one 'app:list-template'
                    elements. The element content of app:list-template is an <xref target="templates">IRI template </xref> for a
                collection.
            </t>
            <t>
                <figure>
                    <artwork name="app:list-template" />
                </figure>
            </t>
        </section>

    </section>

</section>




                
   <section title="Collections"  anchor="collection_resource">

     <section title="Creating resources with POST">
       <t>Every collection accepts POST requests to create resources - the
       client POSTs a representation of the desired resource to the IRI of the
       collection. Collections MAY impose constraints on the media-types that
       are created in a collection and MAY generate a response with a status
       code of 415 ("Unsupported Media Type").</t>
   
       <t>The status code returned for a successful creation POST MUST be 201
       ("Created").</t>
       
       <t>A successful creation POST MUST return a Location: header with the URI
       of the newly created resource. </t>

 <t>Clients MAY POST invalid Atom for initial resource creation - specifically
 the id and link elements MAY be omitted.</t>

       <t>Below, the client requests to create a resource in a collection:
   <figure>
   <artwork><![CDATA[
POST /edit HTTP/1.1
Host: example.org
User-Agent: Thingio/1.0
Content-Type: application/atom+xml
Content-Length: nnn

<entry xmlns="http://www.w3.org/2005/Atom">
    <title>Atom-Powered Robots Run Amok</title>
    <updated>2003-12-13T18:30:02Z</updated>
    <summary>Some text.</summary>
</entry>]]></artwork>
   </figure>
   The resource is created by sending an Atom Entry as the entity body. </t>
   
   <t>
       Successful creation is indicated by a 201 created response and includes a Location: header.
   
   <figure>
   <artwork><![CDATA[
HTTP/1.1 201 Created
Date: Fri, 7 Oct 2005 17:17:11 GMT
Content-Length: 0  
Location: http://example.org/edit/first-post.atom]]></artwork>
   </figure>
   </t>
   <section title="Title: Header">

       <t>The POST to a collection  MAY contain a Title: header
           that indicates the client's suggested title for the resource.  The server MAY
           ignore the Title: header or modify the requested title.</t>
       <figure>
           <artwork>
Title = "Title" ":" [text] </artwork>
       </figure>  
<t> The syntax of this header MUST conform to the augmented BNF grammar in section 2.1 of the HTTP/1.1 specification <xref target="RFC2616"/>.</t>
   </section>  


   </section>
   
   
    <section title="Entry Collections" anchor="author_entry">

        <t>
            Entry Collections are collections that restrict their
            membership to Atom Entries. They are identified by
            having an app:member-type of "entry".
            Every member representation MUST contain an atom:link
            element with a relation of rel="edit" that contains
            the IRI of the member resource.
            Member representations MAY contain an <xref target="pub-control">app:control
                element</xref>.
        </t>

 	<section title="Role of Atom Entry Elements During Editing" anchor="entry-constraints">
        
        <t>The elements of an Atom Entry Document are either a
            client writable or server controlled.</t>

        <t>Client Writable - An element of an Atom Entry whose value is editable
        by the client. Servers MAY modify the content of client writable
        elements.  Some reasons that a server may change client writable content
        include length limits, obscenity filters or the addition of boilerplate
        text.
        </t>

        <t> 
            Server Controlled - An element of an Atom Entry 
            whose value is enforced by the server and not editable
            by the client. Clients SHOULD NOT change the value
            of server controlled elements. Servers MUST NOT
            rely on clients preserving the values of server controlled
            elements.
        </t>


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

  </section>
    </section>


    <section title="Media Collections" anchor="author_generic">

        <t>Media Collections are collections whose member
            representations are not constrained.
            They are identified by having an app:member-type of "media".
        </t>

        <section title="Editing Media Resources" >

            <t>When a membership list resource returns an Atom Feed enumerating the contents of a
                Media Collection, all the Entries MUST have an atom:content element with a 'src'
                attribute. When creating a public, read-only reference to the 
                member resource, a client SHOULD use the "atom:content/@src" attribute value.
            </t>
        </section>

</section>  
   </section>

       <section title="Listing Collections" anchor="templates">

<t>Collections, as identified in an Introspection Document, are resources that
MUST provide representations in the form of Atom Feed documents.  The entries in
the returned Feed MUST be ordered by their 'atom:updated' property, with the
most recently updated entries coming first in the document order. Every entry in
the Feed Document MUST have an atom:link element with a relation of "edit" (See
<xref target="new-link-relation"/>).  Clients MUST NOT assume that an Atom Entry
returned in the Feed is a full representation of a member resource. The value of
atom:updated is only changed when the change to a member resource is considered
significant. Insignificant changes do not result in changes to the atom:updated
value and thus do not change the position of the corresponding entry in a
membership list. Clients SHOULD be constructed with this in mind and SHOULD
perform a GET on the member resource before editing.
               </t>

<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 contained every entry in the feed, and the server would
waste large amounts of bandwidth and processing time on clients unable to
handle the response.</t>

<t>For this reason, Introspection documents refer to collections not with IRIs
but with IRI Templates, contained in the "app:member-type" child of
"app:collection".  An IRI Template is a string containing the embedded token
"{index}".</t>

<t>To produce an IRI that can be used to retrieve part or all of the collection, software
replaces the "{index}" with a pair of positive integer
                   indices separated by a dash character.
		   An IRI template MUST, after such substitution has been
		   performed, constitute a syntactically valid IRI.
		   </t>
		   <t>One or other index MAY be omitted, in which
                   case the range is understood as stretching to 0 or infinity.
                   The index values are 0 based and select members from the collection based on the 
                   member's index, with all of the members ordered by their 'atom:updated' property.
                   The response to the selection request MUST be an Atom Feed where
                   all the entries fall within the requested criteria. The request range is
                   considered a closed set - if an entry 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 an Atom Feed containing no entries. 
                   If a membership list is returned with a number of entries
                   that is less than the number of entries requested than the 
                   client MAY assume that it has made a request
                   that exceeds the last index of the members.
               </t>


               <t>
                   For example, suppose the client is supplied this IRI template:
                   <figure>
                       <artwork>
http://example.org/blog/edit/{index}</artwork>
                   </figure>
                   If the client wants the first 15 entries in the collection it would substitute
                   the brace-delimited parameter {index}, with the value 0-14, giving:
                   <figure>
                       <artwork>
http://example.org/blog/edit/0-14</artwork>
                   </figure>
               </t>
           </section>




   <section title="Atom Entry Extensions" anchor="atom-entry-extensions">
       <t>This specification adds one new value to the Registry of 
           Link Relations and also adds a new element to Atom Entries called  
           "app:control"  for controlling publishing.
           These new links and app:control elements MAY appear in both
           membership lists and in member representations.
       </t>

       <section title="The 'edit' Link Relation" anchor="new-link-relation">
           <t>This specification adds the value "edit"
               to the Registry of Link Relations. 
               The value of "edit" signifies that the IRI in the value 
               of the href attribute is the IRI 
               of the member resource, and is intended to be used to
	           update and delete resources as described in this specification.
           </t>
       </section>

       <section title="Publishing Control" anchor="pub-control">
           <t>
               This specification also adds a new element to Atom Entries for
               controlling publishing.
           </t>

           <figure>
               <artwork>
 pubControl =
    element app:control {
    atomCommonAttributes,
    pubDraft?
    &amp; extensionElement
 }

 pubDraft =
   element app:draft { "yes" | "no" }</artwork>
        </figure>


        <t>The "app:control" element MAY appear as a child of an 
            "atom:entry" which is being created or updated via the 
            Atom Publishing Protocol. The "app:control" element, if it 
            does appear in an entry, MUST only appear at most one time.
        </t>

        <t>The "app:control" element and its children elements MAY be 
            included in Atom Feed or Entry Documents. The "app:control" 
            element is considered "foreign markup" as defined in Section 6 
            of the Atom Syndication Format.
        </t>

        <t>The "app:control" element MAY contain exactly one app:draft 
            element and MAY contain zero or more extension elements as 
            outlined in the Atom Syndication Format, Section 6. 
            Both clients and servers MUST ignore foreign markup 
            present in the app:control element that they do not know.
        </t>

        <section title="The app:draft Element" anchor="pub_control_elements"> 

            <t>
                This specification defines only one child element for "app:control", "app:draft".
            </t>


            <t>The number of "app:draft" elements in "app:control" MUST be zero or 
                one. Its content MUST be one of the values 
                "yes" or "no". A value of "no"
                means that the entry MAY be made publicly visible. If the "app:draft" 
                element is missing then the value is understood to be "no". 
                That is, if "app:control" and/or the "app:draft" elements are 
                missing from an entry then the entry is considered not a draft 
                and can be made publicly visible. Clients MUST understand 
                "app:draft" elements and MUST NOT drop them from Atom 
                Entries during editing. Clients MUST NOT operate on the 
                expectation that a server will honor the value of an "app:draft"
                element. Servers MAY ignore "app:draft" elements
                and drop them from Atom Entries.
            </t>
        </section>
    </section>

</section>  


      <section title="Example">


          <t>
              This is an example of a client creating a new entry with an image. 
              The client has an image to publish and an entry that includes an HTML 
              'img' element that uses that image. In this scenario we consider
              a client that has IRIs of two collections, an entry collection 
              and a media collection, both of which were discovered
              through an introspection document. The IRI of the entry collection
              is: 
          </t>
                <figure>
                    <artwork>
http://example.net/blog/edit/</artwork>
                </figure>


                <t>
                    The IRI of the media collection is:
                </t>

                <figure>
                    <artwork>
http://example.net/binary/edit</artwork>
                </figure>

                <t>
                    First the client creates a new image resource
                    by POSTing the image to the 
                    IRI of the media collection.
                </t>

                <figure>
                    <artwork><![CDATA[
POST /binary/edit/ HTTP/1.1
Host: example.net
User-Agent: Thingio/1.0
Content-Type: image/png
Content-Length: nnnn
Title: A picture of the beach

...binary data...]]></artwork></figure>

          <t>The member resource is created 
              and an HTTP status code of 201 is returned.</t>

                <figure>
                    <artwork><![CDATA[
HTTP/1.1 201 Created
Date: Fri, 25 Mar 2005 17:17:11 GMT
Content-Length: nnnn
Content-Type: application/atom+xml
Location: http://example.net/binary/edit/b/129.png

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
    <title>A picture of the beach.</title>
    <link rel="edit" 
        href="http://example.net/binary/edit/b/129.png"/>
    <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-568596895695</id>
    <updated>2005-09-02T10:30:00Z</updated>
    <summary>Waves</summary>
    <content type="image/png" 
        src="http://example.net/binary/readonly/129.png"/>
</entry>]]></artwork>
            </figure>


            <t>
                The client then POSTs the Atom Entry that 
                refers to the newly created image resource.
                Note that the client takes the IRI
                http://example.net/binary/readonly/129.png and uses it in
                the 'img' element in the Entry content:
            </t> 

                <figure>
                    <artwork><![CDATA[
POST  /blog/edit/ HTTP/1.1
Host: example.net
User-Agent: Thingio/1.0
Content-Type: application/atom+xml
Content-Length: nnnn

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
    <title>What I did on my summer vacation</title>
    <updated>2005-09-02T10:30:00Z</updated>
    <summary>Beach!</summary>
    <content type="xhtml" xml:lang="en">
        <div xmlns="http://www.w3.org/1999/xhtml">
            <p>We went to the beach for summer vacation.
                Here is a picture of the waves rolling in:
                <img 
                    src="http://example.net/binary/readonly/129.png" 
                    alt="A picture of the beach."
                    />
            </p>
        </div>
    </content>   
</entry>]]></artwork>
            </figure>
      </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 session using TLS (see <xref target="RFC2246" />).
        </t>
        <t>
          There are cases where an authentication mechanism is  
          not be required, such as a publicly editable Wiki, or
          when using POST to send comments to a site that
          does not require authentication from a commenter.
        </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>
          The security of Atom is based on HTTP Digest
          Authentication and/or [@@TBD@@ CGI Authentication].  Any
          weaknesses in either of these authentication schemes
          will 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 <xref target="RFC2617" /> for the 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>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>	      

          <!-- Add IANA registry for member-type here. -->
      </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="July" year="2005" /> 
               </front> 
               <seriesInfo name="" value="1.0" /> 
            </reference>

      &rfc2119; &rfc2246; <!--&rfc2396;--> &rfc2616; &rfc2617; &rfc3023;  &rfc3986; &rfc3987; &XML; &XMLNS; &XMLBASE;</references>

      <references title="Informative References">
	
	&WEBARCH;
     <reference anchor="RNC"> 
               <front> 
             <title>RELAX NG Compact Syntax</title> 
             <author initials="J." surname="Clark" fullname="James Clark">
               <organization/>
             </author>
             <date month="December" year="2001" /> 
               </front> 

            </reference>
	
      </references>
<section title="Contributors">
  <t>
  The content and concepts within are a product of the Atom community and the Atompub Working Group. 
  </t>
  <t>
  <!-- <cref source="dehora">chairs to compile a contribution list for 1.0</cref> -->
  <!--
  The Atompub Working Group has many active contributors who proposed ideas and wording 
  for this document, including:
  -->
  </t>
</section>

<section title="RELAX NG Compact Schema">
<t>
This appendix is informative.
</t>

<t>
The Relax NG schema explicitly excludes elements in the APP namespace which are
not defined in this revision of the specification. Requirements for APP
Processors encountering such markup are given in Section 6.2 and Section 6.3 of <xref target="AtomFormat" />.
</t>

                <figure>

<artwork name="app:allSchema" />

                </figure>

           </section>


           <section title="Revision History">
               <t>draft-ietf-atompub-protocol-06 - Removed: Robert Sayre from the
                   contributors section per his request. 
                   Added in PaceCollectionControl. Fixed all the {daterange} verbage
                   and examples so they all use a dash.  Added full rnc schema.
                   Collapsed Introspection and Collection documents into a single 
                   document. Removed {dateRange} queries. Renamed search to list.
                   Moved discussion of media and entry collection until 
                   later in the document and tied the discussion to the 
                   Introspection element app:member-type.
               </t>

               <t>draft-ietf-atompub-protocol-05 - Added: Contributors section.  Added:
                   de hOra to editors.  Fixed: typos.  Added diagrams and description to
                   model section. Incorporates PaceAppDocuments, PaceAppDocuments2,
                   PaceSimplifyCollections2 (large-sized chunks of it anyhow: the notions
                   of Entry and Generic resources, the section 4 language on the Protocol
                   Model, 4.1 through 4.5.2, the notion of a Collection document, as in
                   Section 5 through 5.3, Section 7 "Collection resources", Selection
                   resources (modified from pace which talked about search); results in
                   major mods to Collection Documents, Section 9.2 "Title: Header" and
                   brokeout para to section 9.1 Editing Generic Resources). Added XML
                   namespace and language section. Some cleanup of front matter.  Added
                   Language Sensitivity to some attributes. Removed resource descriptions
                   from terminology. Some juggling of sections. See:
                   http://www.imc.org/atom-protocol/mail-archive/msg01812.html.
               </t>

               <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 its 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 its 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 its own section. Added the Revision History section.
                    Added more to the warning that the example URIs are not normative.
                </t>
            </section>

    </back>
      </rfc>






