The Ape says:

APP Service doc: http://0.0.0.0:1234/

Summary: 0 errors, 10 warnings.

  1. TESTING: Service document and collections.

  2. Retrieval of Service Document: it exists and is served properly. [Dialog]

  3. Found these collections:

  4. Will use collection 'My AtomPub Collection 0' for entry creation.

  5. Page 1 of Entry collection: it exists and is served properly. [Dialog]

  6. Entry collection has correct app:edited value order.

  7. TESTING: Entry-posting basics.

  8. Now in the Entries feed:

  9. Posting of new entry to the Entries collection reported success, Location: http://0.0.0.0:1234/my_collection_0/38173b72e05e76dbcd598b06e8459e6d [Dialog]

  10. Examining the new entry as returned in the POST response

  11. Returned entry is consistent with posted entry.

  12. Provided categories included in Returned entry.

  13. Server preserved foreign markup in Returned entry.

  14. Retrieval of newly created entry: it exists and is served properly. [Dialog]

  15. Examining the new entry as retrieved using Location header in POST response:

  16. ? Client-provided slug 'ape-20124' not used in server-generated URI.

  17. ? 'summary' has type='html' in entry as posted, type='text' in Retrieved entry.

  18. ? 'content' has type='xhtml' in entry as posted, type='text' in Retrieved entry.

  19. ? Provided category not in Retrieved entry: <atom:category term='simians' scheme='http://tbray.org/cat-test' xmlns:atom='http://www.w3.org/2005/Atom'/>

  20. ? Server discarded foreign markup in Retrieved entry.

  21. Examining the new entry as it appears in the collection feed:

  22. ? 'summary' has type='html' in entry as posted, type='text' in Entry from collection feed.

  23. ? 'content' has type='xhtml' in entry as posted, type='text' in Entry from collection feed.

  24. ? Provided category not in Entry from collection feed: <atom:category term='simians' scheme='http://tbray.org/cat-test' xmlns:atom='http://www.w3.org/2005/Atom'/>

  25. ? Server discarded foreign markup in Entry from collection feed.

  26. Update of new entry reported success. [Dialog]

  27. Title of new entry successfully updated.

  28. Entry deletion reported success. [Dialog]

  29. Entry not found in feed after deletion.

  30. TESTING: Collection re-ordering after PUT.

  31. Page 1 of Entries with multi-post: it exists and is served properly. [Dialog]

  32. Entries with multi-post has correct app:edited value order.

  33. Entries correctly ordered after multi-post.

  34. Page 1 of Entries post-update: it exists and is served properly. [Dialog]

  35. Entries post-update has correct app:edited value order.

  36. Entry deletion reported success.

  37. Entry deletion reported success.

  38. Entry deletion reported success.

  39. Entries correctly ordered after update of multi-post.

  40. TESTING: Content sanitization

  41. Retrieval of unclean XHTML entry: it exists and is served properly. [Dialog]

  42. Entry deletion reported success.

  43. Published entry appears to be sanitized.

  44. ? No collection for 'image/jpeg', won't test media posting.

Recorded client/server dialogs

Page 1 of Entries post-update

To server:
GET /my_collection_0 HTTP/1.1\r
Accept: */*\r
Host: 0.0.0.0:1234\r
\r
From Server:
HTTP/1.1 200 OK\r
Connection: close\r
Date: Thu, 30 Oct 2008 04:01:51 GMT\r
Content-Type: application/atom+xml\r
Content-Length: 1839\r
\r
<feed xml:base='http://0.0.0.0:1234/my_collection_0' xmlns='http://www.w3.org/2005/Atom'><title type='text'>My AtomPub Collection 0</title><entry><id>http://0.0.0.0:1234/my_collection_0/ab5d084ee590fe778ce1b6255cf4b81c</id><title type='text'>Entry Mini-4</title><content type='text'>Content of Mini-4</content><published>2008-10-30T05:01:47+01:00</published><updated>2008-10-30T05:01:51+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-10-30T05:01:51+01:00</app:edited><link href='http://0.0.0.0:1234/my_collection_0/ab5d084ee590fe778ce1b6255cf4b81c' rel='edit'/></entry><entry><id>http://0.0.0.0:1234/my_collection_0/79e8150b08aec56c7fe3644287a0c648</id><title type='text'>Entry Mini Three</title><content type='text'>Content of Mini Three</content><published>2008-10-30T05:01:49+01:00</published><updated>2008-10-30T05:01:49+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-10-30T05:01:49+01:00</app:edited><link href='http://0.0.0.0:1234/my_collection_0/79e8150b08aec56c7fe3644287a0c648' rel='edit'/></entry><entry><id>http://0.0.0.0:1234/my_collection_0/a93b87f5177e332afba381475abad764</id><title type='text'>Entry Mini One</title><content type='text'>Content of Mini One</content><published>2008-10-30T05:01:45+01:00</published><updated>2008-10-30T05:01:45+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-10-30T05:01:45+01:00</app:edited><link href='http://0.0.0.0:1234/my_collection_0/a93b87f5177e332afba381475abad764' rel='edit'/></entry><entry><title type='text'>Sample Entry 0</title><content type='text'>Content of the entry number 0.</content><updated>2008-01-01T00:00:00+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-01-01T00:00:00+01:00</app:edited><link href='http://0.0.0.0:1234/my_collection_0/entry_0' rel='edit'/></entry></feed>

In-place update with put

To server:
PUT /my_collection_0/38173b72e05e76dbcd598b06e8459e6d HTTP/1.1\r
Accept: */*\r
Content-Type: application/atom+xml;type=entry\r
Content-Length: 822\r
Host: 0.0.0.0:1234\r
\r
<?xml version="1.0" ?>
<entry xmlns="http://www.w3.org/2005/Atom">
<id>http://0.0.0.0:1234/my_collection_0/38173b72e05e76dbcd598b06e8459e6d</id>
<title>Let\342\200\231s all do the Ape!</title>
<author><name>The Atom Protocol Exerciser</name></author>
<updated>2008-10-30T05:01:43+01:00</updated>
<link href='http://www.tbray.org/ape'/>
<summary type='html'>Summary from the &lt;b>&amp;lt;&amp;nbsp;APE&amp;nbsp;>&lt;/b> at 2008-10-30T05:01:43+01:00</summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>A test post from the &lt;APE&gt; at \#{updated}</p>
<p>If you see this in an entry, it's probably a left-over from an
unsuccessful Ape run; feel free to delete it.</p>
</div>
</content>
<dc:subject xmlns:dc='http://purl.org/dc/elements/1.1/'>Simians</dc:subject>
</entry>
From Server:
HTTP/1.1 200 OK\r
Connection: close\r
Date: Thu, 30 Oct 2008 04:01:43 GMT\r
Location: http://0.0.0.0:1234/my_collection_0/38173b72e05e76dbcd598b06e8459e6d\r
Content-Type: application/atom+xml;type=entry\r
Content-Length: 991\r
\r
<entry xmlns='http://www.w3.org/2005/Atom'><id>http://0.0.0.0:1234/my_collection_0/38173b72e05e76dbcd598b06e8459e6d</id><title type='text'>Let\342\200\231s all do the Ape!</title><summary type='html'>Summary from the &lt;b&gt;&amp;lt;&amp;nbsp;APE&amp;nbsp;&gt;&lt;/b&gt; at 2008-10-30T05:01:43+01:00</summary><content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>A test post from the &lt;APE&gt; at \#{updated}</p>
<p>If you see this in an entry, it's probably a left-over from an
unsuccessful Ape run; feel free to delete it.</p>
</div></content><updated>2008-10-30T05:01:43+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-10-30T05:01:43+01:00</app:edited><author><name>The Atom Protocol Exerciser</name></author><link href='http://www.tbray.org/ape' rel='alternate'/><link href='http://0.0.0.0:1234/my_collection_0/38173b72e05e76dbcd598b06e8459e6d' rel='edit'/><dc:subject xmlns:dc='http://purl.org/dc/elements/1.1/'>Simians</dc:subject></entry>

Posting new entry

To server:
POST /my_collection_0 HTTP/1.1\r
Slug: ape-20124\r
Accept: */*\r
Content-Type: application/atom+xml;type=entry\r
Content-Length: 915\r
Host: 0.0.0.0:1234\r
\r
<?xml version='1.0' ?>
<entry xmlns='http://www.w3.org/2005/Atom'>
<id>tag:tbray.org,2005:73678781421751768713544278734</id>
<title>From the &lt;APE&gt; (\343\202\265\343\203\253)</title>
<author><name>The Atom Protocol Exerciser</name></author>
<updated>2008-10-30T05:01:43+01:00</updated>
<link href='http://www.tbray.org/ape'/>
<summary type='html'>Summary from the &lt;b>&amp;lt;&amp;nbsp;APE&amp;nbsp;>&lt;/b> at 2008-10-30T05:01:43+01:00</summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>A test post from the &lt;APE&gt; at \#{updated}</p>
<p>If you see this in an entry, it's probably a left-over from an
unsuccessful Ape run; feel free to delete it.</p>
</div>
</content>
<dc:subject xmlns:dc='http://purl.org/dc/elements/1.1/'>Simians</dc:subject>
<atom:category term='simians' scheme='http://tbray.org/cat-test' xmlns:atom='http://www.w3.org/2005/Atom'/></entry>
From Server:
HTTP/1.1 201 Created\r
Connection: close\r
Date: Thu, 30 Oct 2008 04:01:43 GMT\r
Location: http://0.0.0.0:1234/my_collection_0/38173b72e05e76dbcd598b06e8459e6d\r
Content-Type: application/atom+xml;type=entry\r
Content-Length: 1127\r
\r
<entry xmlns='http://www.w3.org/2005/Atom'><id>tag:tbray.org,2005:73678781421751768713544278734</id><title type='text'>From the &lt;APE&gt; (\343\202\265\343\203\253)</title><summary type='html'>Summary from the &lt;b&gt;&amp;lt;&amp;nbsp;APE&amp;nbsp;&gt;&lt;/b&gt; at 2008-10-30T05:01:43+01:00</summary><content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>A test post from the &lt;APE&gt; at \#{updated}</p>
<p>If you see this in an entry, it's probably a left-over from an
unsuccessful Ape run; feel free to delete it.</p>
</div></content><published>2008-10-30T05:01:43+01:00</published><updated>2008-10-30T05:01:43+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-10-30T05:01:43+01:00</app:edited><author><name>The Atom Protocol Exerciser</name></author><category term='simians' scheme='http://tbray.org/cat-test' xmlns:atom='http://www.w3.org/2005/Atom'/><link href='http://www.tbray.org/ape' rel='alternate'/><link href='http://0.0.0.0:1234/my_collection_0/38173b72e05e76dbcd598b06e8459e6d' rel='edit'/><dc:subject xmlns:dc='http://purl.org/dc/elements/1.1/'>Simians</dc:subject></entry>

Page 1 of Entries with multi-post

To server:
GET /my_collection_0 HTTP/1.1\r
Accept: */*\r
Host: 0.0.0.0:1234\r
\r
From Server:
HTTP/1.1 200 OK\r
Connection: close\r
Date: Thu, 30 Oct 2008 04:01:49 GMT\r
Content-Type: application/atom+xml\r
Content-Length: 1843\r
\r
<feed xml:base='http://0.0.0.0:1234/my_collection_0' xmlns='http://www.w3.org/2005/Atom'><title type='text'>My AtomPub Collection 0</title><entry><id>http://0.0.0.0:1234/my_collection_0/79e8150b08aec56c7fe3644287a0c648</id><title type='text'>Entry Mini Three</title><content type='text'>Content of Mini Three</content><published>2008-10-30T05:01:49+01:00</published><updated>2008-10-30T05:01:49+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-10-30T05:01:49+01:00</app:edited><link href='http://0.0.0.0:1234/my_collection_0/79e8150b08aec56c7fe3644287a0c648' rel='edit'/></entry><entry><id>http://0.0.0.0:1234/my_collection_0/ab5d084ee590fe778ce1b6255cf4b81c</id><title type='text'>Entry Mini Two</title><content type='text'>Content of Mini Two</content><published>2008-10-30T05:01:47+01:00</published><updated>2008-10-30T05:01:47+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-10-30T05:01:47+01:00</app:edited><link href='http://0.0.0.0:1234/my_collection_0/ab5d084ee590fe778ce1b6255cf4b81c' rel='edit'/></entry><entry><id>http://0.0.0.0:1234/my_collection_0/a93b87f5177e332afba381475abad764</id><title type='text'>Entry Mini One</title><content type='text'>Content of Mini One</content><published>2008-10-30T05:01:45+01:00</published><updated>2008-10-30T05:01:45+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-10-30T05:01:45+01:00</app:edited><link href='http://0.0.0.0:1234/my_collection_0/a93b87f5177e332afba381475abad764' rel='edit'/></entry><entry><title type='text'>Sample Entry 0</title><content type='text'>Content of the entry number 0.</content><updated>2008-01-01T00:00:00+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-01-01T00:00:00+01:00</app:edited><link href='http://0.0.0.0:1234/my_collection_0/entry_0' rel='edit'/></entry></feed>

Page 1 of Entry collection

To server:
GET /my_collection_0 HTTP/1.1\r
Accept: */*\r
Host: 0.0.0.0:1234\r
\r
From Server:
HTTP/1.1 200 OK\r
Connection: close\r
Date: Thu, 30 Oct 2008 04:01:42 GMT\r
Content-Type: application/atom+xml\r
Content-Length: 465\r
\r
<feed xml:base='http://0.0.0.0:1234/my_collection_0' xmlns='http://www.w3.org/2005/Atom'><title type='text'>My AtomPub Collection 0</title><entry><title type='text'>Sample Entry 0</title><content type='text'>Content of the entry number 0.</content><updated>2008-01-01T00:00:00+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-01-01T00:00:00+01:00</app:edited><link href='http://0.0.0.0:1234/my_collection_0/entry_0' rel='edit'/></entry></feed>

Retrieval of Service Document

To server:
GET / HTTP/1.1\r
Accept: */*\r
Host: 0.0.0.0:1234\r
\r
From Server:
HTTP/1.1 200 OK\r
Connection: close\r
Date: Thu, 30 Oct 2008 04:01:42 GMT\r
Content-Type: application/atomsvc+xml\r
Content-Length: 728\r
\r
<service xmlns='http://www.w3.org/2007/app'><workspace><collection href='http://0.0.0.0:1234/my_collection_0'><accept>application/atom+xml;type=entry</accept><atom:title type='text' xmlns:atom='http://www.w3.org/2005/Atom'>My AtomPub Collection 0</atom:title></collection><collection href='http://0.0.0.0:1234/my_collection_1'><accept>application/atom+xml;type=entry</accept><atom:title type='text' xmlns:atom='http://www.w3.org/2005/Atom'>My AtomPub Collection 1</atom:title></collection><collection href='http://0.0.0.0:1234/my_collection_2'><accept>application/atom+xml;type=entry</accept><atom:title type='text' xmlns:atom='http://www.w3.org/2005/Atom'>My AtomPub Collection 2</atom:title></collection></workspace></service>

Retrieval of unclean XHTML entry

To server:
GET /my_collection_0/6adc36f839a1733afbac5113a9d24731 HTTP/1.1\r
Accept: */*\r
Host: 0.0.0.0:1234\r
\r
From Server:
HTTP/1.1 200 OK\r
Connection: close\r
Date: Thu, 30 Oct 2008 04:01:52 GMT\r
Content-Type: application/atom+xml;type=entry\r
Content-Length: 993\r
\r
<entry xmlns='http://www.w3.org/2005/Atom'><id>http://0.0.0.0:1234/my_collection_0/6adc36f839a1733afbac5113a9d24731</id><title type='text'>Unclean!</title><summary type='text'>
&lt;p&gt;hey&lt;/p&gt;
&lt;script src=&apos;http://www.example.com/xxx&apos;/&gt;
&lt;script&gt;alert(&apos;XXX&apos;)&lt;/script&gt;
&lt;p background=&apos;javascript:alert(&amp;apos;XSS&amp;apos;)&apos; id=&apos;x1&apos;&gt;Hey&lt;/p&gt;
</summary><content type='text'>
&lt;p id=&apos;x2&apos; style=&apos;...whatever...&apos;&gt;OK&lt;/p&gt;&lt;object&gt;No No No&lt;/object&gt;
&lt;a href=&apos;/no-problemo&apos;&gt;aah&lt;/a&gt;&lt;a href=&apos;javascript:evil&apos;&gt;ouch&lt;/a&gt;
</content><published>2008-10-30T05:01:52+01:00</published><updated>2008-10-30T05:01:52+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-10-30T05:01:52+01:00</app:edited><link href='http://0.0.0.0:1234/my_collection_0/6adc36f839a1733afbac5113a9d24731' rel='edit'/></entry>

New Entry deletion

To server:
DELETE /my_collection_0/38173b72e05e76dbcd598b06e8459e6d HTTP/1.1\r
Accept: */*\r
Host: 0.0.0.0:1234\r
\r
From Server:
HTTP/1.1 200 OK\r
Connection: close\r
Date: Thu, 30 Oct 2008 04:01:43 GMT\r
Content-Type: text/html\r
Content-Length: 0\r
\r

Retrieval of newly created entry

To server:
GET /my_collection_0/38173b72e05e76dbcd598b06e8459e6d HTTP/1.1\r
Accept: */*\r
Host: 0.0.0.0:1234\r
\r
From Server:
HTTP/1.1 200 OK\r
Connection: close\r
Date: Thu, 30 Oct 2008 04:01:43 GMT\r
Content-Type: application/atom+xml;type=entry\r
Content-Length: 900\r
\r
<entry xmlns='http://www.w3.org/2005/Atom'><id>http://0.0.0.0:1234/my_collection_0/38173b72e05e76dbcd598b06e8459e6d</id><title type='text'>From the &lt;APE&gt; (\343\202\265\343\203\253)</title><summary type='text'>Summary from the &lt;b&gt;&amp;lt;&amp;nbsp;APE&amp;nbsp;&gt;&lt;/b&gt; at 2008-10-30T05:01:43+01:00</summary><content type='text'>
&lt;p&gt;A test post from the &amp;lt;APE&amp;gt; at \#{updated}&lt;/p&gt;
&lt;p&gt;If you see this in an entry, it&apos;s probably a left-over from an
unsuccessful Ape run; feel free to delete it.&lt;/p&gt;
</content><published>2008-10-30T05:01:43+01:00</published><updated>2008-10-30T05:01:43+01:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-10-30T05:01:43+01:00</app:edited><link href='http://www.tbray.org/ape' rel='alternate'/><link href='http://0.0.0.0:1234/my_collection_0/38173b72e05e76dbcd598b06e8459e6d' rel='edit'/></entry>