<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
    <!ENTITY rfc2119 SYSTEM '../public/rfc/bibxml/reference.RFC.2119.xml'>
    <!ENTITY rfc2616 SYSTEM '../public/rfc/bibxml/reference.RFC.2616.xml'>
    <!ENTITY rfc3023 SYSTEM '../public/rfc/bibxml/reference.RFC.3023.xml'>
    <!ENTITY xml     SYSTEM '../public/rfc/bibxml4/reference.W3C.REC-xml-20001006.xml'>
]>

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

<?rfc toc="yes" ?>
<?rfc symrefs="yes" ?>
<?rfc sortrefs="yes" ?>
<?rfc iprnotified="yes" ?>
<?rfc strict="yes" ?>
<?rfc compact="yes" ?>

<rfc category="info" ipr="full3667" docName="draft-ietf-atompub-impl-guide.00.txt">
    <front>
        <title>Atom Implementation Guide</title>
		<author initials="M." surname="Pilgrim" fullname="Mark Pilgrim">
			<organization>IBM</organization>
			<address>
<postal>
<street>4400 Silicon Drive</street>
<city>Durham</city>
<region>NC</region>
<code>27713</code>
<country>US</country>
</postal>
			</address>
		</author>
<date day="13" month="September" year="2004"/>
<abstract>
<t>This document provides advice to implementers of the Atom Syndication Format and the Atom API.</t>
</abstract>

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

</front>

<middle>
<section title="Introduction">
<t>Atom is an XML-based format intended to allow lists of information, known as "feeds", to be synchronised between publishers and consumers.  The primary use case that Atom addresses is for syndicating web content such as weblogs and news headlines to other web sites and directly to consumers.  The most popular way to publish Atom feeds is over Hypertext Transfer Protocol (HTTP) <xref target="RFC2616"/>.  However, nothing precludes it from being used for other purposes and types of content, or being sent over other protocols.</t>

<t>There are a number of subtleties to HTTP and XML that have historically been overlooked by implementers, both publishers and consumers.  Due to the repetitive polling model that most Atom-enabled consumers employ, small bugs in HTTP implementations can quickly waste large amounts of bandwidth and cause network congestion.  Due to the complexity of XML and its interaction with other standards, bugs in XML implementations can easily cause loss of interoperability.</t>

<t>This document contains separate sections for publishers and consumers, since it is assumed that few developers will be interested in both.  In many cases, the guidelines for publishers and consumers are symmetrical, because many best practices require cooperation from both sides.  If there are guidelines telling publishers how to support -- and advertise their support for -- a particular feature, there are also guidelines telling consumers how to recognize and take advantage of the feature.</t>
</section>

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

<section title="HTTP Considerations">

<section anchor="publisherlastmodified" title="Support Last-Modified dates">
<t>Some data changes all the time.  The feed of a popular news site might be updated every few minutes.  On the other hand, the feed of a monthly newsletter would only change once a month when a new edition is published.  Since the most popular design pattern of Atom feed consumers is to repeatedly poll the feed for changes, this could result in a lot of unnecessary bandwidth consumption by downloading the same data over and over again.</t>

<t>HTTP provides a solution to this problem.  When a web server receives a request for a feed, it can send the feed, and it can also send the date the feed was last modified, in the Last-Modified HTTP header.  When the same client requests the same feed a second time, it includes in its request the last-modified date that it received in the previous request, in the If-Modified-Since header.  If the feed hasn't changed since the previous request, the web server responds with a special HTTP status code, 304 ("Not Modified").</t>

<t>Why is this an improvement?  Because when the web server sends a 304 status code, it doesn't re-send the data.  All the client gets is the status code.  So clients don't need to download the same data over and over again if it hasn't changed.</t>

<t>Publishers SHOULD send a Last-Modified HTTP header every time they serve an Atom feed.  Many web servers do this by default for static files.  Programs that generate feeds dynamically will most likely need to add the header themselves.  The format of the Last-Modified header is given in Section 14.29 of <xref target="RFC2616"/>.</t>

<t>Publishers SHOULD check each request for the existence of the If-Modified-Since HTTP header, and follow the procedure outlined in Section 14.25 of <xref target="RFC2616"/> for sending the HTTP 304 "Not Modified" status code.  Again, many web servers do this by default for static files.  Programs that generate feeds dynamically will most likely need to check the If-Modified-Since header and do the date math themselves.</t>

<t>(Savvy readers may notice that when the feed does finally change, it will likely change very little.  For example, in a feed of 10 entries, one entry might be added at the top, one entry removed from the bottom, and the other nine entries are unchanged.  So there is still a fair amount of redundant data being downloaded whenever the feed changes, since it usually only changes a little bit at a time.  HTTP status code 304 will not help in this case; it only saves bandwidth when there have been no changes at all.  There is a way to save bandwidth by serving partial feeds to clients who support it; see <xref target="publisherrfc3229"/> for that.)</t>
</section>

<section title="Support ETags">
<t>[[ TODO ]]</t>
</section>

<section title="Support Compression">
<t>[[ TODO ]]</t>
</section>

<section title="Be Cache-Friendly">
<t>[[ TODO ]]</t>
</section>

<section anchor="publisherrfc3229" title="Support Partial Feeds">
<t>[[ TODO - RFC 3229 stuff ]]</t>
</section>

<section anchor="publishercontenttype" title="Indicate Content-Type">
<t>All resources served over HTTP are supposed to be served with a Content-Type header, which indicates the media type of the resource.  For example, HTML pages are served as "Content-Type: text/html", PNG images are served as "image/png", and so forth.</t>
<figure><preamble>The registered media type for Atom feeds is "application/atom+xml".  Publishers SHOULD serve all Atom feeds with this media type, by returning a Content-Type HTTP header that looks like this:</preamble>
<artwork>Content-Type: application/atom+xml</artwork>
</figure>
<t>[[TODO - application/xml]]</t>
<t>[[TODO - text/xml]]</t>
<t>[[TODO - cross-reference character encoding section w.r.t. text/xml]]</t>
<t>[[TODO - no media types other than the ones listed in RFC 3023, specifically MUST NOT use text/plain]]</t>
</section>

<section title="Indicate When Feeds Are Permanently Relocated">
<t>[[ TODO (note difference from temporary redirects) ]]</t>
</section>

<section anchor="publisher410" title="Indicate When Feeds Are Permanently Gone">
<t>In certain cases, a publisher may wish to indicate that an Atom feed is no longer available.  For example, a feed for a weblog that the author has ceased writing, or a feed that once offered news about a one-time event that is now over.</t>
<t>For whatever reason, if a feed used to exist, and it no longer exists at any URI, the publisher SHOULD return an HTTP status code 410 ("Gone") on all requests for the feed.</t>
</section>

</section>

<section title="XML Syntax Considerations">

<section title="Use XML 1.0">
<t>Atom feeds MUST use XML 1.0 <xref target="W3C.REC-xml-20001006"/>.  No other version of XML is supported.</t>
<figure><preamble>To declare your feed as XML 1.0, use this XML declaration as the first line of your feed:</preamble>
<artwork>&lt;?xml version="1.0"?&gt;</artwork>
</figure>
<t>Make sure there are no leading spaces or blank lines before the XML declaration.</t>

<figure><preamble>If you use a character encoding other than UTF-8, you SHOULD declare that in the XML declaration as well:</preamble>
<artwork>&lt;?xml version="1.0" encoding="iso-8859-15"?&gt;</artwork>
</figure>

<t>[[TODO - rework/move this section, not sure how to approach this without introducing character encoding too]]</t>
</section>

<section anchor="publishercharacterencoding" title="Indicate Character Encoding">
<t>[[ TODO intro about character encoding, two places to declare it, etc. ]]</t>
<t>[[ TODO SHOULD declare it in XML declaration ]]</t>
<t>The Content-Type HTTP header (see <xref target="publishercontenttype"/>) can contain an optional charset parameter which indicates the character encoding of the feed.  If present, the charset parameter always takes precedence over the character encoding declared in the XML declaration on the first line of the feed.  Therefore, it is important not to get it wrong.</t>
<t>[[TODO - example scenarios to illustrate when it is safe to declare character encoding in HTTP header -- basically, whenever the software that is outputting the HTTP header is aware of the actual encoding...]]</t>

</section>

<section title="Use A Supported Character Encoding">
<t>[[ TODO - UTF-8 or UTF-16 are the only encodings guaranteed to be supported ]]</t>
</section>

<section title="Maintain XML Well-Formedness">
<t>[[ TODO ]]</t>
</section>

<section title="Avoid Problematic Characters">
<t>There are a number of characters that are commonly produced by software running on Microsoft Windows, ranging from 0x80 through 0x9F in the Cp-1252 character encoding (also known as "Windows-1252").  These characters are used to denote common typographical symbols such as a curly apostrophe or a trademark symbol.  Unfortunately, few people are aware that these characters mean different things in different character encodings, and therefore may not display as intended.</t>
<t>For example, in the Cp-1252 character encoding, a curly apostrophe can be written as the byte 0x92, or as the character reference "&amp;#x92;" or "&amp;#146;".  If your Atom feed is specifically declared as "Cp-1252" or "Windows-1252", these will be displayed as a curly apostrophe.  However, if your feed is declared as "iso-8859-1", the byte 0x92 is an unprintable control character, and may be displayed as a box, a question mark, or nothing at all (depending on the display device).  And if your feed is declared as "utf-8", 0x92 does not map to anything at all, and its presence will make your feed ill-formed XML.</t>
<t>Replacing the byte 0x92 with the character reference "&amp;#x92;" or "&amp;#146;" does not solve this problem, since an XML parser will treat all three identically.  The problem is not whether you are using raw bytes or character references; the problem is that, unless you have explicitly declared your feed as "Cp-1252", you are using the wrong character to denote a curly apostrophe.</t>
<t>Atom feed publishers SHOULD replace the following problematic characters and character references with their Unicode equivalents, which display correctly in every character encoding:</t>
<t><list style="hanging">
<t hangText="EURO SIGN">
  Instead of 0x80 or "&amp;#x80;" or "&amp;#128;", use U+20AC or "&amp;#x20AC;"</t>
<t hangText="SINGLE LOW-9 QUOTATION MARK">
  Instead of 0x82 or "&amp;#x82;" or "&amp;#130;", use U+201A or "&amp;#x201A;"</t>
<t hangText="LATIN SMALL LETTER F WITH HOOK">
  Instead of 0x83 or "&amp;#x83;" or "&amp;#131;", use U+0192 or "&amp;#x192;"</t>
<t hangText="DOUBLE LOW-9 QUOTATION MARK">
  Instead of 0x84 or "&amp;#x84;" or "&amp;#132;", use U+201E or "&amp;#x201E;"</t>
<t hangText="HORIZONTAL ELLIPSIS">
  Instead of 0x85 or "&amp;#x85;" or "&amp;#133;", use U+2026 or "&amp;#x2026;"</t>
<t hangText="DAGGER">
  Instead of 0x86 or "&amp;#x86;" or "&amp;#134;", use U+2020 or "&amp;#x2020;"</t>
<t hangText="DOUBLE DAGGER">
  Instead of 0x87 or "&amp;#x87;" or "&amp;#135;", use U+2021 or "&amp;#x2021;"</t>
<t hangText="MODIFIER LETTER CIRCUMFLEX ACCENT">
  Instead of 0x88 or "&amp;#x88;" or "&amp;#136;", use U+02C6 or "&amp;#x2C6;"</t>
<t hangText="PER MILLE SIGN">
  Instead of 0x89 or "&amp;#x89;" or "&amp;#137;", use U+2030 or "&amp;#x2030;"</t>
<t hangText="LATIN CAPITAL LETTER S WITH CARON">
  Instead of 0x8A or "&amp;#x8A;" or "&amp;#138;", use U+0160 or "&amp;#x160;"</t>
<t hangText="SINGLE LEFT-POINTING ANGLE QUOTATION MARK">
  Instead of 0x8B or "&amp;#x8B;" or "&amp;#139;", use U+2039 or "&amp;#x2039;"</t>
<t hangText="LATIN CAPITAL LIGATURE OE">
  Instead of 0x8C or "&amp;#x8C;" or "&amp;#140;", use U+0152 or "&amp;#x152;"</t>
<t hangText="LATIN CAPITAL LETTER Z WITH CARON">
  Instead of 0x8E or "&amp;#x8E;" or "&amp;#142;", use U+017D or "&amp;#x17D;"</t>
<t hangText="LEFT SINGLE QUOTATION MARK">
  Instead of 0x91 or "&amp;#x91;" or "&amp;#145;", use U+2018 or "&amp;#x2018;"</t>
<t hangText="RIGHT SINGLE QUOTATION MARK">
  Instead of 0x92 or "&amp;#x92;" or "&amp;#146;", use U+2019 or "&amp;#x2019;"</t>
<t hangText="LEFT DOUBLE QUOTATION MARK">
  Instead of 0x93 or "&amp;#x93;" or "&amp;#147;", use U+201C or "&amp;#x201C;"</t>
<t hangText="RIGHT DOUBLE QUOTATION MARK">
  Instead of 0x94 or "&amp;#x94;" or "&amp;#148;", use U+201D or "&amp;#x201D;"</t>
<t hangText="BULLET">
  Instead of 0x95 or "&amp;#x95;" or "&amp;#149;", use U+2022 or "&amp;#x2022;"</t>
<t hangText="EN DASH">
  Instead of 0x96 or "&amp;#x96;" or "&amp;#150;", use U+2013 or "&amp;#x2013;"</t>
<t hangText="EM DASH">
  Instead of 0x97 or "&amp;#x97;" or "&amp;#151;", use U+2014 or "&amp;#x2014;"</t>
<t hangText="SMALL TILDE">
  Instead of 0x98 or "&amp;#x98;" or "&amp;#152;", use U+02DC or "&amp;#x2DC;"</t>
<t hangText="TRADE MARK SIGN">
  Instead of 0x99 or "&amp;#x99;" or "&amp;#153;", use U+2122 or "&amp;#x2122;"</t>
<t hangText="LATIN SMALL LETTER S WITH CARON">
  Instead of 0x9A or "&amp;#x9A;" or "&amp;#154;", use U+0161 or "&amp;#x161;"</t>
<t hangText="SINGLE RIGHT-POINTING ANGLE QUOTATION MARK">
  Instead of 0x9B or "&amp;#x9B;" or "&amp;#155;", use U+203A or "&amp;#x203A;"</t>
<t hangText="LATIN SMALL LIGATURE OE">
  Instead of 0x9C or "&amp;#x9C;" or "&amp;#156;", use U+0153 or "&amp;#x153;"</t>
<t hangText="LATIN SMALL LETTER Z WITH CARON">
  Instead of 0x9E or "&amp;#x9E;" or "&amp;#158;", use U+017E or "&amp;#x17E;"</t>
<t hangText="LATIN CAPITAL LETTER Y WITH DIAERESIS">
  Instead of 0x9F or "&amp;#x9F;" or "&amp;#159;", use U+0178 or "&amp;#x178;"</t>
</list></t>
</section>

<section title="Avoid External Entities">
<t>[[ TODO ]]</t>
</section>

<section title="Avoid System Entities">
<t>[[ TODO ]]</t>
</section>

</section>

<section title="Content Considerations">

<section title="Give Each Entry A Real Title Or Leave It Blank">
<t>[[ TODO ]]</t>
</section>

<section title="Avoid Markup In Titles">
<t>[[ TODO ]]</t>
</section>

<section title="Never Change Published IDs">
<t>[[ TODO ]]</t>
</section>

<section title="Never Duplicate IDs">
<t>[[ TODO ]]</t>
</section>

<section title="How To Construct A Unique ID">
<t>[[ TODO ]]</t>
</section>

<section title="Escape URIs Properly">
<t>[[ TODO ]]</t>
</section>

<section title="How To Specify An Icon For Your Feed">
<t>[[ TODO ]]</t>
</section>

<section title="How To Indicate The Language Of Your Feed">
<t>[[ TODO ]]</t>
</section>

<section title="How To Indicate That A Feed Is In Multiple Languages">
<t>[[ TODO ]]</t>
</section>

<section title="How To Combine Entries From Multiple Feeds">
<t>[[ TODO ]]</t>
</section>

<section title="How To Link To The Permanent Link Of An Entry">
<t>[[ TODO ]]</t>
</section>

<section title="How To Link To Related Articles">
<t>[[ TODO ]]</t>
</section>

<section title="How To Link To Your Feed From An HTML Page">
<t>[[ TODO ]]</t>
</section>

<section title="How To Link To Sources">
<t>[[ TODO ]]</t>
</section>

<section title="How To Link To Alternate Formats">
<t>[[ TODO ]]</t>
</section>

<section title="How To Link To Translations">
<t>[[ TODO ]]</t>
</section>

<section title="How To Link To External Files">
<t>[[ TODO ]]</t>
</section>

<section title="How To Associate Entries Into Categories">
<t>[[ TODO ]]</t>
</section>

<section title="How To Include HTML Content In An Entry">
<t>[[ TODO ]]</t>
</section>

<section title="How To Include XHTML Content In An Entry">
<t>[[ TODO ]]</t>
</section>

<section title="How To Update A Previously-Published Entry">
<t>[[ TODO ]]</t>
</section>

<section title="How To Create a &quot;Photoblog&quot; Feed">
<t>[[ TODO ]]</t>
</section>

<section title="How To Create a &quot;Linkblog&quot; Feed">
<t>[[ TODO ]]</t>
</section>

<section title="How To Create A &quot;Recent Comments&quot; Feed">
<t>[[ TODO ]]</t>
</section>

<section title="How To Link To A Parent Entry Within A Comment Feed">
<t>[[ TODO ]]</t>
</section>

<section title="How To Link To Your Comment Feed From Your Main Feed">
<t>[[ TODO ]]</t>
</section>

</section>

<section title="Stuff That Doesn't Fit Anywhere Else">

<section title="Ping Notification Services">
<t>[[ TODO ]]</t>
</section>

<section title="Something About Transporting Atom Over Jabber">
<t>[[ TODO ]]</t>
</section>

<section title="Something About Integration With The Atom API">
<t>[[ TODO ]]</t>
</section>

<section title="Something About Online Feed Validation Services">
<t>[[ TODO ]]</t>
</section>

</section>

</section> <!-- publishers -->

<section title="Recommendations for Atom feed consumers">

<section title="HTTP Considerations">

<section title="Send a User-Agent">
<t>The User-Agent HTTP header, defined in Section 14.43 of <xref target="RFC2616"/>, is a simple way for a client to identify itself to a server when requesting resources.  Every time an Atom client requests a feed, the client should identify itself as specifically as possible.  This allows the server administrator to get in touch with the client-side developer if anything is going fantastically wrong.</t>
<t>It is also possible that a user on a shared web server could start publishing an Atom feed without the server administrator's knowledge.  When the administrator looks at their web server access logs, they will see repeated requests for a single resource.  If the administrator is unfamiliar with the concept of Atom feeds, this client activity may seem unusual or suspicious.  Therefore, clients should include in their User-Agent string a URL of a page that explains the product.  This can be the product's home page, or a separate page speifically designed to explain the product to wary server administrators.</t>

<figure><preamble>The User-Agent string SHOULD contain the product application name, the version number, and a URL to the product home page or other explanatory page.  For example:</preamble>
<artwork>MyAtomClient/1.3 +http://www.example.com/myatomclient/</artwork>
</figure>

<t>Clients MAY include other information in the User-Agent string, such as the operating system the client is running on.  This can be helpful in troubleshooting problems, especially if the same product runs on multiple operating systems.</t>
</section>

<section title="Don't Send a Referer">
<t>[[ TODO ]]</t>
</section>

<section title="Support Gzip Compression">
<t>[[ TODO ]]</t>
</section>

<section title="Support If-None-Match">
<t>[[ TODO ]]</t>
</section>

<section title="Support If-Modified-Since">
<t>[[ TODO ]]</t>
</section>

<section title="Respect Cache Headers">
<t>[[ TODO ]]</t>
</section>

<section title="Support Partial Feeds">
<t>[[ TODO - RFC 3229 stuff ]]</t>
</section>

<section title="Follow Redirects">
<t>[[ TODO ]]</t>
</section>

<section anchor="consumer410" title="Stop Polling Feeds Marked Gone">
<t>As noted in <xref target="publisher410"/>, Atom feeds can disappear forever for a variety of reasons.  Publishers indicate this permanent condition by returning an HTTP status code 410 ("Gone").</t>
<t>If a client requests an Atom feed and receives an HTTP status code 410, the client SHOULD NOT request the feed ever again.  If the client interacts with an end user, it MAY inform the end user that the feed is gone.  The client MAY retain any cached data it retrieved prior to the feed being marked gone.</t>
</section>

</section>

<section title="XML Syntax Considerations">

<section title="Determine Character Encoding Properly">
<t><xref target="RFC3023"/> defines the interaction between XML and HTTP as it relates to character encoding. XML and HTTP have different ways of specifying character encoding and different defaults in case no encoding is specified, and determining which value takes precedence depends on a variety of factors.</t>

<figure><preamble>In XML, the character encoding is optional and may be given in the XML declaration in the first line of the document, like this:</preamble>
<artwork>&lt;xml version="1.0" encoding="iso-8859-1"?&gt;</artwork>
</figure>

<t>If no encoding is given, XML supports the use of a Byte Order Mark to identify the document as some flavor of UTF-32, UTF-16, or UTF-8. Section F of <xref target="W3C.REC-xml-20001006"/> outlines the process for determining the character encoding based on unique properties of the Byte Order Mark in the first two to four bytes of the document.</t>

<t>If no encoding is specified and no Byte Order Mark is present, XML defaults to UTF-8.</t>

<figure><preamble>HTTP uses MIME to define a method of specifying the character encoding, as part of the Content-Type HTTP header, which looks like this:</preamble>
<artwork>Content-Type: text/html; charset="utf-8"</artwork>
</figure>

<t>If no charset is specified, HTTP defaults to iso-8859-1, but only for text/* media types. For other media types, the default encoding is undefined, which is where RFC 3023 comes in.</t>

<t>According to RFC 3023, if the media type given in the Content-Type HTTP header is "application/xml", "application/xml-dtd", "application/xml-external-parsed-entity", or any one of the subtypes of application/xml such as "application/atom+xml", then the encoding is</t>

<t><list style="numbers">
<t>the encoding given in the charset parameter of the Content-Type HTTP header, or</t>
<t>the encoding given in the encoding attribute of the XML declaration within the document, or</t>
<t>utf-8</t>
</list>
</t>

<t>On the other hand, if the media type given in the Content-Type HTTP header is "text/xml", "text/xml-external-parsed-entity", or a subtype like "text/AnythingAtAll+xml", then the encoding attribute of the XML declaration within the document is ignored completely, and the encoding is</t>

<t><list style="numbers">
<t>the encoding given in the charset parameter of the Content-Type HTTP header, or</t>
<t>us-ascii</t>
</list>
</t>

<t>Clients MUST use the procedure described in RFC 3023 to correctly determine the character encoding of an Atom feed.</t>
</section>

</section>

<section title="Content Considerations">

<section title="Support Relative Links">
<t>[[ TODO ]]</t>
</section>

<section title="Sanitize Potentially Dangerous Markup">
<t>[[ TODO ]]</t>
</section>

</section>

<section title="Stuff That Doesn't Fit Anywhere Else">

<section title="Support Atom Autodiscovery">
<t>[[ TODO ]]</t>
</section>

</section>

</section> <!-- consumers -->

<section title="Recommendations for Atom API providers">
<t>[[ TODO ]]</t>
</section>

<section title="Recommendations for Atom API clients">
<t>[[ TODO ]]</t>
</section>

<section title="IANA Considerations">
<t>This document relies on the registration of the Atom media type, which is defined in <xref target="ATOM-FMT"/>.</t>
</section> <!-- IANA considerations -->

<section title="Security Considerations">
<t>[[ TODO ]]</t>
</section> <!-- security considerations -->

</middle>

<back>

<references title="Normative References">&rfc2119; &rfc2616; &xml; &rfc3023;

<reference anchor='ATOM-FMT'>

<front>
<title>The Atom Syndication Format</title>
<author initials='M.' surname='Nottingham' fullname='Mark Nottingham'>
<organization/>
<address>
<email>mnot@pobox.com</email></address></author>
<date month='September' year='2004' />
<abstract>
<t>This specification describes Atom, an XML-based Web content and metadata syndication format.</t>
</abstract>
</front>

<seriesInfo name='draft-ietf-atompub-format,' value='work in progress' /> <!-- hack -->
</reference>

<reference anchor='ATOM-DISC'>

<front>
<title>Atom Feed Autodiscovery</title>
<author initials='M.' surname='Pilgrim' fullname='Mark Pilgrim'>
<organization/>
<address>
<email>pilgrim@gmail.com</email></address></author>
<date month='August' year='2004' />
<abstract>
<t>This document specifies a machine-readable method of linking to an Atom feed from a HyperText Markup Language (HTML) or Extensible HyperText Markup Language (XHTML) document.</t>
</abstract>
</front>

<seriesInfo name='draft-ietf-atompub-autodiscovery,' value='work in progress' /> <!-- hack -->
</reference>

</references>

<!--<references title="Informative References"></references>-->

<section title="Contributors">
<t>The following people contributed to this specification's content: [[TODO]]</t>
</section> <!-- contributors -->

<section title="Revision History">
<t><list style="hanging">
<t hangText="2003-09-17: ">
<list>
<t>Outline</t>
</list>
</t>
</list>
</t>
</section> <!-- revision history -->

</back>

</rfc>

<!--
Publishers
  * HTTP
    * support ETags
      * include ETag header in response
      * check for If-None-Match header in request
      * RFC 2616, section 10.3.5
      * RFC 2616, section 14.19
      * RFC 2616, section 14.25
    * support Last-Modified
      * include Last-Modified head in response
      * check for If-Modified-Since header in request
      * RFC 2616, section 10.3.5
      * RFC 2616, section 14.29
      * RFC 2616, section 14.25
    * appropriate Content-Type
      * use application/atom+xml
      * 2nd choice: application/xml
      * 3rd choice: text/xml + charset parameter
      * strongly discourage using text/xml without a charset parameter
      * MUST NOT use any non-XML media type
      * RFC 3023
    * TODO (much more)
  * XML
    * use UTF-8 or UTF-16
    * ensure that your output is well-formed at all times
      * charset considerations
      * inline content
      * undeclared entities
      * if at all possible, use a real XML serializer
      * otherwise, at least run the output through an XML parser as a sanity check
        * does not help with RFC 3023 issues
    * SHOULD NOT use &#128; through &#159;
        * specific to win-1252 encoding
	* use Unicode entities instead
        * table on http://intertwingly.net/stories/2004/04/14/i18n.html


Clients
  * HTTP
    * set User-Agent
      * RFC 2616, section 14.43
    * don't set Referer
      * RFC 2616, section 14.36
    * support gzip compression
      * send Accept-encoding: gzip,deflate
      * check Content-encoding header on response
      * RFC 1951 (deflate)
      * RFC 1952 (gzip)
    * support If-Modified-Since
      * set to ETag header from previous request
      * RFC 2616, section 14.25
    * support If-None-Match
      * set to Last-Modified header from previous request
      * RFC 2616, section 14.26
    * support cache headers
      * TODO
    * support redirection codes
      * 300
      * 301
      * 302
      * 303
      * 307
    * support "not found" error codes
      * 404
      * 410
  * XML
     *
-->
