draft-ietf-atompub-protocol-09.txt | draft-ietf-atompub-protocol-10.txt | |||
---|---|---|---|---|
Network Working Group J. Gregorio, Ed. | Network Working Group J. Gregorio, Ed. | |||
Internet-Draft BitWorking, Inc | Internet-Draft IBM | |||
Expires: December 25, 2006 B. de hOra, Ed. | Expires: March 9, 2007 B. de hOra, Ed. | |||
Propylon Ltd. | Propylon Ltd. | |||
June 23, 2006 | September 05, 2006 | |||
The Atom Publishing Protocol | The Atom Publishing Protocol | |||
draft-ietf-atompub-protocol-09.txt | draft-ietf-atompub-protocol-10.txt | |||
Status of this Memo | Status of this Memo | |||
By submitting this Internet-Draft, each author represents that any | By submitting this Internet-Draft, each author represents that any | |||
applicable patent or other IPR claims of which he or she is aware | applicable patent or other IPR claims of which he or she is aware | |||
have been or will be disclosed, and any of which he or she becomes | have been or will be disclosed, and any of which he or she becomes | |||
aware will be disclosed, in accordance with Section 6 of BCP 79. | aware will be disclosed, in accordance with Section 6 of BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF), its areas, and its working groups. Note that | Task Force (IETF), its areas, and its working groups. Note that | |||
skipping to change at page 1, line 35 | skipping to change at page 1, line 35 | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
The list of current Internet-Drafts can be accessed at | The list of current Internet-Drafts can be accessed at | |||
http://www.ietf.org/ietf/1id-abstracts.txt. | http://www.ietf.org/ietf/1id-abstracts.txt. | |||
The list of Internet-Draft Shadow Directories can be accessed at | The list of Internet-Draft Shadow Directories can be accessed at | |||
http://www.ietf.org/shadow.html. | http://www.ietf.org/shadow.html. | |||
This Internet-Draft will expire on December 25, 2006. | This Internet-Draft will expire on March 9, 2007. | |||
Copyright Notice | Copyright Notice | |||
Copyright (C) The Internet Society (2006). | Copyright (C) The Internet Society (2006). | |||
Abstract | Abstract | |||
The Atom Publishing Protocol (APP) is an application-level protocol | The Atom Publishing Protocol (APP) is an application-level protocol | |||
for publishing and editing Web resources. The protocol is based on | for publishing and editing Web resources. The protocol is based on | |||
HTTP transport of Atom-formatted representations. The Atom format is | HTTP transport of Atom-formatted representations. The Atom format is | |||
documented in the Atom Syndication Format (RFC4287). | documented in the Atom Syndication Format (RFC4287). | |||
Editorial Note | Editorial Note | |||
To provide feedback on this Internet-Draft, join the atom-protocol | To provide feedback on this Internet-Draft, join the atom-protocol | |||
mailing list (http://www.imc.org/atom-protocol/index.html) [1]. | mailing list (http://www.imc.org/atom-protocol/index.html) [1]. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2. Notational Conventions . . . . . . . . . . . . . . . . . . . 5 | 2. Notational Conventions . . . . . . . . . . . . . . . . . . . 5 | |||
3. Terminology . . . . . . . . . . . . . . . . . . . . . . . . 6 | 2.1 XML-related Conventions . . . . . . . . . . . . . . . . . 5 | |||
4. Protocol Model . . . . . . . . . . . . . . . . . . . . . . . 7 | 2.1.1 Referring to Information Items . . . . . . . . . . . . 5 | |||
5. Protocol Operations . . . . . . . . . . . . . . . . . . . . 8 | 2.1.2 RELAX NG Schema . . . . . . . . . . . . . . . . . . . 5 | |||
5.1 Retrieving an Introspection Document . . . . . . . . . . . 8 | 2.1.3 Use of xml:base and xml:lang . . . . . . . . . . . . . 5 | |||
5.2 Creating a Resource . . . . . . . . . . . . . . . . . . . 8 | 3. Terminology . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
5.3 Editing a Resource . . . . . . . . . . . . . . . . . . . . 8 | 4. Protocol Model . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
5.3.1 Retrieving a Resource . . . . . . . . . . . . . . . . 9 | 5. Protocol Operations . . . . . . . . . . . . . . . . . . . . 10 | |||
5.3.2 Updating a Resource . . . . . . . . . . . . . . . . . 9 | 5.1 Retrieving a Service Document . . . . . . . . . . . . . . 10 | |||
5.3.3 Deleting a Resource . . . . . . . . . . . . . . . . . 9 | 5.2 Listing Collection Members . . . . . . . . . . . . . . . . 10 | |||
5.4 Listing Collection Members . . . . . . . . . . . . . . . . 10 | 5.3 Creating a Resource . . . . . . . . . . . . . . . . . . . 11 | |||
5.5 Use of HTTP Response codes . . . . . . . . . . . . . . . . 10 | 5.4 Editing a Resource . . . . . . . . . . . . . . . . . . . . 11 | |||
6. XML-related Conventions . . . . . . . . . . . . . . . . . . 11 | 5.4.1 Retrieving a Resource . . . . . . . . . . . . . . . . 11 | |||
6.1 Referring to Information Items . . . . . . . . . . . . . . 11 | 5.4.2 Updating a Resource . . . . . . . . . . . . . . . . . 12 | |||
6.2 XML Namespace Usage . . . . . . . . . . . . . . . . . . . 11 | 5.4.3 Deleting a Resource . . . . . . . . . . . . . . . . . 12 | |||
6.3 Use of xml:base and xml:lang . . . . . . . . . . . . . . . 11 | 5.5 Use of HTTP Response codes . . . . . . . . . . . . . . . . 12 | |||
6.4 RELAX NG Schema . . . . . . . . . . . . . . . . . . . . . 12 | 6. Atom Publishing Protocol Documents . . . . . . . . . . . . . 13 | |||
7. Introspection Documents . . . . . . . . . . . . . . . . . . 13 | 6.1 Document Types . . . . . . . . . . . . . . . . . . . . . . 13 | |||
7.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . 13 | 6.2 Document Extensibility . . . . . . . . . . . . . . . . . . 13 | |||
7. Category Documents . . . . . . . . . . . . . . . . . . . . . 14 | ||||
7.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . 14 | ||||
7.2 Element Definitions . . . . . . . . . . . . . . . . . . . 14 | 7.2 Element Definitions . . . . . . . . . . . . . . . . . . . 14 | |||
7.2.1 The "app:service" Element . . . . . . . . . . . . . . 14 | 7.2.1 The "app:categories" element . . . . . . . . . . . . . 14 | |||
7.2.2 The "app:workspace" Element . . . . . . . . . . . . . 14 | 8. Service Documents . . . . . . . . . . . . . . . . . . . . . 16 | |||
7.2.3 The "app:collection" Element . . . . . . . . . . . . . 15 | 8.1 Example . . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
7.2.4 The "app:accept" Element . . . . . . . . . . . . . . . 16 | 8.2 Element Definitions . . . . . . . . . . . . . . . . . . . 17 | |||
8. Collections . . . . . . . . . . . . . . . . . . . . . . . . 17 | 8.2.1 The "app:service" Element . . . . . . . . . . . . . . 17 | |||
8.1 Creating resources with POST . . . . . . . . . . . . . . . 17 | 8.2.2 The "app:workspace" Element . . . . . . . . . . . . . 17 | |||
8.2 Example . . . . . . . . . . . . . . . . . . . . . . . . . 17 | 8.2.3 The "app:collection" Element . . . . . . . . . . . . . 18 | |||
8.3 The 'edit' Link . . . . . . . . . . . . . . . . . . . . . 19 | 8.2.4 The "app:accept" Element . . . . . . . . . . . . . . . 19 | |||
8.4 Media Resources and Media Link Entries . . . . . . . . . . 19 | 8.2.5 The "app:categories" Element . . . . . . . . . . . . . 20 | |||
8.4.1 Title: Header . . . . . . . . . . . . . . . . . . . . 20 | 9. Creating and Editing Resources . . . . . . . . . . . . . . . 22 | |||
8.4.2 Example . . . . . . . . . . . . . . . . . . . . . . . 20 | 9.1 Member URIs . . . . . . . . . . . . . . . . . . . . . . . 22 | |||
8.5 Editing Entries with Foreign Markup . . . . . . . . . . . 21 | 9.2 Creating resources with POST . . . . . . . . . . . . . . . 22 | |||
9. Listing Collections . . . . . . . . . . . . . . . . . . . . 22 | 9.2.1 Example . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
9.1 Collection Paging . . . . . . . . . . . . . . . . . . . . 22 | 9.3 Updating Resources with PUT . . . . . . . . . . . . . . . 24 | |||
10. Atom Format Link Relation Extensions . . . . . . . . . . . . 24 | 9.4 Deleting Resources with DELETE . . . . . . . . . . . . . . 24 | |||
10.1 The "edit" Link Relation . . . . . . . . . . . . . . . . 24 | 9.5 Media Resources and Media Link Entries . . . . . . . . . . 24 | |||
10.2 The "edit-media" Link Relation . . . . . . . . . . . . . 24 | 9.6 The Slug: Header . . . . . . . . . . . . . . . . . . . . . 25 | |||
11. Atom Publishing Control Extensions . . . . . . . . . . . . . 25 | 9.6.1 Slug: Header syntax . . . . . . . . . . . . . . . . . 25 | |||
11.1 The Atom Publishing Control Namespace . . . . . . . . . 25 | 9.6.2 Examples . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
11.2 The "pub:control" Element . . . . . . . . . . . . . . . 25 | 10. Listing Collections . . . . . . . . . . . . . . . . . . . . 28 | |||
11.2.1 The "pub:draft" Element . . . . . . . . . . . . . . 25 | 10.1 Collection Paging . . . . . . . . . . . . . . . . . . . 28 | |||
12. Securing the Atom Protocol . . . . . . . . . . . . . . . . . 26 | 11. Atom Format Link Relation Extensions . . . . . . . . . . . . 30 | |||
13. Security Considerations . . . . . . . . . . . . . . . . . . 27 | 11.1 The "edit" Link Relation . . . . . . . . . . . . . . . . 30 | |||
14. IANA Considerations . . . . . . . . . . . . . . . . . . . . 28 | 11.2 The "edit-media" Link Relation . . . . . . . . . . . . . 30 | |||
15. References . . . . . . . . . . . . . . . . . . . . . . . . . 30 | 12. Atom Publishing Controls . . . . . . . . . . . . . . . . . . 31 | |||
15.1 Normative References . . . . . . . . . . . . . . . . . . 30 | 12.1 The "app:control" Element . . . . . . . . . . . . . . . 31 | |||
15.2 Informative References . . . . . . . . . . . . . . . . . 31 | 12.1.1 The "app:draft" Element . . . . . . . . . . . . . . 31 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . 32 | 13. Securing the Atom Protocol . . . . . . . . . . . . . . . . . 32 | |||
A. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 33 | 14. Security Considerations . . . . . . . . . . . . . . . . . . 33 | |||
B. RELAX NG Compact Schema . . . . . . . . . . . . . . . . . . 34 | 15. IANA Considerations . . . . . . . . . . . . . . . . . . . . 34 | |||
C. Revision History . . . . . . . . . . . . . . . . . . . . . . 37 | 15.1 Content-type registration for | |||
Intellectual Property and Copyright Statements . . . . . . . 40 | 'application/atomserv+xml' . . . . . . . . . . . . . . . 34 | |||
15.2 Content-type registration for | ||||
'application/atomcat+xml' . . . . . . . . . . . . . . . 35 | ||||
16. References . . . . . . . . . . . . . . . . . . . . . . . . . 37 | ||||
16.1 Normative References . . . . . . . . . . . . . . . . . . 37 | ||||
16.2 Informative References . . . . . . . . . . . . . . . . . 38 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . 39 | ||||
A. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 40 | ||||
B. RELAX NG Compact Schema . . . . . . . . . . . . . . . . . . 41 | ||||
C. Revision History . . . . . . . . . . . . . . . . . . . . . . 47 | ||||
Intellectual Property and Copyright Statements . . . . . . . 50 | ||||
1. Introduction | 1. Introduction | |||
The Atom Publishing Protocol is an application-level protocol for | The Atom Publishing Protocol is an application-level protocol for | |||
publishing and editing Web resources using HTTP [RFC2616] and XML 1.0 | publishing and editing Web resources using HTTP [RFC2616] and XML 1.0 | |||
[W3C.REC-xml-20040204]. The protocol supports the creation of | [W3C.REC-xml-20040204]. The protocol supports the creation of | |||
arbitrary web resources and provides facilities for: | arbitrary web resources and provides facilities for: | |||
o Collections: Sets of resources, which can be retrieved in whole or | o Collections: Sets of resources, which can be retrieved in whole or | |||
in part. | in part. | |||
o Introspection: Discovering and describing collections. | o Service: Discovering and describing Collections. | |||
o Editing: Creating, updating and deleting resources. | o Editing: Creating, updating and deleting resources. | |||
2. Notational Conventions | 2. Notational Conventions | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
document are to be interpreted as described in [RFC2119]. | document are to be interpreted as described in [RFC2119]. | |||
Note: The Introspection Document allows the use of IRIs [RFC3987], as | Atom Protocol documents allow the use of IRIs [RFC3987], as well as | |||
well as URIs [RFC3986]. Every URI is an IRI, so any URI can be used | URIs [RFC3986]. Before an IRI found in a document is used by HTTP, | |||
where an IRI is needed. How to map an IRI to a URI is specified in | the IRI is first converted to a URI according the procedure defined | |||
Section 3.1 of Internationalized Resource Identifiers (IRIs) | in [RFC3987] (Section 3.1). The resource identified by the URI after | |||
[RFC3987]. | conversion is the same as the one identified by the IRI. | |||
2.1 XML-related Conventions | ||||
2.1.1 Referring to Information Items | ||||
Atom Protocol Document formats are specified in terms of the XML | ||||
Information Set [W3C.REC-xml-infoset-20040204], serialized as XML 1.0 | ||||
[W3C.REC-xml-20040204]. | ||||
The Infoset terms "Element Information Item" and "Attribute | ||||
Information Item" are shortened to "element" and "attribute" | ||||
respectively. Therefore, when this specification uses the term | ||||
"element", it is referring to an Element Information Item, and when | ||||
it uses the term "attribute", it is referring to an Attribute | ||||
Information Item. | ||||
2.1.2 RELAX NG Schema | ||||
Some sections of this specification are illustrated with fragments of | ||||
a non-normative RELAX NG Compact schema [RNC]. However, the text of | ||||
this specification provides the definition of conformance. Complete | ||||
schemas appear in Appendix B. | ||||
2.1.3 Use of xml:base and xml:lang | ||||
XML elements defined by this specification MAY have an xml:base | ||||
attribute [W3C.REC-xmlbase-20010627]. When xml:base is used, it | ||||
serves the function described in section 5.1.1 of URI Generic Syntax | ||||
[RFC3986], by establishing the base URI (or IRI) for resolving | ||||
relative references found within the scope of the xml:base attribute. | ||||
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 [W3C.REC-xml-20040204]. | ||||
3. Terminology | 3. Terminology | |||
For convenience, this protocol can be referred to as the "Atom | For convenience, this protocol can be referred to as the "Atom | |||
Protocol" or "APP". | Protocol" or "APP". | |||
URI/IRI - A Uniform Resource Identifier and Internationalized | URI/IRI - A Uniform Resource Identifier and Internationalized | |||
Resource Identifier. These terms and the distinction between them | Resource Identifier. These terms and the distinction between them | |||
are defined in [RFC3986] and [RFC3987]. Note that IRIs are mapped to | are defined in [RFC3986] and [RFC3987]. IRIs are mapped to URIs | |||
URIs before dereferencing takes place. | before dereferencing takes place. | |||
The phrase "the URI of a document" in this specification is shorthand | ||||
for "a URI which, when dereferenced, is expected to produce that | ||||
document as a representation". | ||||
Resource - A network-accessible data object or service identified by | Resource - A network-accessible data object or service identified by | |||
an IRI, as defined in [RFC2616]. See [W3C.REC-webarch-20041215] for | an IRI, as defined in [RFC2616]. See [W3C.REC-webarch-20041215] for | |||
further discussion on resources. | further discussion on resources. | |||
The phrase "the URI of a document" in this specification is shorthand | ||||
for "an URI which, when dereferenced, is expected to produce that | ||||
document as a representation". | ||||
Representation - An entity included with a request or response as | Representation - An entity included with a request or response as | |||
defined in [RFC2616]. | defined in [RFC2616]. | |||
Collection - A resource that contains a set of member IRIs. See | Collection - A resource that contains a set of Member IRIs. See | |||
Section 8. | Section 9. | |||
Member - A resource whose IRI is listed in a Collection. | Member - A resource whose IRI is listed in a Collection by a link | |||
element with a relation of "edit" or "edit-media". See Section 9.1. | ||||
Introspection Document - A document that describes the location and | Workspace - A group of collections. See Section 8. | |||
capabilities of one or more Collections. See Section 7. | ||||
Service Document - A document that describes the location and | ||||
capabilities of one or more Collections. See Section 8. | ||||
Category Document - A document that describes the categories allowed | ||||
in a Collection. See Section 7. | ||||
4. Protocol Model | 4. Protocol Model | |||
The Atom Publishing Protocol uses HTTP to edit and author web | The Atom Publishing Protocol uses HTTP methods to edit and author | |||
resources. The Atom Protocol uses the following HTTP methods: | Member Resources as follows: | |||
o GET is used to retrieve a representation of a resource or perform | o GET is used to retrieve a representation of a known resource. | |||
a query. | ||||
o POST is used to create a new, dynamically-named resource. | o POST is used to create a new, dynamically-named, resource. | |||
o PUT is used to update a known resource. | o PUT is used to update a known resource. | |||
o DELETE is used to remove a resource. | o DELETE is used to remove a known resource. | |||
Along with operations on resources the Atom Protocol provides | Along with operations on Member Resources the Atom Protocol defines | |||
structures, called Collections, for managing and organising | Collection resources for managing and organizing Member Resources. | |||
resources, called Members. Collections contain the IRIs of, and | Collections are represented by Atom Feed documents and contain the | |||
metadata about, their Member resources. Atom Protocol clients can | IRIs of, and metadata about, their Member Resources. | |||
use Introspection documents, which represent server-defined groups of | ||||
Collections, to initialize the process of creating and editing | ||||
resources. | ||||
Note that when an IRI is used for resource retrieval over HTTP, the | There are two kinds of Member Resources - Member Entry Resources and | |||
IRI is first converted to a URI according the procedure defined in | Media Resources. Member Entry Resources are represented as Atom | |||
[RFC3987] section 3.1. The resource that the IRI locates is the same | Entries. Media Resources MAY have representations in any media type. | |||
as the one located by the URI obtained after converting the IRI. | A Media Link Entry is a Member Entry that contains metadata about a | |||
Media Resource. This diagram shows the classification of the | ||||
resources: | ||||
Member Resource | ||||
-> Member Entry Resource | ||||
-> Media Link Entry Resource | ||||
-> Media Resource | ||||
Collections, represented by Atom feeds, contain entries. Those | ||||
entries contain the Member Entry and Media Resources IRIs of the | ||||
Collection. A Collection can contain any number of entries of either | ||||
kind. In the diagram of a Collection below there are two entries. | ||||
The first contains the IRI of a Member Entry Resource. The second | ||||
contains the IRIs of both a Media Resource and a Media Link Entry | ||||
Resource, which contains the metadata for that Media Resource: | ||||
Collection | ||||
Entry | ||||
Member Entry IRI -> Member Entry Resource | ||||
Entry | ||||
Member Entry IRI -> Media Link Entry Resource | ||||
Media IRI -> Media Resource | ||||
Service Documents represent server-defined groups of Collections, and | ||||
are used to initialize the process of creating and editing resources. | ||||
5. Protocol Operations | 5. Protocol Operations | |||
5.1 Retrieving an Introspection Document | 5.1 Retrieving a Service Document | |||
Client Server | Client Server | |||
| | | | | | |||
| 1.) GET to URI of Introspection Document | | | 1.) GET to URI of Service Document | | |||
|------------------------------------------>| | |------------------------------------------>| | |||
| | | | | | |||
| 2.) Introspection Document | | | 2.) Service Document | | |||
|<------------------------------------------| | |<------------------------------------------| | |||
| | | | | | |||
1. The client sends a GET request to the URI of the Introspection | 1. The client sends a GET request to the URI of the Service | |||
Document. | Document. | |||
2. The server responds with the document enumerating the IRIs of a | 2. The server responds with the document enumerating the IRIs of a | |||
set of Collections and the capabilities of those Collections | set of Collections and the capabilities of those Collections | |||
supported by the server. The content of this document can vary | supported by the server. The content of this document can vary | |||
based on aspects of the client request, including, but not | based on aspects of the client request, including, but not | |||
limited to, authentication credentials. | limited to, authentication credentials. | |||
5.2 Creating a Resource | 5.2 Listing Collection Members | |||
To list the members of a Collection the client sends a GET request to | ||||
the URI of a Collection. An Atom Feed Document is returned | ||||
containing one Atom Entry for each Member Entry Resource. See | ||||
Section 10 and Section 11 for a description of the feed contents. | ||||
Client Server | ||||
| | | ||||
| 1.) GET to Collection URI | | ||||
|------------------------------->| | ||||
| | | ||||
| 2.) 200 OK, Atom Feed Doc | | ||||
|<-------------------------------| | ||||
| | | ||||
1. The client sends a GET request to the URI of the Collection. | ||||
2. The server responds with an Atom Feed Document containing the | ||||
IRIs of the Collection members. | ||||
5.3 Creating a Resource | ||||
Client Server | Client Server | |||
| | | | | | |||
| 1.) POST to URI of Collection | | | 1.) POST to URI of Collection | | |||
|------------------------------------------>| | |------------------------------------------>| | |||
| | | | | | |||
| 2.) 201 Created | | | 2.) 201 Created | | |||
| Location: Member Entry URI | | ||||
|<------------------------------------------| | |<------------------------------------------| | |||
| | | | | | |||
1. The client POSTs a representation of the Member to the URI of the | 1. The client POSTs a representation of the Member to the URI of the | |||
collection. | Collection. | |||
2. If the Member resource was created successfully, the server | 2. If the Member Resource was created successfully, the server | |||
responds with a status code of 201 and a Location: header that | responds with a status code of 201 and a Location: header that | |||
contains the URI of the newly created resource. | contains the IRI of the newly created Member Entry Resource. | |||
Media Resources may have also been created and their IRIs can be | ||||
found through the Member Entry Resource. See Section 9.5 for | ||||
more details. | ||||
5.3 Editing a Resource | 5.4 Editing a Resource | |||
Once a resource has been created and its URI is known, that URI can | Once a resource has been created and its Member URI is known, that | |||
be used to retrieve, update, and delete the resource. | URI can be used to retrieve, update, and delete the resource. | |||
5.3.1 Retrieving a Resource | 5.4.1 Retrieving a Resource | |||
Client Server | Client Server | |||
| | | | | | |||
| 1.) GET to Member URI | | | 1.) GET to Member URI | | |||
|------------------------------------------>| | |------------------------------------------>| | |||
| | | | | | |||
| 2.) Member Representation | | | 2.) Member Representation | | |||
|<------------------------------------------| | |<------------------------------------------| | |||
| | | | | | |||
1. The client sends a GET request to the Member's URI to retrieve | 1. The client sends a GET request to the URI of a Member Resource to | |||
its representation. | retrieve its representation. | |||
2. The server responds with the representation of the resource. | 2. The server responds with the representation of the resource. | |||
5.3.2 Updating a Resource | 5.4.2 Updating a Resource | |||
Client Server | Client Server | |||
| | | | | | |||
| 1.) PUT to Member URI | | | 1.) PUT to Member URI | | |||
|------------------------------------------>| | |------------------------------------------>| | |||
| | | | | | |||
| 2.) 200 OK | | | 2.) 200 OK | | |||
|<------------------------------------------| | |<------------------------------------------| | |||
1. The client PUTs an updated representation to the Member's URI. | 1. The client PUTs an updated representation to the URI of a Member | |||
Resource. | ||||
2. Upon a successful update of the resource the server responds with | 2. Upon a successful update of the resource the server responds with | |||
a status code of 200. | a status code of 200. | |||
5.3.3 Deleting a Resource | 5.4.3 Deleting a Resource | |||
Client Server | Client Server | |||
| | | | | | |||
| 1.) DELETE to Member URI | | | 1.) DELETE to Member URI | | |||
|------------------------------------------>| | |------------------------------------------>| | |||
| | | | | | |||
| 2.) 200 Ok | | | 2.) 200 Ok | | |||
|<------------------------------------------| | |<------------------------------------------| | |||
| | | | | | |||
1. The client sends a DELETE request to the Member's URI. | 1. The client sends a DELETE request to the URI of a Member | |||
Resource. | ||||
2. Upon the successful deletion of the resource the server responds | 2. Upon the successful deletion of the resource the server responds | |||
with a status code of 200. | with a status code of 200. | |||
5.4 Listing Collection Members | A different approach is taken for deleting Media Resources, see | |||
Section 9.5 for details. | ||||
To list the members of a Collection the client sends a GET request to | ||||
the Collection's URI. An Atom Feed Document is returned containing | ||||
one Atom Entry for each member resource. See Section 9 and | ||||
Section 10 for a description of the feed contents. | ||||
Client Server | ||||
| | | ||||
| 1.) GET to Collection URI | | ||||
|------------------------------->| | ||||
| | | ||||
| 2.) 200 OK, Atom Feed Doc | | ||||
|<-------------------------------| | ||||
| | | ||||
1. The client sends a GET request to the Collection's URI. | ||||
2. The server responds with an Atom Feed Document containing the | ||||
IRIs of the collection members. | ||||
5.5 Use of HTTP Response codes | 5.5 Use of HTTP Response codes | |||
The Atom Protocol uses the response status codes defined in HTTP to | The Atom Protocol uses the response status codes defined in HTTP to | |||
indicate the success or failure of an operation. Consult the HTTP | indicate the success or failure of an operation. Consult the HTTP | |||
specification [RFC2616] for detailed definitions of each status code. | specification [RFC2616] for detailed definitions of each status code. | |||
It is RECOMMENDED that entities contained within HTTP 4xx and 5xx | It is RECOMMENDED that entities contained within HTTP 4xx and 5xx | |||
responses include a human-readable explanation of the error. | responses include a human-readable explanation of the error. | |||
6. XML-related Conventions | 6. Atom Publishing Protocol Documents | |||
The Atom Protocol Introspection format is specified in terms of the | ||||
XML Information Set [W3C.REC-xml-infoset-20040204], serialised as XML | ||||
1.0 [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. | ||||
6.1 Referring to Information Items | ||||
This specification uses a shorthand for two common terms: the phrase | 6.1 Document Types | |||
"Information Item" is omitted when discussing 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. | ||||
6.2 XML Namespace Usage | This specification describes two kinds of Documents - Category | |||
Documents and Service Documents. | ||||
The namespace name [W3C.REC-xml-names-19990114] for the XML format | A Category Document (Section 7) contain lists of categories specified | |||
described in this specification is: | using the "atom:category" element from the Atom Syndication Format. | |||
A Service Document (Section 8) describes capabilities of workspaces, | ||||
which are server-defined groupings of Collections. | ||||
The namespace name [W3C.REC-xml-names-19990114] for either kind of | ||||
document is: | ||||
http://purl.org/atom/app# | http://purl.org/atom/app# | |||
This specification uses the prefix "app:" for the namespace name. | This specification uses the prefix "app:" for the namespace name. | |||
The choice of namespace prefix is not semantically significant. | The prefix "atom:" is used for "http://www.w3.org/2005/Atom", the | |||
namespace name of the Atom Syndication Format [RFC4287]. The | ||||
namespace prefixes are not semantically significant. | ||||
The "app:" namespace is reserved for future forward-compatible | Atom Publishing Protocol Documents MUST be well-formed XML. This | |||
revisions of the Atom Publishing Protocol. Future versions of this | specification does not define any DTDs for Atom Protocol formats, and | |||
specification could add new elements and attributes to the markup | hence does not require them to be "valid" in the sense used by XML. | |||
vocabulary. Software written to conform to this version of the | ||||
specification will not be able to process such markup correctly and, | ||||
in fact, will not be able to distinguish it from markup error. For | ||||
the purposes of this discussion, unrecognized markup from the Atom | ||||
Publishing Protocol vocabulary will be considered "foreign markup". | ||||
This specification also uses the prefix "atom:" for | 6.2 Document Extensibility | |||
"http://www.w3.org/2005/Atom", the namespace name of the Atom | ||||
Syndication Format [RFC4287]. | ||||
6.3 Use of xml:base and xml:lang | The namespace name "http://purl.org/atom/app#" is reserved for future | |||
forward-compatible revisions of the document types. Future versions | ||||
of this specification could add new elements and attributes. | ||||
Software written to conform to this version of the specification will | ||||
not be able to process such markup correctly and in fact will not be | ||||
able to distinguish it from markup error. | ||||
XML elements defined by this specification MAY have an xml:base | Unrecognized markup in an Atom Publishing Protocol document is | |||
attribute [W3C.REC-xmlbase-20010627]. When xml:base is used, it | considered "foreign markup" as defined in [RFC4287]. | |||
serves the function described in section 5.1.1 of URI Generic Syntax | ||||
[RFC3986], establishing the base URI (or IRI) for resolving any | ||||
relative references found within the effective scope of the xml:base | ||||
attribute. | ||||
Any element defined by this specification MAY have an xml:lang | Markup from other vocabularies ("foreign markup") can be used | |||
attribute, whose content indicates the natural language for the | anywhere within a Category or Service Document unless it is | |||
element and its descendents. The language context is only | explicitly forbidden. Processors that encounter foreign markup MUST | |||
significant for elements and attributes declared to be "Language- | NOT stop processing or signal an error, and SHOULD preserve foreign | |||
Sensitive" by this specification. Requirements regarding the content | markup when transmitting such documents. | |||
and interpretation of xml:lang are specified in Section 2.12 of XML | ||||
1.0 [W3C.REC-xml-20040204]. | ||||
appCommonAttributes = | ||||
attribute xml:base { atomUri }?, | ||||
attribute xml:lang { atomLanguageTag }?, | ||||
undefinedAttribute* | ||||
6.4 RELAX NG Schema | 7. Category Documents | |||
Some sections of this specification are illustrated with fragments of | Category Documents contain lists of categories described using the | |||
a non-normative RELAX NG Compact schema [RNC]. A complete schema | "atom:category" element from the Atom Syndication Format [RFC4287]. | |||
appears in Appendix B. However, the text of this specification | Categories can also appear in Service Documents and describe the | |||
provides the definition of conformance. | categories allowed in a Collection (see Section 8.2.5). | |||
7. Introspection Documents | Category Documents are identified with the "application/atomcat+xml" | |||
media type (see Section 15). | ||||
7.1 Example | ||||
<?xml version="1.0" ?> | ||||
<app:categories | ||||
xmlns:app="http://purl.org/atom/app#" | ||||
xmlns="http://www.w3.org/2005/Atom" | ||||
fixed="yes" scheme="http://example.com/cats/big3"> | ||||
<category term="animal" /> | ||||
<category term="vegetable" /> | ||||
<category term="mineral" /> | ||||
</app:categories> | ||||
This Category Document contains three categories with the terms | ||||
"animal", "vegetable", and "mineral". None of the categories has a | ||||
label attribute (as defined in [RFC4287]). They all inherit the | ||||
"http://example.com/cats/big3" category 'scheme' (in the [RFC4287] | ||||
sense) declared on the app:categories element. Therefore if the | ||||
"mineral" category were to appear in an Atom Entry or Feed Document, | ||||
it would appear as: | ||||
<category scheme="http://example.com/cats/big3" term="mineral" /> | ||||
7.2 Element Definitions | ||||
7.2.1 The "app:categories" element | ||||
The root of a Category Document is the "app:categories" element. An | ||||
app:categories element MAY contain one or more "atom:category" | ||||
elements from the Atom namespace ("http://www.w3.org/2005/Atom"). | ||||
If an app:category child element has no "scheme" attribute it | ||||
inherits the attribute from its app:categories parent. An app: | ||||
category child element with an existing "scheme" attribute does not | ||||
inherit the "scheme" value of its "app:categories" parent element. | ||||
7.2.1.1 Attributes of "app:categories" | ||||
The app:categories element MAY contain a "fixed" attribute, with a | ||||
value of either "yes" or "no", indicating if the list of categories | ||||
is a fixed or an open set. Collections that indicate the set is | ||||
fixed MAY reject members whose categories are not listed in the | ||||
Collection Document. Collections that indicate the set is open | ||||
SHOULD NOT reject otherwise acceptable members whose categories are | ||||
not listed in the Collection. | ||||
Alternatively, the app:categories element MAY contain an "href" | ||||
attribute, whose value MUST be an IRI reference identifying a | ||||
Category Document. If the "href" attribute is provided, the app: | ||||
categories element MUST be empty and MUST NOT have the "fixed" or | ||||
"scheme" attributes. | ||||
atomCategory = | ||||
element atom:category { | ||||
atomCommonAttributes, | ||||
attribute term { text }, | ||||
attribute scheme { atomURI }?, | ||||
attribute label { text }?, | ||||
undefinedContent | ||||
} | ||||
appInlineCategories = | ||||
element app:categories { | ||||
attribute fixed { "yes" | "no" }?, | ||||
attribute scheme { atomURI }?, | ||||
(atomCategory*) | ||||
} | ||||
appOutOfLineCategories = | ||||
element app:categories { | ||||
attribute href { atomURI }, | ||||
(empty) | ||||
} | ||||
appCategories = appInlineCategories | appOutOfLineCategories | ||||
8. Service Documents | ||||
For authoring to commence, a client needs to first discover the | For authoring to commence, a client needs to first discover the | |||
capabilities and locations of the available collections. | capabilities and locations of the available collections. Service | |||
Introspection documents are designed to support this discovery | Documents are designed to support this discovery process. | |||
process. An Introspection Document describes workspaces, which are | ||||
server-defined groupings of collections. | ||||
Introspection documents are identified with the "application/ | A Service Document describes workspaces, which are server-defined | |||
atomserv+xml" media type (see Section 14). | groupings of Collections. Service Documents are identified with the | |||
"application/atomserv+xml" media type (see Section 15). | ||||
While an introspection document allows multiple workspaces, there is | There is no requirement that a server support multiple workspaces. | |||
no requirement that a server support multiple workspaces. In | In addition, a Collection MAY appear in more than one Workspace. | |||
addition, a collection MAY appear in more than one workspace. | ||||
7.1 Example | 8.1 Example | |||
<?xml version="1.0" encoding='utf-8'?> | <?xml version="1.0" encoding='utf-8'?> | |||
<service xmlns="http://purl.org/atom/app#"> | <service xmlns="http://purl.org/atom/app#" | |||
<workspace title="Main Site" > | xmlns:atom="http://www.w3.org/2005/Atom"> | |||
<workspace> | ||||
<atom:title>Main Site</atom:title> | ||||
<collection | <collection | |||
title="My Blog Entries" | href="http://example.org/reilly/main" > | |||
href="http://example.org/reilly/main" /> | <atom:title>My Blog Entries</atom:title> | |||
<categories | ||||
href="http://example.com/cats/forMain.cats" /> | ||||
</collection> | ||||
<collection | <collection | |||
title="Pictures" | ||||
href="http://example.org/reilly/pic" > | href="http://example.org/reilly/pic" > | |||
<atom:title>Pictures</atom:title> | ||||
<accept>image/*</accept> | <accept>image/*</accept> | |||
</collection> | </collection> | |||
</workspace> | </workspace> | |||
<workspace title="Side Bar Blog"> | <workspace> | |||
<collection title="Remaindered Links" | <atom:title>Side Bar Blog</atom:title> | |||
href="http://example.org/reilly/list" /> | <collection | |||
href="http://example.org/reilly/list" > | ||||
<atom:title>Remaindered Links</atom:title> | ||||
<accept>entry</accept> | ||||
<categories fixed="yes"> | ||||
<atom:category | ||||
scheme="http://example.org/extra-cats/" | ||||
term="joke" /> | ||||
<atom:category | ||||
scheme="http://example.org/extra-cats/" | ||||
term="serious" /> | ||||
</categories> | ||||
</collection> | ||||
</workspace> | </workspace> | |||
</service> | </service> | |||
This Introspection Document describes two workspaces. The first, | This Service Document describes two workspaces. The first Workspace | |||
called "Main Site", has two collections called "My Blog Entries" and | is called "Main Site", has two collections called "My Blog Entries" | |||
"Pictures" whose IRIs are "http://example.org/reilly/main" and | and "Pictures" whose IRIs are "http://example.org/reilly/main" and | |||
"http://example.org/reilly/pic" respectively. The "Pictures" | "http://example.org/reilly/pic" respectively. The "Pictures" | |||
includes an accept element indicating that client can post image | Workspace includes an "accept" element indicating that a client can | |||
files to the collection to create new entries. Entries with | post image files to the Collection to create new entries. Entries | |||
associated media resources are discussed in section 8.3. | with associated media resources are discussed in Section 9.5. | |||
The second workspace is called "Side Bar Blog" and has a single | The second Workspace is called "Side Bar Blog" and has a single | |||
collection called "Remaindered Links" whose collection IRI is | Collection called "Remaindered Links" whose IRI is | |||
"http://example.org/reilly/list". | "http://example.org/reilly/list". | |||
7.2 Element Definitions | Within each of the two entry collections, the categories element | |||
provides a list of available categories for member entries. In the | ||||
"My Blog Entries" Collection, the list of available categories is | ||||
obtainable through the "href" attribute. The "Side Bar Blog" | ||||
Collection provides a category list within the Service Document, but | ||||
states the list is fixed, signaling a request from the server that | ||||
entries be posted using only those two categories. | ||||
7.2.1 The "app:service" Element | 8.2 Element Definitions | |||
The root of an introspection document is the "app:service" element. | 8.2.1 The "app:service" Element | |||
The "app:service" element is the container for introspection | The root of a Service Document is the "app:service" element. | |||
information associated with one or more workspaces. An app:service | ||||
element MUST contain one or more app:workspace elements. | The "app:service" element is the container for service information | |||
associated with one or more workspaces. An app:service element MUST | ||||
contain one or more app:workspace elements. | ||||
namespace app = "http://purl.org/atom/app#" | namespace app = "http://purl.org/atom/app#" | |||
start = appService | start = appService | |||
appService = | appService = | |||
element app:service { | element app:service { | |||
appCommonAttributes, | appCommonAttributes, | |||
( appWorkspace+ | ( appWorkspace+ | |||
& extensionElement* ) | & extensionElement* ) | |||
} | } | |||
7.2.2 The "app:workspace" Element | 8.2.2 The "app:workspace" Element | |||
The "app:workspace" element contains information elements about the | The "app:workspace" element contains information elements about the | |||
collections of resources available for editing. The app:workspace | collections of resources available for editing. The app:workspace | |||
element MAY contain zero or more app:collection elements. | element contains zero or more app:collection elements. | |||
appWorkspace = | appWorkspace = | |||
element app:workspace { | element app:workspace { | |||
appCommonAttributes, | appCommonAttributes, | |||
attribute title { text }, | ( appCollection* | |||
( appCollection+ | ||||
& extensionElement* ) | & extensionElement* ) | |||
} | } | |||
atomTitle = element atom:title { atomTextConstruct } | ||||
In an app:workspace element, the first app:collection element MUST | In an app:workspace element, the first app:collection element MUST | |||
refer to the preferred or primary collection. In the following | refer to the preferred or primary Collection. In the following | |||
example, the "Entries" collection would be considered the preferred | example, the "Entries" collection would be considered the preferred | |||
collection: | Collection: | |||
<service xmlns="http://purl.org/atom/app#"> | <service xmlns="http://purl.org/atom/app#" | |||
<workspace title="My Blog"> | xmlns:atom="http://www.w3.org/2005/Atom"> | |||
<collection title="Entries" | <workspace> | |||
href="http://example.org/myblog/entries" /> | <atom:title>My Blog</atom:title> | |||
<collection title="Photos" | <collection | |||
href="http://example.org/myblog/entries" > | ||||
<atom:title>Entries</atom:title> | ||||
</collection> | ||||
<collection | ||||
href="http://example.org/myblog/fotes"> | href="http://example.org/myblog/fotes"> | |||
<atom:title>Photos</atom:title> | ||||
<accept>image/*</accept> | <accept>image/*</accept> | |||
</collection> | </collection> | |||
</workspace> | </workspace> | |||
</service> | </service> | |||
7.2.2.1 The "title" Attribute | 8.2.2.1 The "atom:title" Element | |||
The app:workspace element MUST contain a "title" attribute, which | The app:workspace element MUST contain one "atom:title" element, | |||
gives a human-readable name for the workspace. This attribute is | giving a human-readable title for the workspace. | |||
Language-Sensitive. | ||||
7.2.3 The "app:collection" Element | 8.2.3 The "app:collection" Element | |||
The "app:collection" describes an Atom Protocol collection. One | The "app:collection" element describes a Collection. The app: | |||
child element is defined here for app:collection: "app:accept". | collection element MAY contain one app:accept element and MAY contain | |||
any number of app:categories elements. The app:collection element | ||||
MUST NOT contain more that one app:accept element. | ||||
appCollection = | appCollection = | |||
element app:collection { | element app:collection { | |||
appCommonAttributes, | appCommonAttributes, | |||
attribute title { text }, | attribute href { atomURI }, | |||
attribute href { atomUri }, | ||||
( appAccept? | ( appAccept? | |||
& appCategories* | ||||
& extensionElement* ) | & extensionElement* ) | |||
} | } | |||
In an Atom feed, the app:collection element MAY appear as a child of | 8.2.3.1 Usage in Atom Feed Documents | |||
an atom:feed or atom:source element to identify the collection to | ||||
which new entries can be added to the feed. | ||||
7.2.3.1 The "title" Attribute | The app:collection element MAY appear as a child of an atom:feed or | |||
atom:source element in an Atom Feed Document. Its value identifies a | ||||
Collection by which new entries can be added to appear in the feed. | ||||
The app:collection element MUST contain a "title" attribute, whose | 8.2.3.2 The "href" Attribute | |||
value gives a human-readable name for the collection. This attribute | ||||
is Language-Sensitive. | ||||
7.2.3.2 The "href" Attribute | The app:collection element MUST contain an "href" attribute, whose | |||
value gives the IRI of the Collection. | ||||
The app:collection element MUST contain a "href" attribute, whose | 8.2.3.3 The "atom:title" Element | |||
value gives the IRI of the collection. | ||||
7.2.4 The "app:accept" Element | The app:collection Element MUST contain one "atom:title" element, | |||
giving a human-readable title for the Workspace. | ||||
The app:collection element MAY contain one "app:accept" element. The | 8.2.4 The "app:accept" Element | |||
app:accept element value specifies a comma-separated list of media- | ||||
ranges [RFC2616] identifying the types of representations that can be | The "app:accept" element value specifies a comma-separated list of | |||
POSTed to the Collection's URI. Whitespace separating the media- | media-ranges (see [RFC2616]) identifying the types of representations | |||
range values is considered insignificant and MUST be ignored. | that can be POSTed to the URI of a Collection. Whitespace separation | |||
of the media-range values is considered insignificant and MUST be | ||||
ignored. | ||||
The app:accept element is similar to the HTTP Accept request-header | The app:accept element is similar to the HTTP Accept request-header | |||
[RFC2616] with the exception that app:accept has no notion of | [RFC2616] with the exception that app:accept has no notion of | |||
preference. Accordingly, the value syntax of app:accept does not use | preference. As a result, the value syntax of app:accept does not use | |||
accept-params or "q" parameters as specified in [RFC2616], section | "accept-params" or "q" arguments as specified in [RFC2616], section | |||
14.1. The order of media-ranges is not significant. The following | 14.1. | |||
lists are all equivalent: | ||||
The order of media-ranges is not significant. The following lists | ||||
are all equivalent: | ||||
<app:accept>image/png, image/*</app:accept> | <app:accept>image/png, image/*</app:accept> | |||
<app:accept>image/*, image/png</app:accept> | <app:accept>image/*, image/png</app:accept> | |||
<app:accept>image/*</app:accept> | <app:accept>image/*</app:accept> | |||
A value of "entry" may appear in any list of media-ranges in an | ||||
A value of "entry" indicates that Atom Entry Documents can be posted | accept element and indicates that Atom Entry Documents can be posted | |||
to the Collection. If the accept element is omitted, or empty, | to the Collection. If the accept element is omitted or empty, | |||
clients SHOULD assume that only Atom Entry documents will be accepted | clients SHOULD assume that only Atom Entry documents will be accepted | |||
by the collection. | by the Collection. | |||
appAccept = | appAccept = | |||
element app:accept { | element app:accept { | |||
appCommonAttributes, | appCommonAttributes, | |||
( appTypeValue? ) | ( appTypeValue? ) | |||
} | } | |||
appTypeValue = ( "entry" | media-type |entry-or-media-type ) | appTypeValue = ( "entry" | media-type |entry-or-media-type ) | |||
media-type = xsd:string { pattern = "entry,(.+/.+,?)*" } | media-type = xsd:string { pattern = "entry,(.+/.+,?)*" } | |||
entry-or-media-type = xsd:string { pattern = "(.+/.+,?)*" } | entry-or-media-type = xsd:string { pattern = "(.+/.+,?)*" } | |||
8. Collections | 8.2.5 The "app:categories" Element | |||
8.1 Creating resources with POST | The "app:categories" element provides a listing of the categories | |||
that can be applied to the members of a Collection. | ||||
To add members to a collection, clients send POST requests to the | atomCategory = | |||
collection's URI. Collections MAY impose constraints on the media- | element atom:category { | |||
types of request entities POSTed to the collection and MAY generate a | atomCommonAttributes, | |||
attribute term { text }, | ||||
attribute scheme { atomURI }?, | ||||
attribute label { text }?, | ||||
undefinedContent | ||||
} | ||||
appInlineCategories = | ||||
element app:categories { | ||||
attribute fixed { "yes" | "no" }?, | ||||
attribute scheme { atomURI }?, | ||||
(atomCategory*) | ||||
} | ||||
appOutOfLineCategories = | ||||
element app:categories { | ||||
attribute href { atomURI }, | ||||
(empty) | ||||
} | ||||
appCategories = appInlineCategories | appOutOfLineCategories | ||||
The app:categories element MAY contain a "fixed" attribute, with a | ||||
value of either "yes" or "no", indicating whether or not the listing | ||||
of categories is considered to be a fixed, or closed set. The | ||||
absence of the "fixed" attribute is equivalent to the presence of a | ||||
"fixed" attribute with a value of "no". Collections that indicate a | ||||
fixed set MAY reject members that include categories not specified in | ||||
the provided listing. Collections that indicate an open set SHOULD | ||||
NOT reject otherwise acceptable members whose categories are not | ||||
present in the provided list. | ||||
The app:categories element MAY contain an "href" attribute, whose | ||||
value MUST be an IRI reference identifying a Category Document. If | ||||
the "href" attribute is provided, the app:categories element MUST be | ||||
empty and the "fixed" and "scheme" attributes MUST NOT be present. | ||||
9. Creating and Editing Resources | ||||
9.1 Member URIs | ||||
The Member URI supports retrieving, updating and deleting the | ||||
resource using HTTP GET, PUT and DELETE as described in this section. | ||||
Retrieval and updating of Member Entry Resources are done via Atom | ||||
Entry representations. | ||||
Member Entry URIs appear in two places. First, they are returned in | ||||
a Location header after successful resource creation using POST, as | ||||
described below. Second, in the entries of a Collection document, by | ||||
an atom:link element with a link relation of "edit". | ||||
Each Member Entry SHOULD contain such an atom:link element providing | ||||
its Member Entry URI. | ||||
9.2 Creating resources with POST | ||||
To add members to a Collection, clients send POST requests to the URI | ||||
of a Collection. Collections MAY impose constraints on the media- | ||||
types of request entities POSTed to the Collection and MAY generate a | ||||
response with a status code of 415 ("Unsupported Media Type"). | response with a status code of 415 ("Unsupported Media Type"). | |||
If an entry was created in the collection which received the POST, | If a Member Resource was created in the Collection which received the | |||
its URI MUST be returned in an HTTP Location header. | POST, its Member Entry URI MUST be returned in an HTTP Location | |||
header. | ||||
When the server generates a response with a status code of 201 | When the server generates a response with a status code of 201 | |||
("Created"), it SHOULD also return a response body, which, if | ("Created"), it SHOULD also return a response body, which if | |||
provided, MUST be an Atom Entry Document representing the newly- | provided, MUST be an Atom Entry Document representing the newly- | |||
created resource. Clients MUST NOT assume that an Atom Entry | created resource, and SHOULD include its Member Entry URI in an atom: | |||
returned is a full representation of the member resource. | link element that has a relation of "edit". | |||
Since the server is free to alter the posted entry, for example by | Since the server is free to alter the posted entry, for example by | |||
changing the content of the "id" element. returning the entry as | changing the content of the "id" element, returning the Entry as | |||
described in the previous paragraph can be useful to the client, | described in the previous paragraph can be useful to the client, | |||
enabling it to correlate the client and server views of the new | enabling it to correlate the client and server views of the new | |||
entry. | Entry. | |||
When the POST request contains an Atom Entry Document, the response | When the POST request contains an Atom Entry Document, the response | |||
from the server SHOULD contain a Content-Location header that | from the server SHOULD contain a Content-Location header that | |||
contains the same character-by-character value as the Location | contains the same character-by-character value as the Location | |||
header. | header. | |||
Clients MUST NOT assume that the URI provided by the Location header | The request body sent with the POST need not be an Atom Entry. For | |||
can be used to edit the created entry. | example, it might be a picture, or a movie. For a discussion of the | |||
issues in posting such content, see Section 9.5. | ||||
The request body of the POST need not be an Atom entry. For example, | ||||
it might be a picture, or a movie. For a discussion of the issues in | ||||
posting such content, see Section 8.4. | ||||
8.2 Example | 9.2.1 Example | |||
Below, the client sends a POST request containing an Atom Entry | Below, the client sends a POST request containing an Atom Entry | |||
representation to the URI of the Collection: | representation to the URI of the Collection: | |||
POST /myblog/entries HTTP/1.1 | POST /myblog/entries HTTP/1.1 | |||
Host: example.org | Host: example.org | |||
User- Agent: Thingio/1.0 | User- Agent: Thingio/1.0 | |||
Authorization: Basic ZGFmZnk6c2VjZXJldA== | ||||
Content- Type: application/atom+xml | Content- Type: application/atom+xml | |||
Content- Length: nnn | Content- Length: nnn | |||
Slug: First Post | ||||
<?xml version="1.0" ?> | <?xml version="1.0" ?> | |||
<entry xmlns="http://www.w3.org/2005/Atom"> | <entry xmlns="http://www.w3.org/2005/Atom" | |||
xmlns:app="http://purl.org/atom/app#"> | ||||
<title>Atom-Powered Robots Run Amok</title> | <title>Atom-Powered Robots Run Amok</title> | |||
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> | <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> | |||
<updated>2003-12-13T18:30:02Z</updated> | <updated>2003-12-13T18:30:02Z</updated> | |||
<author><name>John Doe</name></author> | <author><name>John Doe</name></author> | |||
<content>Some text.</content> | <content>Some text.</content> | |||
</entry> | </entry> | |||
The server signals a successful creation with a status code of 201. | The server signals a successful creation with a status code of 201. | |||
The response includes a "Location" header indicating the URI of the | The response includes a "Location" header indicating the Member Entry | |||
Atom Entry and a representation of that Entry in the body of the | URI of the Atom Entry and a representation of that Entry in the body | |||
response. | of the response. | |||
HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
Date: Fri, 7 Oct 2005 17:17:11 GMT | Date: Fri, 7 Oct 2005 17:17:11 GMT | |||
Content- Length: nnn | Content- Length: nnn | |||
Content- Type: application/atom+xml; charset="utf-8" | Content- Type: application/atom+xml; charset="utf-8" | |||
Content- Location: http://example.org/edit/first-post.atom | Content- Location: http://example.org/edit/first-post.atom | |||
Location: http://example.org/edit/first-post.atom | Location: http://example.org/edit/first-post.atom | |||
<?xml version="1.0"?> | <?xml version="1.0"?> | |||
<entry xmlns="http://www.w3.org/2005/Atom"> | <entry xmlns="http://www.w3.org/2005/Atom" | |||
xmlns:app="http://purl.org/atom/app#"> | ||||
<title>Atom-Powered Robots Run Amok</title> | <title>Atom-Powered Robots Run Amok</title> | |||
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> | <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> | |||
<updated>2003-12-13T18:30:02Z</updated> | <updated>2003-12-13T18:30:02Z</updated> | |||
<author><name>John Doe</name></author> | <author><name>John Doe</name></author> | |||
<content>Some text.</content> | <content>Some text.</content> | |||
<link rel="edit" | <link rel="edit" | |||
href="http://example.org/edit/first-post.atom"/> | href="http://example.org/edit/first-post.atom"/> | |||
</entry> | </entry> | |||
The Entry created and returned by the server might not match the | ||||
Note that the Entry created by the server might not match exactly the | Entry POSTed by the client. A server MAY change the values of | |||
Entry POSTed by the client. In particular, a server MAY change the | various elements in the Entry such as the atom:id, atom:updated and | |||
values of various elements in the Entry such as the atom:id, atom: | atom:author values and MAY choose to remove or add other elements and | |||
updated and atom:author values and MAY choose to remove or add other | attributes, or change element and attribute values. | |||
elements and attributes, or change element and attribute values. | ||||
In particular, the publishing system in this example filled in some | In particular, the publishing system in this example filled in some | |||
values not provided in the original POST. For example, presumably it | values not provided in the original POST. For example, it | |||
ascertained the author's name via the authentication protocol used to | ascertained the name of the author, presumably via the authentication | |||
establish the right to post. | protocol used to establish the right to post. | |||
8.3 The 'edit' Link | 9.3 Updating Resources with PUT | |||
Each member Entry within a collection SHOULD contain an atom:link | To update a resource, clients send PUT requests to its Member URI, as | |||
element with a link relation of "edit" that contains the IRI used to | specified in [RFC2616]. | |||
retrieve, update or delete the member Entry. | ||||
8.4 Media Resources and Media Link Entries | To avoid unintentional loss of data when editing Member Entries or | |||
Media Link Entries, Atom Protocol clients SHOULD preserve all | ||||
metadata that has not been intentionally modified, including unknown | ||||
foreign markup as defined in Section 6 of [RFC4287]. | ||||
As discussed above, if the body of a client's POST is an Atom Entry | 9.4 Deleting Resources with DELETE | |||
document, this constitutes a request that the server create a new | ||||
entry in the collection to which the POST is addressed and return its | ||||
URI. | ||||
If the body of the client's POST is of a media type other than | To delete a resource, clients send DELETE requests to its Member URI, | |||
application/atom+xml, this constitutes a request that the server | as specified in [RFC2616]. For Media Resources, deletion of a Media | |||
create a new resource as represented by the body of the post, called | Link Entry SHOULD result in the deletion of the associated Media | |||
a "media resource", and also an entry in the collection to which the | Resource. | |||
POST was addressed, called a "media link entry", and return both | ||||
URIs. If the server successfully creates a media resource and media | ||||
link entry pair, the Location header included in the response MUST be | ||||
that of the media link entry. The media link entry MUST have a | ||||
"content" element with a "src" attribute which links to the media | ||||
resource. | ||||
The intent is that the media link entry be used to store metadata | 9.5 Media Resources and Media Link Entries | |||
about the (perhaps non-textual) media resource, so that the media and | ||||
the metadata can be retrieved and updated separately. | ||||
A media link entry SHOULD contain an atom:link element with a link | A client can POST a media type other than application/atom+xml to a | |||
relation of "edit-media" that contains the IRI used to modify the | Collection. Such a request creates two new resources - one that | |||
media resource. Deletion of a media link entry SHOULD result in the | corresponds to the entity sent in the request, called the Media | |||
deletion of the linked media resource. | Resource, and an associated Member Entry, called the Media Link | |||
Entry. The server can signal the media types it will accept via the | ||||
"accept" element in the Service Document (Section 8.2.4). | ||||
Implementors will note that per the requirements of [RFC4287], media | The Media Link Entry contains the IRI of the Media Resource and makes | |||
link entries MUST contain an atom:summary element. Upon successful | metadata about it separately available for retrieval and update. The | |||
creation of a media link entry, a server MAY choose to populate the | Media Link Entry is used to store metadata about the (perhaps non- | |||
atom:summary element (as well as other required elements such as | textual) Media Resource. | |||
atom:id, atom:author and atom:title) with content derived from the | ||||
POSTed media resource or from any other source. A server might not | ||||
allow a client to modify the server selected values for these | ||||
elements. | ||||
Note that this specification covers the cases when the POST body is | Successful responses to creation requests MUST include the URI of the | |||
an Atom Entry, and when it is of a non-Atom media type. It does not | Media Link Entry in the Location header. The Media Link Entry SHOULD | |||
specify any request semantics or server behavior in the case where | contain an atom:link element with a link relation of "edit-media" | |||
the POST media-type is application/atom+xml but the body is something | that contains the Media Resource IRI. The Media Link Entry MUST have | |||
other than an Atom Entry. | an "atom:content" element with a non-empty "src" attribute. The | |||
value of the "src" attribute is an IRI of the newly created Media | ||||
Resource. It is OPTIONAL that the IRI of the "src" attribute on the | ||||
atom:content element be the same as the Media Resource IRI. That is, | ||||
the "src" attribute value might instead be a link into a static cache | ||||
or content distribution network and not be the Media Resource IRI. | ||||
8.4.1 Title: Header | Implementers are asked to note that according to the requirements of | |||
[RFC4287], entries, and thus Media Link Entries, MUST contain an | ||||
atom:summary element. Upon successful creation of a Media Link | ||||
Entry, a server MAY choose to populate the atom:summary element (as | ||||
well as other required elements such as atom:id, atom:author and | ||||
atom:title) with content derived from the POSTed entity or from any | ||||
other source. A server might not allow a client to modify the server | ||||
selected values for these elements. | ||||
A POST whose body is not of the Atom media type and which thus | For resource creation this specification only defines cases where the | |||
requests the creation of a media resource SHOULD contain a Title: | POST body has an Atom Entry entity declared as an Atom media type | |||
header indicating the client's suggested title for the resource. For | ("application/atom+xml"), or a non-Atom entity declared as a non-Atom | |||
example: | media type. It does not specify any request semantics or server | |||
behavior in the case where the POSTed media-type is "application/ | ||||
atom+xml" but the body is something other than an Atom Entry. In | ||||
particular, what happens on POSTing an Atom Feed Document to a | ||||
Collection using the "application/atom+xml" media type is undefined. | ||||
POST /myblog/fotes HTTP/1.1 | 9.6 The Slug: Header | |||
Host: example.org | ||||
Content- Type: image/png | ||||
Content- Length: nnnn | ||||
Title: An Atom-Powered Robot | ||||
...binary data... | Slug is a HTTP entity-header whose value is a "slug", i.e. a short | |||
name that can be used as part of URI for a Member Resource. | ||||
The server MAY use the content of the Title: header, as provided or | When posting an entity to a Collection to add a new Member, the | |||
in a modified form, in constructing a title for the resource, which | server MAY use this information when creating the Member URI of the | |||
would presumably appear in the media link entry. | newly-created resource, for instance by using some or all of the | |||
words in the last URI segment. It MAY also use it when creating the | ||||
atom:id or as the title of a Media Link Entry (see Section 9.5.). | ||||
Title = "Title" ":" [TEXT] | Servers MAY ignore the Slug entity-header and MAY alter its value | |||
before using it. For example, the server MAY filter out some | ||||
characters or replace accented letters with non-accented ones, spaces | ||||
with underscores, etc. | ||||
9.6.1 Slug: Header syntax | ||||
The syntax of this header MUST conform to the augmented BNF grammar | The syntax of this header MUST conform to the augmented BNF grammar | |||
in section 2.1 of the HTTP/1.1 specification [RFC2616]. The [TEXT] | in section 2.1 of the HTTP/1.1 specification [RFC2616]. The TEXT | |||
rule is described in section 2.2 of the same document. Words of | rule is described in section 2.2 of the same document. | |||
*TEXT MAY contain characters from character sets other than | ||||
[ISO88591] only when encoded according to the rules of [RFC2047]. | ||||
8.4.2 Example | Slug = "Slug" ":" *TEXT | |||
Clients MAY send non-ASCII characters in the Slug entity-header, | ||||
which they MUST encode using "encoded-words", as defined in | ||||
[RFC2047]. Servers SHOULD treat the slug as [RFC2047] encoded if it | ||||
matches the "encoded-words" production. | ||||
9.6.2 Examples | ||||
Below, the client sends a POST request containing a PNG image to the | Below, the client sends a POST request containing a PNG image to the | |||
URI of the Collection: | URI of the Collection: | |||
POST /myblog/entries HTTP/1.1 | POST /myblog/entries HTTP/1.1 | |||
Host: example.org | Host: example.org | |||
Content- Type: image/png | Content- Type: image/png | |||
Slug: The Beach | ||||
Authorization: Basic ZGFmZnk6c2VjZXJldA== | ||||
Content- Length: nnn | Content- Length: nnn | |||
Title: A picture of the beach | ||||
...binary data... | ...binary data... | |||
The server signals a successful creation with a status code of 201. | The server signals a successful creation with a status code of 201. | |||
The response includes a "Location" header indicating the URI of the | The response includes a Location header indicating the Member URI of | |||
media link entry and a representation of that entry in the body of | the Media Link Entry and a representation of that entry in the body | |||
the response. The media link entry includes a content element with a | of the response. The Media Link Entry includes a content element | |||
src attribute referencing the media resource, and a link using the | with a src attribute, and a link using the link relation "edit-media" | |||
link relation "edit-media" specifying the IRI to be used for | specifying the IRI to be used for modifying the Media Resource. | |||
modifying the media resource. | ||||
HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
Date: Fri, 7 Oct 2005 17:17:11 GMT | Date: Fri, 7 Oct 2005 17:17:11 GMT | |||
Content- Length: nnn | Content- Length: nnn | |||
Content- Type: application/atom+xml; charset="utf-8" | Content- Type: application/atom+xml; charset="utf-8" | |||
Content- Location: http://example.org/edit/first-post.atom | Content-Location: http://example.org/myblog/edit/the_beach | |||
Location: http://example.org/edit/first-post.atom | Location: http://example.org/myblog/edit/the_beach | |||
<?xml version="1.0"?> | <?xml version="1.0"?> | |||
<entry xmlns="http://www.w3.org/2005/Atom"> | <entry xmlns="http://www.w3.org/2005/Atom"> | |||
<title>A picture of the beach</title> | <title>The Beach</title> | |||
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> | <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> | |||
<updated>2003-12-13T18:30:02Z</updated> | <updated>2005-10-07T17:17:08Z</updated> | |||
<author><name>John Doe</name></author> | <author><name>Daffy</name></author> | |||
<summary type="text" /> | <summary type="text" /> | |||
<content type="image/png" | <content type="image/png" | |||
src="http://example.org/media/img123.png"/> | src="http://example.org/media/the_beach.png"/> | |||
<link rel="edit" | ||||
href="http://example.org/edit/first-post.atom" /> | ||||
<link rel="edit-media" | <link rel="edit-media" | |||
href="http://example.org/edit/img123.png" /> | href="http://example.org/media/edit/the_beach.png" /> | |||
<link rel="edit" | ||||
href="http://example.org/myblog/edit/the_beach /> | ||||
</entry> | </entry> | |||
Here is an example of the Slug: header that uses the encoding rules | ||||
of [RFC2047]. | ||||
8.5 Editing Entries with Foreign Markup | POST /myblog/entries HTTP/1.1 | |||
Host: example.org | ||||
Content-Type: image/png | ||||
Slug: =?iso-8859-1?q?The_Beach?= | ||||
Authorization: Basic ZGFmZnk6c2VjZXJldA== | ||||
Content-Length: nnn | ||||
To avoid unintentional loss of data when editing entries or media | ...binary data... | |||
link entries, Atom Protocol clients SHOULD preserve all metadata, | ||||
including unknown foreign markup as defined in Section 6 of | ||||
[RFC4287], which has not been intentionally modified. | ||||
9. Listing Collections | See Section 9.2.1 for an example of the Slug: header applied to the | |||
creation of a Member Entry Resource. | ||||
10. Listing Collections | ||||
Collection resources MUST provide representations in the form of Atom | Collection resources MUST provide representations in the form of Atom | |||
Feed documents whose entries represent the collection's members. | Feed documents whose entries represent the Members in the Collection. | |||
Each entry in the Feed Document SHOULD have an atom:link element with | Each entry in the Feed Document SHOULD have an atom:link element with | |||
a relation of "edit" (See Section 10.1). | a relation of "edit" (See Section 11.1). | |||
The entries in the returned Atom Feed MUST be ordered by their "atom: | The entries in the returned Atom Feed MUST be ordered by their "atom: | |||
updated" property, with the most recently updated entries coming | updated" property, with the most recently updated entries coming | |||
first in the document order. Clients SHOULD be constructed in | first in the document order. Clients SHOULD be constructed in | |||
consideration of the fact that changes which do not alter the entry's | consideration of the fact that changes which do not alter the atom: | |||
atom:updated value will not affect the position of the entry in a | updated value of an entry will not affect the position of the entry | |||
collection. | in a Collection. | |||
Clients MUST NOT assume that an Atom Entry returned in the Feed is a | Clients MUST NOT assume that an Atom Entry returned in the Feed is a | |||
full representation of a member resource and SHOULD perform a GET on | full representation of a Member Entry Resource and SHOULD perform a | |||
the member resource before editing. | GET on the URI of the Member Entry before editing. | |||
10.1 Collection Paging | ||||
Collections can contain large numbers of resources. A naive client | Collections can contain large numbers of resources. A naive client | |||
such as a web spider or web browser could be overwhelmed if the | such as a web spider or web browser could be overwhelmed if the | |||
response to a GET contained every entry in the collection, and the | response to a GET contained every entry in the Collection, and the | |||
server would waste large amounts of bandwidth and processing time on | server would waste large amounts of bandwidth and processing time on | |||
clients unable to handle the response. For this reason, servers MAY | clients unable to handle the response. For this reason, servers MAY | |||
return a partial listing containing the most recently updated member | return a partial listing of the most recently updated Member | |||
resources. Such partial feed documents MUST have an atom:link with a | Resources. Such partial feed documents MUST have an atom:link with a | |||
"next" relation whose "href" value is the URI of the next partial | "next" relation whose "href" value is the URI of the next partial | |||
listing of the collection (the least recently updated member | listing of the Collection (the next most recently updated Member | |||
resources) where it exists. This is called "collection paging". | Resources) where it exists. This is called "Collection paging". | |||
9.1 Collection Paging | ||||
The returned Atom feed MAY NOT contain entries for all the | The returned Atom Feed MAY NOT contain entries for all the Members in | |||
collection's members. Instead, the Atom feed document MAY contain | a Collection. Instead, the Atom Feed document MAY contain link | |||
link elements with "rel" attribute values of "next", "previous", | elements with "rel" attribute values of "next", "previous", "first" | |||
"first" and "last" that can be used to navigate through the complete | and "last" that can be used to navigate through the complete set of | |||
set of matching entries. | matching entries. | |||
For instance, suppose a client is supplied the URI | For instance, suppose a client is supplied the URI | |||
"http://example.org/entries/go" of a collection of member entries, | "http://example.org/entries/go" of a Collection of Member entries, | |||
where the server as a matter of policy avoids generating feed | where the server as a matter of policy avoids generating feed | |||
documents containing more than 10 entries. The Atom feed document | documents containing more than 10 entries. The Atom Feed document | |||
for the collection will then represent the first 'page' in a set of | for the Collection will then represent the first 'page' in a set of | |||
10 linked feed documents. The "first" relation will reference the | 10 linked feed documents. The "first" relation will reference the | |||
initial feed document in the set and the "last" relation references | initial feed document in the set and the "last" relation references | |||
the final feed document in the set. Within each document, the "next" | the final Atom Feed Document in the set. Within each document, the | |||
and "previous" link relations reference the preceding and subsequent | "next" and "previous" link relations reference the preceding and | |||
documents. | subsequent documents. | |||
<feed xmlns="http://www.w3.org/2005/Atom"> | <feed xmlns="http://www.w3.org/2005/Atom"> | |||
<link rel="first" | <link rel="first" | |||
href="http://example.org/entries/go" /> | href="http://example.org/entries/go" /> | |||
<link rel="next" | <link rel="next" | |||
href="http://example.org/entries/2" /> | href="http://example.org/entries/2" /> | |||
<link rel="last" | <link rel="last" | |||
href="http://example.org/entries/10" /> | href="http://example.org/entries/10" /> | |||
... | ... | |||
</feed> | </feed> | |||
skipping to change at page 24, line 5 | skipping to change at page 30, line 5 | |||
href="http://example.org/entries/go" /> | href="http://example.org/entries/go" /> | |||
<link rel="previous" | <link rel="previous" | |||
href="http://example.org/entries/go" /> | href="http://example.org/entries/go" /> | |||
<link rel="next" | <link rel="next" | |||
href="http://example.org/entries/3" /> | href="http://example.org/entries/3" /> | |||
<link rel="last" | <link rel="last" | |||
href="http://example.org/entries/10" /> | href="http://example.org/entries/10" /> | |||
... | ... | |||
</feed> | </feed> | |||
10. Atom Format Link Relation Extensions | 11. Atom Format Link Relation Extensions | |||
10.1 The "edit" Link Relation | 11.1 The "edit" Link Relation | |||
The Atom Protocol adds the value "edit" to the Atom Registry of Link | This specification adds the value "edit" to the Atom Registry of Link | |||
Relations (see section 7.1 of [RFC4287]). The value of "edit" | Relations (see section 7.1 of [RFC4287]). The value of "edit" | |||
specifies that the value of the href attribute is the IRI of an | specifies that the value of the href attribute is the IRI of an | |||
editable Atom Entry Document. When appearing within an atom:entry, | editable Member Entry. When appearing within an atom:entry, the href | |||
the href IRI MAY be used to update and delete the resource | IRI MAY be used to retrieve, update and delete the resource | |||
represented by that entry. An atom:entry MUST contain no more than | represented by that entry. An atom:entry MUST contain no more than | |||
one "edit" link relation. | one "edit" link relation. | |||
10.2 The "edit-media" Link Relation | 11.2 The "edit-media" Link Relation | |||
The Atom Protocol adds the value "edit-media" to the Atom Registry of | ||||
Link Relations (see section 7.1 of [RFC4287]). When appearing within | ||||
an atom:entry, the value of the href attribute is an IRI that MAY be | ||||
used to modify a media resource associated with that entry. | ||||
An atom:entry MAY contain zero or more "edit-media" link relations. | This specification adds the value "edit-media" to the Atom Registry | |||
An atom:entry MUST NOT contain more than one atom:link element with a | of Link Relations (see section 7.1 of [RFC4287]). When appearing | |||
rel attribute value of "edit-media" that has the same type and | within an atom:entry, the value of the href attribute is an IRI that | |||
hreflang attribute values. All "edit-media" link relations in the | MAY be used to modify a Media Resource associated with that entry. | |||
same entry reference the same resource. If a client encounters | ||||
multiple "edit-media" link relations in an entry then it SHOULD | ||||
choose a link based on the client preferences for type and hreflang. | ||||
If a client encounters multiple "edit-media" link relations in an | ||||
entry and has no preference based on the type and hreflang attributes | ||||
then the client SHOULD pick the first "edit-media" link relation in | ||||
document order. | ||||
11. Atom Publishing Control Extensions | An atom:entry element MAY contain zero or more "edit-media" link | |||
relations. An atom:entry MUST NOT contain more than one atom:link | ||||
element with a rel attribute value of "edit-media" that has the same | ||||
type and hreflang attribute values. All "edit-media" link relations | ||||
in the same entry reference the same resource. If a client | ||||
encounters multiple "edit-media" link relations in an entry then it | ||||
SHOULD choose a link based on the client preferences for type and | ||||
hreflang. If a client encounters multiple "edit-media" link | ||||
relations in an entry and has no preference based on the type and | ||||
hreflang attributes then the client SHOULD pick the first "edit- | ||||
media" link relation in document order. | ||||
11.1 The Atom Publishing Control Namespace | 12. Atom Publishing Controls | |||
This specification defines an Atom Format extension for publishing | This specification defines an Atom Format Structured Extension, as | |||
control called Atom Publishing Control. The namespace name for the | defined in Section 6 of [RFC4287], for publishing control within the | |||
Atom Publishing Control's XML vocabulary is | http://purl.org/atom/app# namespace. | |||
"http://example.net/appns/". This specification uses "pub:" for the | ||||
namespace prefix. The choice of namespace prefix is not semantically | ||||
significant. | ||||
11.2 The "pub:control" Element | 12.1 The "app:control" Element | |||
namespace pub = "http://example.net/appns/" | namespace app = "http://purl.org/atom/app#" | |||
pubControl = | pubControl = | |||
element pub:control { | element app:control { | |||
atomCommonAttributes, | atomCommonAttributes, | |||
pubDraft? | pubDraft? | |||
& extensionElement | & extensionElement | |||
} | } | |||
pubDraft = | pubDraft = | |||
element pub:draft { "yes" | "no" } | element app:draft { "yes" | "no" } | |||
The "pub:control" element MAY appear as a child of an "atom:entry" | The "app:control" element MAY appear as a child of an atom:entry | |||
which is being created or updated via the Atom Publishing Protocol. | which is being created or updated via the Atom Publishing Protocol. | |||
The "pub:control" element, if it does appear in an entry, MUST only | The app:control element MUST appear only once in an Entry. The app: | |||
appear at most one time. The "pub:control" element is considered | control element is considered foreign markup as defined in Section 6 | |||
foreign markup as defined in Section 6 of [RFC4287]. | of [RFC4287]. | |||
The "pub:control" element and its child elements MAY be included in | The app:control element and its child elements MAY be included in | |||
Atom Feed or Entry Documents. | Atom Feed or Entry Documents. | |||
The "pub:control" element MAY contain exactly one "pub:draft" element | The app:control element MAY contain exactly one "app:draft" element | |||
as defined here, and MAY contain zero or more extension elements as | as defined below, and MAY contain zero or more extension elements as | |||
outlined in Section 6 of [RFC4287]. Both clients and servers MUST | defined in Section 6 of [RFC4287]. | |||
ignore foreign markup present in the pub:control element. | ||||
11.2.1 The "pub:draft" Element | 12.1.1 The "app:draft" Element | |||
The number of "pub:draft" elements in "pub:control" MUST be zero or | The number of app:draft elements in app:control MUST be zero or one. | |||
one. Its value MUST be one of "yes" or "no". A value of "no" means | Its value MUST be one of "yes" or "no". A value of "no" indicates a | |||
that the entry MAY be made publicly visible. If the "pub:draft" | client request that the Member Resource be made publicly visible. If | |||
element is missing then the value MUST be understood to be "no". The | the app:draft element is missing then the value MUST be understood to | |||
inclusion of the pub:draft element represents a request by the client | be "no". The inclusion of the app:draft element represents a request | |||
to control the visibility of an entry and the pub:draft element MAY | by the client to control the visibility of a Member Resource and the | |||
be ignored by the server. | app:draft element MAY be ignored by the server. | |||
12. Securing the Atom Protocol | 13. Securing the Atom Protocol | |||
All instances of publishing Atom Format entries SHOULD be protected | All instances of publishing Atom Format entries SHOULD be protected | |||
by authentication to prevent posting or editing by unknown sources. | by authentication to prevent posting or editing by unknown sources. | |||
[[anchor22: note: this section is currently under discussion.]] | [[anchor23: note: this section is currently under discussion.]] | |||
13. Security Considerations | 14. Security Considerations | |||
The security of the Atom Protocol is based on [[anchor24: note: | The security of the Atom Protocol is based on [[anchor25: note: | |||
refers to incomplete section]]. | refers to incomplete section]]. | |||
[[anchor25: note: talk here about denial of service attacks using | [[anchor26: note: talk here about denial of service attacks using | |||
large XML files, or the billion laughs DTD attack.]] | large XML files, or the billion laughs DTD attack.]] | |||
14. IANA Considerations | 15. IANA Considerations | |||
An Atom Publishing Protocol Introspection Document, when serialized | 15.1 Content-type registration for 'application/atomserv+xml' | |||
as XML 1.0, can be identified with the following media type: | ||||
An Atom Publishing Protocol Service Document, when serialized as XML | ||||
1.0, can be identified with the following media type: | ||||
MIME media type name: application | MIME media type name: application | |||
MIME subtype name: atomserv+xml | MIME subtype name: atomserv+xml | |||
Mandatory parameters: None. | Mandatory parameters: None. | |||
Optional parameters: | Optional parameters: | |||
"charset": This parameter has identical semantics to the charset | "charset": This parameter has identical semantics to the charset | |||
parameter of the "application/xml" media type as specified in | parameter of the "application/xml" media type as specified in | |||
[RFC3023]. | [RFC3023]. | |||
Encoding considerations: Identical to those of "application/xml" as | Encoding considerations: Identical to those of "application/xml" as | |||
described in [RFC3023], section 3.2. | described in [RFC3023], section 3.2. | |||
Security considerations: As defined in this specification. | Security considerations: As defined in this specification. | |||
[[anchor26: update upon publication]] | [[anchor27: update upon publication]] | |||
In addition, as this media type uses the "+xml" convention, it | In addition, as this media type uses the "+xml" convention, it | |||
shares the same security considerations as described in [RFC3023], | shares the same security considerations as described in [RFC3023], | |||
section 10. | section 10. | |||
Interoperability considerations: There are no known interoperability | Interoperability considerations: There are no known interoperability | |||
issues. | issues. | |||
Published specification: This specification. [[anchor27: update upon | Published specification: This specification. [[anchor28: update upon | |||
publication]] | publication]] | |||
Applications that use this media type: No known applications | Applications that use this media type: No known applications | |||
currently use this media type. | currently use this media type. | |||
Additional information: | Additional information: | |||
Magic number(s): As specified for "application/xml" in [RFC3023], | Magic number(s): As specified for "application/xml" in [RFC3023], | |||
section 3.2. | section 3.2. | |||
skipping to change at page 29, line 14 | skipping to change at page 35, line 16 | |||
Base URI: As specified in [RFC3023], section 6. | Base URI: As specified in [RFC3023], section 6. | |||
Macintosh File Type code: TEXT | Macintosh File Type code: TEXT | |||
Person and email address to contact for further information: Joe | Person and email address to contact for further information: Joe | |||
Gregorio <joe@bitworking.org> | Gregorio <joe@bitworking.org> | |||
Intended usage: COMMON | Intended usage: COMMON | |||
Author/Change controller: This specification's author(s). [[anchor28: | Author/Change controller: This specification's author(s). [[anchor29: | |||
update upon publication]] | update upon publication]] | |||
15. References | 15.2 Content-type registration for 'application/atomcat+xml' | |||
15.1 Normative References | An Atom Publishing Protocol Category Document, when serialized as XML | |||
1.0, can be identified with the following media type: | ||||
[ISO88591] | MIME media type name: application | |||
ISO, "International Standard -- Information Processing -- | ||||
8-bit Single-Byte Coded Graphic Character Sets -- Part 1: | MIME subtype name: atomcat+xml | |||
Latin alphabet No. 1,", January 1987. | ||||
Mandatory parameters: None. | ||||
Optional parameters: | ||||
"charset": This parameter has identical semantics to the charset | ||||
parameter of the "application/xml" media type as specified in | ||||
[RFC3023]. | ||||
Encoding considerations: Identical to those of "application/xml" as | ||||
described in [RFC3023], section 3.2. | ||||
Security considerations: As defined in this specification. | ||||
[[anchor30: update upon publication]] | ||||
In addition, as this media type uses the "+xml" convention, it | ||||
shares the same security considerations as described in [RFC3023], | ||||
section 10. | ||||
Interoperability considerations: There are no known interoperability | ||||
issues. | ||||
Published specification: This specification. [[anchor31: update upon | ||||
publication]] | ||||
Applications that use this media type: No known applications | ||||
currently use this media type. | ||||
Additional information: | ||||
Magic number(s): As specified for "application/xml" in [RFC3023], | ||||
section 3.2. | ||||
File extension: .atomcat | ||||
Fragment identifiers: As specified for "application/xml" in | ||||
[RFC3023], section 5. | ||||
Base URI: As specified in [RFC3023], section 6. | ||||
Macintosh File Type code: TEXT | ||||
Person and email address to contact for further information: Joe | ||||
Gregorio <joe@bitworking.org> | ||||
Intended usage: COMMON | ||||
Author/Change controller: This specification's author(s). [[anchor32: | ||||
update upon publication]] | ||||
16. References | ||||
16.1 Normative References | ||||
[RFC2047] Moore, K., "MIME (Multipurpose Internet Mail Extensions) | [RFC2047] Moore, K., "MIME (Multipurpose Internet Mail Extensions) | |||
Part Three: Message Header Extensions for Non-ASCII Text", | Part Three: Message Header Extensions for Non-ASCII Text", | |||
RFC 2047, November 1996. | RFC 2047, November 1996. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | |||
Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | |||
skipping to change at page 31, line 7 | skipping to change at page 38, line 5 | |||
February 2004. | February 2004. | |||
[W3C.REC-xml-names-19990114] | [W3C.REC-xml-names-19990114] | |||
Hollander, D., Bray, T., and A. Layman, "Namespaces in | Hollander, D., Bray, T., and A. Layman, "Namespaces in | |||
XML", W3C REC REC-xml-names-19990114, January 1999. | XML", W3C REC REC-xml-names-19990114, January 1999. | |||
[W3C.REC-xmlbase-20010627] | [W3C.REC-xmlbase-20010627] | |||
Marsh, J., "XML Base", W3C REC W3C.REC-xmlbase-20010627, | Marsh, J., "XML Base", W3C REC W3C.REC-xmlbase-20010627, | |||
June 2001. | June 2001. | |||
15.2 Informative References | 16.2 Informative References | |||
[RNC] Clark, J., "RELAX NG Compact Syntax", December 2001. | [RNC] Clark, J., "RELAX NG Compact Syntax", December 2001. | |||
[W3C.REC-webarch-20041215] | [W3C.REC-webarch-20041215] | |||
Walsh, N. and I. Jacobs, "Architecture of the World Wide | Walsh, N. and I. Jacobs, "Architecture of the World Wide | |||
Web, Volume One", W3C REC REC-webarch-20041215, | Web, Volume One", W3C REC REC-webarch-20041215, | |||
December 2004. | December 2004. | |||
URIs | URIs | |||
[1] <http://www.imc.org/atom-protocol/index.html> | [1] <http://www.imc.org/atom-protocol/index.html> | |||
Authors' Addresses | Authors' Addresses | |||
Joe Gregorio (editor) | Joe Gregorio (editor) | |||
BitWorking, Inc | IBM | |||
1002 Heathwood Dairy Rd. | 4205 South Miama Blvd. | |||
Apex, NC 27502 | Research Triangle Park, NC 27709 | |||
US | US | |||
Phone: +1 919 272 3764 | Phone: +1 919 272 3764 | |||
Email: joe@bitworking.com | Email: joe@bitworking.org | |||
URI: http://bitworking.com/ | URI: http://ibm.com/ | |||
Bill de hOra (editor) | Bill de hOra (editor) | |||
Propylon Ltd. | Propylon Ltd. | |||
45 Blackbourne Square, Rathfarnham Gate | 45 Blackbourne Square, Rathfarnham Gate | |||
Dublin, Dublin D14 | Dublin, Dublin D14 | |||
IE | IE | |||
Phone: +353-1-4927444 | Phone: +353-1-4927444 | |||
Email: bill.dehora@propylon.com | Email: bill.dehora@propylon.com | |||
URI: http://www.propylon.com/ | URI: http://www.propylon.com/ | |||
skipping to change at page 34, line 15 | skipping to change at page 41, line 15 | |||
Appendix B. RELAX NG Compact Schema | Appendix B. RELAX NG Compact Schema | |||
This appendix is informative. | This appendix is informative. | |||
The Relax NG schema explicitly excludes elements in the Atom Protocol | The Relax NG schema explicitly excludes elements in the Atom Protocol | |||
namespace which are not defined in this revision of the | namespace which are not defined in this revision of the | |||
specification. Requirements for Atom Protocol processors | specification. Requirements for Atom Protocol processors | |||
encountering such markup are given in Section 6.2 and Section 6.3 of | encountering such markup are given in Section 6.2 and Section 6.3 of | |||
[RFC4287]. | [RFC4287]. | |||
The Schema for Service Documents: | ||||
# -*- rnc -*- | # -*- rnc -*- | |||
# RELAX NG Compact Syntax Grammar for the Atom Protocol | # RELAX NG Compact Syntax Grammar for the Atom Protocol | |||
namespace app = "http://purl.org/atom/app#" | namespace app = "http://purl.org/atom/app#" | |||
namespace atom = "http://www.w3.org/2005/Atom" | ||||
namespace xsd = "http://www.w3.org/2001/XMLSchema" | ||||
namespace xhtml = "http://www.w3.org/1999/xhtml" | ||||
namespace local = "" | namespace local = "" | |||
start = appService | start = appService | |||
# common:attrs | # common:attrs | |||
atomURI = text | ||||
appCommonAttributes = | appCommonAttributes = | |||
attribute xml:base { atomUri }?, | attribute xml:base { atomURI }?, | |||
attribute xml:lang { atomLanguageTag }?, | attribute xml:lang { atomLanguageTag }?, | |||
undefinedAttribute* | undefinedAttribute* | |||
atomCommonAttributes = appCommonAttributes | ||||
undefinedAttribute = | undefinedAttribute = | |||
attribute * - (xml:base | xml:lang | local:*) { text } | attribute * - (xml:base | xml:lang | local:*) { text } | |||
atomUri = text | ||||
atomLanguageTag = xsd:string { | atomLanguageTag = xsd:string { | |||
pattern = "[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*" | pattern = "[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*" | |||
} | } | |||
atomDateConstruct = | ||||
appCommonAttributes, | ||||
xsd:dateTime | ||||
# app:service | # app:service | |||
appService = | appService = | |||
element app:service { | element app:service { | |||
appCommonAttributes, | appCommonAttributes, | |||
( appWorkspace+ | ( appWorkspace+ | |||
& extensionElement* ) | & extensionElement* ) | |||
} | } | |||
# app:workspace | # app:workspace | |||
appWorkspace = | appWorkspace = | |||
element app:workspace { | element app:workspace { | |||
appCommonAttributes, | appCommonAttributes, | |||
attribute title { text }, | ( appCollection* | |||
( appCollection+ | ||||
& extensionElement* ) | & extensionElement* ) | |||
} | } | |||
atomTitle = element atom:title { atomTextConstruct } | ||||
# app:collection | # app:collection | |||
appCollection = | appCollection = | |||
element app:collection { | element app:collection { | |||
appCommonAttributes, | appCommonAttributes, | |||
attribute title { text }, | attribute href { atomURI }, | |||
attribute href { atomUri }, | ||||
( appAccept? | ( appAccept? | |||
& appCategories* | ||||
& extensionElement* ) | & extensionElement* ) | |||
} | } | |||
# app:member | # app:categories | |||
atomCategory = | ||||
element atom:category { | ||||
atomCommonAttributes, | ||||
attribute term { text }, | ||||
attribute scheme { atomURI }?, | ||||
attribute label { text }?, | ||||
undefinedContent | ||||
} | ||||
appInlineCategories = | ||||
element app:categories { | ||||
attribute fixed { "yes" | "no" }?, | ||||
attribute scheme { atomURI }?, | ||||
(atomCategory*) | ||||
} | ||||
appOutOfLineCategories = | ||||
element app:categories { | ||||
attribute href { atomURI }, | ||||
(empty) | ||||
} | ||||
appCategories = appInlineCategories | appOutOfLineCategories | ||||
# app:accept | ||||
appAccept = | appAccept = | |||
element app:accept { | element app:accept { | |||
appCommonAttributes, | appCommonAttributes, | |||
( appTypeValue? ) | ( appTypeValue? ) | |||
} | } | |||
appTypeValue = ( "entry" | media-type |entry-or-media-type ) | appTypeValue = ( "entry" | media-type |entry-or-media-type ) | |||
media-type = xsd:string { pattern = "entry,(.+/.+,?)*" } | media-type = xsd:string { pattern = "entry,(.+/.+,?)*" } | |||
entry-or-media-type = xsd:string { pattern = "(.+/.+,?)*" } | entry-or-media-type = xsd:string { pattern = "(.+/.+,?)*" } | |||
skipping to change at page 36, line 4 | skipping to change at page 43, line 45 | |||
structuredExtensionElement = | structuredExtensionElement = | |||
element * - app:* { | element * - app:* { | |||
(attribute * { text }+, | (attribute * { text }+, | |||
(text|anyElement)*) | (text|anyElement)*) | |||
| (attribute * { text }*, | | (attribute * { text }*, | |||
(text?, anyElement+, (text|anyElement)*)) | (text?, anyElement+, (text|anyElement)*)) | |||
} | } | |||
# Other Extensibility | # Other Extensibility | |||
extensionElement = | extensionElement = | |||
simpleExtensionElement | structuredExtensionElement | simpleExtensionElement | structuredExtensionElement | |||
undefinedContent = (text|anyForeignElement)* | ||||
# Extensions | # Extensions | |||
anyElement = | anyElement = | |||
element * { | element * { | |||
(attribute * { text } | (attribute * { text } | |||
| text | | text | |||
| anyElement)* | | anyElement)* | |||
} | } | |||
anyForeignElement = | ||||
element * - atom:* { | ||||
(attribute * { text } | ||||
| text | ||||
| anyElement)* | ||||
} | ||||
atomPlainTextConstruct = | ||||
atomCommonAttributes, | ||||
attribute type { "text" | "html" }?, | ||||
text | ||||
atomXHTMLTextConstruct = | ||||
atomCommonAttributes, | ||||
attribute type { "xhtml" }, | ||||
xhtmlDiv | ||||
atomTextConstruct = atomPlainTextConstruct | atomXHTMLTextConstruct | ||||
anyXHTML = element xhtml:* { | ||||
(attribute * { text } | ||||
| text | ||||
| anyXHTML)* | ||||
} | ||||
xhtmlDiv = element xhtml:div { | ||||
(attribute * { text } | ||||
| text | ||||
| anyXHTML)* | ||||
} | ||||
# EOF | ||||
The Schema for Category Documents: | ||||
# -*- rnc -*- | ||||
# RELAX NG Compact Syntax Grammar for the Atom Protocol | ||||
namespace app = "http://purl.org/atom/app#" | ||||
namespace atom = "http://www.w3.org/2005/Atom" | ||||
namespace xsd = "http://www.w3.org/2001/XMLSchema" | ||||
namespace local = "" | ||||
start = appCategories | ||||
# common:attrs | ||||
atomCommonAttributes = | ||||
attribute xml:base { atomUri }?, | ||||
attribute xml:lang { atomLanguageTag }?, | ||||
undefinedAttribute* | ||||
undefinedAttribute = | ||||
attribute * - (xml:base | xml:lang | local:*) { text } | ||||
atomUri = text | ||||
atomLanguageTag = xsd:string { | ||||
pattern = "[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*" | ||||
} | ||||
atomCategory = | ||||
element atom:category { | ||||
atomCommonAttributes, | ||||
attribute term { text }, | ||||
attribute scheme { atomUri }?, | ||||
attribute label { text }?, | ||||
undefinedContent | ||||
} | ||||
appInlineCategories = | ||||
element app:categories { | ||||
attribute fixed { "yes" | "no" }?, | ||||
attribute scheme { atomUri }?, | ||||
(atomCategory*) | ||||
} | ||||
appOutOfLineCategories = | ||||
element app:categories { | ||||
attribute href { atomURI }, | ||||
(empty) | ||||
} | ||||
appCategories = appInlineCategories | appOutOfLineCategories | ||||
# Extensibility | ||||
undefinedContent = (text|anyForeignElement)* | ||||
anyElement = | ||||
element * { | ||||
(attribute * { text } | ||||
| text | ||||
| anyElement)* | ||||
} | ||||
anyForeignElement = | ||||
element * - atom:* { | ||||
(attribute * { text } | ||||
| text | ||||
| anyElement)* | ||||
} | ||||
# EOF | # EOF | |||
Appendix C. Revision History | Appendix C. Revision History | |||
draft-ietf-atompub-protocol-10: PaceRemoveTitleHeader2, | ||||
PaceSlugHeader4, PaceOnlyMemberURI,PaceOneAppNamespaceOnly, | ||||
PaceAppCategories, PaceExtendIntrospection, | ||||
UseElementsForAppCollectionTitles3, renamed Introspection to Service, | ||||
lots of good editorials suggestions, updated media example with slug, | ||||
moved xml conventions to convention sections, renamed XMl related | ||||
Conventions to Atom Publishing Protocol Documents, added auth header | ||||
to examples, consolidated definition of all resource types into the | ||||
model section, added IANA reg info for application/atomcat+xml. | ||||
draft-ietf-atompub-protocol-09: PaceWorkspaceMayHaveCollections, | draft-ietf-atompub-protocol-09: PaceWorkspaceMayHaveCollections, | |||
PaceMediaEntries5, | PaceMediaEntries5, | |||
http://www.imc.org/atom-protocol/mail-archive/msg05322.html, and | http://www.imc.org/atom-protocol/mail-archive/msg05322.html, and | |||
http://www.imc.org/atom-protocol/mail-archive/msg05272.html | http://www.imc.org/atom-protocol/mail-archive/msg05272.html | |||
draft-ietf-atompub-protocol-08: added infoset ref; added wording re | draft-ietf-atompub-protocol-08: added infoset ref; added wording re | |||
IRI/URI; fixed URI/IRI ; next/previous fixed as per Atom | IRI/URI; fixed URI/IRI ; next/previous fixed as per Atom | |||
LinkRelations Attribute | LinkRelations Attribute | |||
(http://www.imc.org/atom-protocol/mail-archive/msg04095.html); | (http://www.imc.org/atom-protocol/mail-archive/msg04095.html); | |||
incorporated: PaceEditLinkMustToMay; PaceMissingDraftHasNoMeaning, | incorporated: PaceEditLinkMustToMay; PaceMissingDraftHasNoMeaning, | |||
End of changes. 199 change blocks. | ||||
479 lines changed or deleted | 939 lines changed or added | |||
This html diff was produced by rfcdiff 1.32. The latest version is available from http://www.levkowetz.com/ietf/tools/rfcdiff/ |