<?xml version="1.0" encoding="UTF-8"?>
<metanorma xmlns="https://www.metanorma.org/ns/standoc" type="semantic" version="3.7.5" schema-version="v2.1.5" flavor="ietf">
<bibdata type="standard">
<title language="en" type="abbrev">DAV-Push</title>

<title language="en" type="main">Push Discovery and Notification Dispatch Protocol</title>
<uri>http://dmfs.org</uri><docidentifier primary="true">draft-gajda-dav-push-00</docidentifier><docnumber>draft-gajda-dav-push-00</docnumber><contributor><role type="author"/><person>
<name><completename>Marten Gajda</completename></name>
<email>marten@dmfs.org</email></person></contributor><contributor><role type="publisher"/><organization>
<name>Internet Engineering Task Force</name>
<abbreviation>IETF</abbreviation></organization></contributor><version><revision-date>2017-04-17</revision-date></version><language>en</language><script>Latn</script><abstract><p>This specification defines a framework and protocols for a push notification system that allows clients, application servers and push notification servers to interact with each other in a standardized manner.</p>
</abstract><status><stage>standard</stage></status><copyright><from>2026</from><owner><organization>
<name>Internet Engineering Task Force</name>
<abbreviation>IETF</abbreviation></organization></owner></copyright><series type="stream">
<title>IETF</title>
</series><series type="intended">
<title>full-standard</title>
</series><keyword>push</keyword><keyword>CardDAV</keyword><keyword>CalDAV</keyword><keyword>WebDAV</keyword><ext><doctype>internet-draft</doctype><flavor>ietf</flavor><area>Applications</area><ipr>trust200902</ipr><pi><tocinclude>yes</tocinclude></pi></ext></bibdata><metanorma-extension><semantic-metadata><stage-published>false</stage-published></semantic-metadata>
<presentation-metadata><toc-heading-levels>2</toc-heading-levels><html-toc-heading-levels>2</html-toc-heading-levels><doc-toc-heading-levels>2</doc-toc-heading-levels><pdf-toc-heading-levels>2</pdf-toc-heading-levels></presentation-metadata></metanorma-extension>
<preface><abstract id="_6e87b87b-9794-b4eb-6eb2-91e1a3a9432b"><title id="_37c298bf-5619-a5c6-817b-d777b5ead0b1">Abstract</title><p id="_449f2e7f-06aa-7e52-d9d9-4f8353232fbf">This specification defines a framework and protocols for a push notification system that allows clients, application servers and push notification servers to interact with each other in a standardized manner.</p>
</abstract><introduction id="_c49fdc37-f59e-30ed-ee21-47205b383119" obligation="informative">
<title id="_2b2e98d1-114a-3da4-8556-01ae0a724280">Introduction</title>
<p id="_619832ca-4568-1d4b-8151-4066c196b5e2">In a client/server protocol clients can typically create update delete "resources" (data) on the server as well as retrieve data on the server.</p>

<p id="_ba6e143c-d1b7-af9c-f8a7-2348d2fe93a1">In many cases data can appear on the server as the result of some other client or server-side process interacting with the server. Thus clients need a way to detect when the data on the server has changed.</p>

<p id="_7088f7df-1f78-2f87-a4ab-cd219f3c77a6">Most protocols provide a data synchronization mechanism to support that but typically clients need to "poll" the server to find out when changes have occurred. Network based polling is inefficient and instead push notifications are preferred as a way of alerting clients to new data or changes to existing data on the server.</p>
</introduction></preface><sections>

<clause id="_f17764eb-fd71-60bd-3236-bfca1ba2176d" inline-header="false" obligation="normative">
<title id="_e01b0d2a-257a-7f15-1364-2693c6d68958">Conventions Used in This Document</title>
<p id="_18a87aae-5d35-3000-37e3-9f0429aa09e3">The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in  <eref type="inline" bibitemid="RFC2119" citeas="RFC 2119"/>.</p>

<p id="_11bf9ac9-a076-171a-a675-dead2414f0ae">When XML element types in the namespaces "DAV:" and "urn:ietf:params:xml:ns:dav-push" are referenced in this document outside of the context of an XML fragment, the string "DAV:" and "DAV-PUSH:" will be prefixed to the element type names respectively.</p>
</clause>

<clause id="_d92b59a8-6df2-7200-c10b-0eac75d03e2c" inline-header="false" obligation="normative">
<title id="_e0c73677-c14f-cd04-ca59-49073b88cd1d">Terminology</title>
<dl id="_905309a5-10b0-e3f3-5ec6-99d1e63997a6"><dt>Application Server:</dt>
<dd id="_4a864652-74aa-b569-94cd-78f01d870932"><p id="_14361a82-e551-c0cb-2830-0184e24c6216">Provides resources a client application might want to monitor for changes. Typical applications are email calendars and address books.</p>
</dd>
<dt>Push Gateway:</dt>
<dd id="_a578351a-a03a-b224-02d3-e53f688d1a95"><p id="_b1ea47ea-b8b7-e4e1-9cde-5e07cd244f63">A service to provide a common standardized interface to Push Delivery Services. A Push Gateway provides or relays one or multiple delivery channels the so called Transports.</p>
</dd>
<dt>Push Delivery Service:</dt>
<dd id="_dbc5d87a-f54f-5c65-2e1d-4a97f431c4ff"><p id="_3d127aa3-10a2-1147-4f64-97eba0f2eb2a">A Service which provides the actual push transport mechanism to the client application.</p>
</dd>
<dt>Transport:</dt>
<dd id="_96fd93b1-23eb-60a6-5c85-b8cdbb051645"><p id="_bf1728cf-06c2-abbd-3913-a068908550da">A Transport is a logical channel to a specific Push Delivery Service provided by a Push Gateway. It is identified by the transport-uri.</p>
</dd>
<dt>Client Application:</dt>
<dd id="_a83eb279-2c62-2aa0-51f6-1ac86687200a"><p id="_b73d30b9-8d51-2ce7-db6c-c7b95c5b2442">An application that uses the services of the Application Server and wants to get notified instantaneously about certain changes on the server. A client application typically runs on a mobile or desktop device.</p>
</dd>
<dt>Push Notification:</dt>
<dd id="_09be3014-55d6-3a36-6b45-be5f231e6eb8"><p id="_301e8139-28aa-090e-0c5c-50b1ea0d6a50">A message sent from the Application server to the Client Application to notify the client of an update. The basic information carried by the notification is "there was a change" for a specific Topic.</p>
</dd>
<dt>Topic:</dt>
<dd id="_55f8ea3c-1f22-6ed6-67d4-456b48f779b7"><p id="_17105e49-e628-9272-938d-5c677da735e1">A Topic is a name for a notification feed or channel. Each watchable resource has a Topic that clients can subscribe to. Each subscriber to a particular topic will receive a notification when a substantial change was made to any of the resources with that Topic.</p>
</dd>
</dl>
</clause>

<clause id="_cf8155ed-b271-d9b4-96db-25d846eefeef" inline-header="false" obligation="normative">
<title id="_0036881f-4573-f68b-667e-38c3209ddec9">Architecture</title>
<p id="_300a44a6-59e0-7501-7bfa-b31528987c4c">This document introduces an entity called "Push Gateway" which acts as a proxy between an application server and a push delivery service. A Push Gateway provides at least one Transport. Each Transport is identified by a URI and connects to exactly one Push Delivery Service.</p>

<p id="_6d17a422-f952-e972-ad77-9db21dfbf3f2">Push Gateways MAY support relaying so a push gateway might forward all or some notifications to another push gateway.</p>

<sourcecode id="_7c5794ca-e15f-9704-9ea8-5e34af91a40f" lang="ascii-art"><body>+----------------------------+
|     Application Server     |
+-----------------------+----+
       ^                |
       |                |
       |                |
       |                |
       |                v
       |      +-------------------------+
       |      |       Push Gateway      |
       |      +---------+---------------+
       |                |
       |                |
       |                |
       |                v
       |      +-------------------------+
       |      |  Push delivery Service  |
       |      +---------+---------------+
       |                |
       |                |
       |                |
       |                |
       |                v
 +-----+--------------------+
 |     Client Application   |
 +--------------------------+</body></sourcecode>


<clause id="_124e1ca1-e4b0-8e98-3f4f-116017bf3b30" inline-header="false" obligation="normative">
<title id="_dbf8a31f-773c-45b6-61b4-2e8fed3fd78a">Application Server</title>
<p id="_8bff187f-84aa-4506-c4c1-619020ea7f67">The server is responsible for generating push topics and sending update notifications to the Push Gateway. A push topic is a unique token that identifies the update notification feed of a resource or a group of resources. The topic is forwarded to the Push Gateway whenever a relevant change in one of these resources occurs.</p>

<p id="_659f9850-67aa-bf67-cf8c-e2f92e837f3c">This document doesn't specify how topics are generated. However for privacy reasons the topic MUST NOT contain user names user data (like folder/collection names) or URLs in plain text. If a server doesn't maintain opaque anonymous identifiers it SHOULD use a hash algorithm like SHA256 to generate an opaque identifier from resource properties.</p>

<p id="_46a3e956-7d0d-6eea-a147-5ddfc04282d6">Push topics MAY be generated on a per-user base for shared resources.</p>

<p id="_961fa8a8-ac28-879c-08af-a59694f109b2">A server MAY change push topics at any time to improve privacy. If doing so the server MUST continue to send out push notifications for the old topic until all subscriptions to that topic have expired.</p>

<p id="_9eeb227b-740e-59a9-78f1-552ca49e8c50">The application server maintains a mapping of subscribed push topics to a list of push gateways. It updates this mapping whenever:</p>

<ul id="_cbab176d-3e78-c9a1-585c-89821d58fae0"><li><p id="_8131fbb6-957b-5aaf-9d04-14720fd2c070">A new subscription request is received</p>
</li>
<li><p id="_2a1109cc-fc22-35e2-1daf-79ca66acfcd5">A response from the push gateway indicates that there are no active subscribers for a particular topic.</p>
</li>
</ul>

<p id="_c621be90-e83e-92b3-2401-58e262e7ad6f">The application server doesn't maintain references to push clients because this information is opaque to the application server.</p>
</clause>

<clause id="_bbedbf04-63eb-4137-ffa5-f02dcf47a0c6" inline-header="false" obligation="normative">
<title id="_9be8bdf3-b59f-253b-8f58-05ac339766ff">Push Gateway</title>
<p id="_2e1542c4-52cc-f0ec-292f-ff89f9730a26">The Push Gateway maintains a mapping of push-topics to a list of subscribed clients and expiration times. It updates the list whenever:</p>

<ul id="_62be3208-994d-32a5-6ac4-c59583ee116f"><li><p id="_bf208901-d66f-e551-3a3c-56919a102679">it receives a new subscription</p>
</li>
<li><p id="_90de3d0f-2e5f-0741-f5ae-1bd6014adb17">a subscription expires or</p>
</li>
<li><p id="_1e993250-3d4b-0122-4b7a-ac9a6777a8f5">the Push Delivery Service returns that a specific client is no longer available.</p>
</li>
</ul>

<p id="_b7136983-0e2a-f080-1da6-d03045ad8979">If a push message for a specific topic is received the push gateway will notify all clients with an active (not expired) subscription for that topic.</p>

<p id="_61cfa5e0-93ba-a2ac-935e-ba2bce715d28">A push gateway may relay messages for other gateways. A gateway that supports relaying MUST maintain a map of topics to gateways just like an application server.</p>
</clause>

<clause id="_71b70a17-8923-8f4c-b1f4-372dbc69ed1d" inline-header="false" obligation="normative">
<title id="_b5b85031-868a-acd4-4dbb-0a0dbf0833bc">Push Delivery Service</title>
<p id="_b7ee036b-89e6-1a51-f3a0-65da9908b554">TBD: Minimum requirements for PDS to support this protocol. Describe what state information the PDS needs to maintain.</p>
</clause>

<clause id="_94e84417-619c-388e-6c02-ff62af9574d9" inline-header="false" obligation="normative">
<title id="_adc54beb-7e94-23f9-bdb0-ee56d6e7b5dd">Client</title>
<p id="_33618001-898e-e5b3-4f3f-e99eaec324ba">TBD: what information does the client need to maintain</p>
</clause>
</clause>

<clause id="_5f474249-c8fd-6699-d272-fc86a0f9b175" inline-header="false" obligation="normative">
<title id="_84967171-565f-ed11-8cb5-9b0c5eb6eae6">Protocol Workflows</title>
<clause id="_0a46b3d6-0177-2921-01f8-0e9ee640aaba" inline-header="false" obligation="normative">
<title id="_f32abc15-83a6-8a2f-6c11-4f6f23b4f368">App Server &lt;→ Push Gateway bootstrap workflow</title>
<p id="_334da2a0-44ed-1751-024b-78ea1d87cc14">This protocol allows an application server to initialize the supported push transports by querying a set of configured push gateways. This requires that the application server knows the root URL of each configured gateway. In order to retrieve the list of supported transports it posts a JSON object with an empty list of push-transports to each gateway.</p>

<p id="_4f5bf1b7-ec23-57fa-5677-a2c9b9718dfc">The following request shows the bootstrap request of an application server that was configured with the Push Gateway URL <link target="https://push.example.com/gateway"/></p>

<sourcecode id="_2e140d9c-57fd-729e-5db9-c17bebcac28e"><body>POST /gateway
Host: push.example.com
Content-Type: application/json
Content-Length: xxx

{ "push-transports": []}</body></sourcecode>


<p id="_96e18005-9cd3-6cbe-c736-a42862f06b91">The push gateway responds with a JSON object that contains an array of push transports.</p>

<sourcecode id="_fa5f0c7e-7ac3-f4ca-b384-6340b60e9ee2"><body>HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: xxx

{ "push-transports": [
  {
    "transport": {
      "transport-uri":
        "https://push.example.com/transport",
      "refresh-interval": 172800,
      "transport-data" : { ... }
    }
  }{
    "transport": {
      "transport-uri":
        "urn:uuid:01234567-0123-0123-0123-0123456789ab",
      "refresh-interval": 172800,
      "transport-data" : { ... }
    }
  }]
}</body></sourcecode>

</clause>

<clause id="_1f632c52-0f93-f499-bca6-1729604b8f7b" inline-header="false" obligation="normative">
<title id="_a71df06e-3858-3ce0-2028-3c73e9ae4b3d">Client &lt;→ App Server workflow</title>
<p id="_c8c88ac4-68f6-cadf-9101-1828e81318d1">The communication between Client and Application Server is defined in the respective application protocol. The application protocol needs to be extended in order to support push.</p>

<p id="_0dd93bbd-cbd5-41c2-3737-7f6e4fc09c44">This document describes the general idea behind the required extensions and gives a concrete definition for a WebDAV extension.</p>

<clause id="_77ec190f-8ef6-93c3-4d5c-1561d401bcf9" inline-header="false" obligation="normative">
<title id="_934af8ec-b3c2-9260-dc93-4110bb1aa615">Client discovery and subscription workflow - Generic</title>
<p id="_287592dc-0b07-5921-983e-0b6b43a3cc71">TBD:</p>
</clause>

<clause id="_81a4490f-3184-2bf2-243a-fbb021305a18" inline-header="false" obligation="normative">
<title id="_bcff420f-1ee7-78a6-36d8-b149dd0de684">Unsubscribe</title>
<p id="_45260a1f-1d24-fab2-3ffe-f6eb77237288">This document doesn't specify an explicit unsubscribe method. A client that doesn't wish to receive any further push notifications for a specific topic MAY send a subscription with an expiration date in the past.</p>

<p id="_6c1e0d7c-5e89-e74b-d73a-3de2742cbaa5">An application server which receives such a subscription MUST handle it like any other subscription. In particular the Application Server MUST:</p>

<ul id="_392dff2c-fe36-6e4b-11f4-a87fc596424e"><li><p id="_3fb0cc35-d01a-0e29-e570-2eb8764fc442">verify the Push Topic and</p>
</li>
<li><p id="_bdce4343-ec4b-6798-c368-34bc0cb85766">forward the susbcription to the Push Gateway.</p>
</li>
</ul>

<p id="_5ff1afa4-6711-f4a5-123e-55cba04c12d2">A Push Gateway which receives a subscription with a passed expiration date MUST:</p>

<ul id="_7f4963f8-069b-bfe1-2766-631717c5f530"><li><p id="_18b87b6c-d041-be1b-d90e-0c56e6111e8b">remove the client from the list of subscribers to this topic and</p>
</li>
<li><p id="_4e45a04c-9c26-5b2e-6cf8-4eca8e3c8dba">not send out any further push messages to this client.</p>
</li>
</ul>
</clause>

<clause id="_2a7037cc-4a2c-cb27-5aaf-34a8ea5dd7cc" inline-header="false" obligation="normative">
<title id="_06af4bdb-b24a-1e23-c625-929fdbe732c3">Client discovery and subscription workflow - WebDAV</title>
<clause id="_fcf65a28-e06f-0d44-9816-87d89a7e66f2" inline-header="false" obligation="normative">
<title id="_90cd887e-e20f-7001-7117-14be4b3187fa">Push discovery</title>
<p id="_a598d827-c35c-92de-a9b3-f7082e540051">The following example shows a PROPFIND request on a user's calendar home to discover push support.</p>

<sourcecode id="_0c925407-91e1-a0d0-c0ab-3dccd53012b0"><body>PROPFIND http://calendar.example.com/calendars/
Content-Type: application/xml
Depth: 0
Content-Length: xxx

&lt;D:propfind xmlns:D="DAV:" xmlns:P="urn:ietf:params:xml:ns:dav-push"&gt;
  &lt;D:prop&gt;
    &lt;P:subscribe-URL&gt; /&gt;
    &lt;P:supported-transport-set /&gt;
    &lt;P:topic /&gt;
    &lt;P:version /&gt;
  &lt;/D:prop&gt;
&lt;/D:propfind&gt;</body></sourcecode>


<p id="_dac816d5-3f6a-32ee-9480-16451e512a6a">The server responds with the respective properties:</p>

<sourcecode id="_eb027cdd-f2fb-6a04-7089-9acd8a0b3394"><body>HTTP/1.1 207 Multistatus
Content-Type: application/xml; charset=UTF-8
Content-Length: xxx

&lt;D:multistatus xmlns:D="DAV:"&gt;
  &lt;D:response&gt;
    &lt;D:href&gt;/calendars/&lt;/D:href&gt;
    &lt;D:propstat&gt;
      &lt;D:prop&gt;
        &lt;P:subscribe-URL&gt;
          &lt;D:href&gt;https://calendar.example.com/subscribe&lt;/D:href&gt;
        &lt;/P:subscribe-URL&gt;
        &lt;P:supported-transport-set&gt;
          &lt;P:transport /&gt;
          &lt;P:transport&gt;
            &lt;P:transport-uri&gt;urn:uuid:01234567-0123-0123-0123-0123456789ab&lt;/P:transport-uri&gt;
            &lt;P:transport-data&gt;...&lt;/P:transport-data&gt;
            &lt;P:refresh-interval&gt;172800&lt;/P:refresh-interval&gt;
          &lt;/P:transport&gt;
          &lt;P:transport&gt;
            &lt;P:transport-uri&gt;https://push.example.com/transport&lt;/P:transport-uri&gt;
            &lt;P:transport-data&gt;...&lt;/P:transport-data&gt;
            &lt;P:refresh-interval&gt;172800&lt;/P:refresh-interval&gt;
          &lt;/P:transport&gt;
        &lt;/P:supported-transport-set&gt;
        &lt;P:topic&gt;123&lt;/P:topic&gt;
        &lt;P:version&gt;1&lt;/P:version&gt;
      &lt;/D:prop&gt;
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt;
    &lt;/D:propstat&gt;
  &lt;/D:response&gt;
&lt;/D:multistatus&gt;</body></sourcecode>

</clause>

<clause id="_ec1ddae0-4b9f-5ff8-7901-1e9cd6895d8d" inline-header="false" obligation="normative">
<title id="_cbea7fc0-bd0b-234b-cf6a-a9391cb93ec8">Push subscribe</title>
<p id="_1137d753-e34b-5b42-5101-a9e04b5079ae">Calendar server → Client - CS server advertises its supported push mechanisms</p>

<p id="_26758815-7848-7f72-7bd0-8627491e6ac8">Clients request POST to P:subscribe-URL - does the actual subscription to the calendar server:</p>

<sourcecode id="_7f123eff-4e72-68ca-6772-c14d3a60cabe"><body>POST /subscribe HTTP/1.1
Host: calendar.example.com
Content-Type: application/xml; charset=UTF-8

&lt;P:subscribe xmlns:P="urn:ietf:params:xml:ns:dav-push"&gt;
  &lt;P:topic&gt;123&lt;P:topic&gt;
  &lt;P:topic&gt;abc&lt;P:topic&gt;
  &lt;P:selected-transport&gt;
    &lt;P:transport-uri&gt;https://push.example.com/transport&lt;/D:transport-uri&gt;
    &lt;P:client-data&gt;XYZ&lt;/D:client-data&gt;
  &lt;/P:selected-transport&gt;
  &lt;P:expires&gt;2017-10-07T12:00:00Z&lt;/P:expires&gt;
&lt;/P:subscribe&gt;</body></sourcecode>


<p id="_85b954b8-a1c4-e92c-82ce-b4d7b34fc46c">If one or more topics are invalid the entire request MUST fail without any subscriptions being recorded. In this case the server MUST return an error response containing a list of topics that failed. If a topic is valid but the authenticated user doesn't have access to any of the resources that the topic belongs to the server SHOULD treat this topic as being invalid and the request SHOULD fail.</p>
</clause>
</clause>
</clause>

<clause id="_c06e9dca-964c-f2b9-403d-10814e77a9a8" inline-header="false" obligation="normative">
<title id="_b4331b3f-2e47-afe6-fe28-5f3f28f94ab1">App Server → Push Gateway subscribe workflow</title>
<p id="_2f5b2c20-52ad-7339-0d66-40019ea22cd6">When a client sends a request to subscribe to specific topics the application server MUST forward the subscription to the chosen gateway or to the gateway that announced itself as a proxy for the chosen gateway.</p>

<p id="_213fd33d-3963-ef23-3c23-494e3f57872b">If a gateway acts as a proxy for another gateway it MUST forward the request to the proxied gateway.</p>

<p id="_c36ccd02-62a8-1e1c-8afe-d679c1672bea">The following example shows a request to subscribe to two topics.</p>

<sourcecode id="_f5e2b483-08f8-1e7b-6a05-a205e1aa7382"><body>POST / HTTP/1.1
Host: push.example.com
Content-Type: application/json

{
  "push-subscribe": {
    "topics": [ "123", "abc" ],
    "transport": {
      "transport-uri": "https://push.example.com/transport",
      "client-data": "XYZ"
    },
    "expires": "2017-10-07T12:00:00Z"
  }
}</body></sourcecode>


<p id="_5875c8c6-74d6-ae34-463c-e81135139a93">To acknowledge the subscription the gateway SHOULD send an initial PUSH notification to the client.</p>

<p id="_f5d6110e-e792-b664-8726-4157313dbbcd">A successful response contains the URL to send update messages to. The URL may be different than the transport URL. An Application Server MUST use this URL when sending push notifications to transports provided by clients.</p>

<sourcecode id="_3dd26943-f561-12a5-e792-0fbf7dfd8765"><body>HTTP/1.1 200 OK
Content-Type: application/json

{ "push-url": "https://push.example.com/" }</body></sourcecode>

</clause>

<clause id="_1bb97acd-12cf-f2bc-4ac6-63fcd9fcd950" inline-header="false" obligation="normative">
<title id="_f3571ded-5d1b-be8e-119b-ceba0bdc4886">App Server → Push Gateway push workflow</title>
<p id="_3b0ef5c5-3a1f-8d06-073f-410566c55100">Whenever a substantial change occurs in any of the resources the application server sends a Push Message to the gateway containing the Topics of the resources that have changed.</p>

<p id="_9d1ad476-9d79-faf8-c1ca-77ca0fc1a486">The following example sends a push notification for the Topics "123" and "abc". The message for Topic "123" also contains a "client-id" to omit any notification to the sole client that modified the resource and caused this push message. The second message has a low priority and no "client-id". Such a message could be generated by multiple clients acknowledging an alarm on a shared calendar.</p>

<sourcecode id="_e4fb31fd-840d-18d6-f0fb-28c4eae99cd1"><body>POST / HTTP/1.1
Host: push.example.com
Content-Type: application/json

{
  "push": {
    "messages" : [{
      "topic": "123",
      "priority": 100,
      "timestamp": "2017-10-01T14:00:52Z",
      "client-id": "xyz"
    }, {
      "topic": "abc",
      "priority": 0,
      "timestamp": "2017-10-01T14:00:53Z"
    }]
  }
}</body></sourcecode>


<p id="_c35bb25f-9c67-0766-3558-d0cba117dd43">Response: HTTP status for success or HTTP status for failure with a XML/JSON error response body. It's not an error if a topic is unknown or there are no active subscribers for this topic. Instead the response will contain a list of all topics without subscribers. The application server SHOULD update its topic-to-gateway mapping accordingly. The application server MUST assume that topics which were in the request and not in the "no-subscribers" list have been pushed to the client.</p>

<p id="_4afdb226-ef98-7a92-264a-a15875958de5">If there is a subscriber for each topic in the request the no-subscribers list MUST be omitted.</p>

<sourcecode id="_0a6d262d-08fb-6cb6-d147-ae95e66deb83"><body>HTTP/1.1 200 OK
Content-Type: application/json

{ "push-response": {} }</body></sourcecode>


<p id="_89f17357-845e-4b5e-9c9a-d08d99bc7699">If there are topics without active subscribers:</p>

<sourcecode id="_bdb4bc5f-3e45-2316-88e5-69f6532e553a"><body>HTTP/1.1 200 OK
Content-Type: application/json

{
  "push-response": {
    "no-subscribers": [
      { "topic": "123"}
    ]
  }
}</body></sourcecode>

</clause>
</clause>

<clause id="_29100920-d388-fdd3-5659-b4439e195f9f" inline-header="false" obligation="normative">
<title id="_a724514e-9a13-e99d-0bb1-5d433f53558d">Syntax Elements/Properties</title>
<clause id="_aa8fe7eb-06a3-30a4-fbc6-05e26588e6c3" inline-header="false" obligation="normative">
<title id="_ea179a5c-30fc-6256-c51d-19d2211a59b8">Push gateway protocol</title>
<clause id="_325ed640-7dd2-a01e-9d57-482623eb7e83" inline-header="false" obligation="normative">
<title id="_ce702cf8-cc58-031c-a038-8a0273a3d84d">Bootstrapping</title>
<sourcecode id="_dd780e07-a55a-03f8-8dbe-3af35425fe4f"><body>; root element
root {
        push-transports
}

; a list of push transports supported by a gateway
; in the request sent by the application server this is empty
push-transports "push-transports" [
        * transport
]

transport "transport" {
        ; The uri of the transport.
        "transport-uri" : uri,
        transport-data?
}

; optional data the client needs to know in order to subscribe
; to allow easy conversion to other formats,
; this object MUST NOT contain structured data.
transport-data "transport-data" {
  ^"": any
}</body></sourcecode>

</clause>

<clause id="_7ab257d8-c3c0-9efa-9d58-65476090ee1c" inline-header="false" obligation="normative">
<title id="_2b5c38a5-07ee-24dc-5c1c-4257f3d4d579">Subscription</title>
<sourcecode id="_afd66df1-ccb0-bf0d-3cec-057ecd14be3e"><body>; root element
root {
        push-subscribe
}

; the object describing the subscription
push-subscribe "push-subscribe" {
        topic-list,
        selected-transport,
        expires
}

; The list of topics to subscribe to. Unless a previous
; subscription is updated by a request, existing
; subscriptions won't be affected by new subscriptions.
topic-list "topics" [
        * topic
}

; The chosen transport type
selected-transport "selected-transport" {
        ; The transport-uri of the chosen transport
        "transport-uri" : uri,
        ; The client-data string as sent by the client
        "client-data" : string
}

; The time of when the subscription expires
; must be a UTC timestamp following
; https://tools.ietf.org/html/rfc3339
expires "expires" : RFC 3339 timestamp</body></sourcecode>

</clause>

<clause id="_b5f58a6e-670e-d9c8-ca71-7f74f5f18a19" inline-header="false" obligation="normative">
<title id="_a187a6f6-574b-0465-3844-0b7f1b46bc1a">Update notification</title>
<sourcecode id="_70800ea6-8bd2-7111-fcdf-2fc88eb00a0f"><body>; The root object
root {
        "push" [ 1* message ]
}

; A message object, describing the update
message {
        topic,
        ? priority,
        timestamp,
        ? client-id
}

; The topic of the resource that has been updated
topic "topic" : string

; The priority of the change, with 0 being the lowest and 100
; being the highest priority
; If omitted, implementations SHOULD default to 50.
priority "priority" : integer 0..100

; The time of when the change occurred. The value MUST be a
; timestamp in UTC following https://tools.ietf.org/html/rfc3339
; If the server aggregated multiple updates before sending the push
; message, this MUST be the timestamp of the most recent update.
timestamp "timestamp" : RFC 3339 timestamp

; An optional id that identifies the client that triggered the update
; notification. Push gateways can use this information to suppress
; push messages to this particular client, in order to avoid
; unnecessary sync operations.
; If the server aggregated multiple updates from different clients
; into one message, it MUST omit the client-id to ensure all clients
; receive the push message.
client-id "client-id": string

; root element of the push subscribe response
root {
        ? no-subscribers-list
}

; A list of topics without active subscribers.
; Applications servers SHOULD not send further push messages for the
; enlisted topics to this transport unless a new client subscribes on
; this transport.
no-subscribers-list "no-subscribers" [
    1* topic }
]</body></sourcecode>

</clause>
</clause>
</clause>

<clause id="_65dbdd7f-02a5-b235-95e8-929983fe3c62" inline-header="false" obligation="normative">
<title id="_dcd06d98-940a-d7ea-a8f4-b6ac7e05f74d">XML Element definitions</title>
<clause id="_6804677d-773d-618a-7fba-d2307cf1fbb7" inline-header="false" obligation="normative">
<title id="_3cd54d52-86d3-8892-b720-db9c6c094a98">WebDAV Properties</title>
<clause id="_e973ca72-da69-5b09-d9e1-06a47aa4c4ed" inline-header="false" obligation="normative">
<title id="_20ef40f3-6e46-96af-ba25-e5a3ed803c82">DAV-PUSH:push-subscribe-URL</title>
<dl id="_18f96e80-79a4-e396-61a5-b57cc2c74cb8"><dt>Name:</dt>
<dd id="_569d6274-4318-7ba8-fb31-39dd87a6d39e"><p id="_ef4b4bcd-b97b-2ad4-8df3-8d3f8a8e7206">push-subscribe-URL</p>
</dd>
<dt>Namespace:</dt>
<dd id="_06cc2c0b-18f9-272a-9f91-aca6c6adc4bc"><p id="_e01150ec-bc97-6b96-da48-69579ce61d17">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_2cecfc81-8217-7424-b8c8-f49d8c61c7a6"><p id="_35144abb-d2d9-c188-212b-7c687171996d">Specifies the address to send the subscription requests to.</p>
</dd>
<dt>Description:</dt>
<dd id="_bfd25f63-4222-9767-d2a7-e923aed9900a"><p id="_196a8951-760a-6d03-0e53-0628b9a41803">The push-subscribe-URL element contains exactly one DAV:href element with a URL that points to the subscription service endpoint.</p>
</dd>
<dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_7273e10a-af91-48b3-6206-893b76b34d17" lang="xml"><body>&lt;!ELEMENT push-subscribe-URL (DAV:href)&gt;</body></sourcecode>

</clause>

<clause id="_dcfb02f2-b8d0-3f09-a9d3-9461f1113558" inline-header="false" obligation="normative">
<title id="_95f82881-cf46-8c24-faf6-a60289da7242">DAV-PUSH:supported-transport-set</title>
<dl id="_dcba5f83-7855-6b8c-d124-f360565a57e2"><dt>Name:</dt>
<dd id="_ef94429f-62d0-284c-f71a-50d0d30665a6"><p id="_9b6bdfda-e74f-3619-49d5-344e4a9b24a2">supported-transport-set</p>
</dd>
<dt>Namespace:</dt>
<dd id="_f912b376-be2a-6815-690e-de64ffca8c42"><p id="_41fd0032-f4db-59cd-84fc-fef7f36ac826">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_9f2e4951-e583-7aff-19f3-9c6e72f7103c"><p id="_13270164-2598-5787-b04a-2bfb8bea496f">Specifies a list of transports supported by the application server.</p>
</dd>
<dt>Description:</dt>
<dd id="_665fe33e-2241-d43e-22fa-5ae3057c6b76"><p id="_f27d40d8-1a8c-b03f-54d8-dea2fad3d06a">This element contains the set of push transports supported by the server. The transport-uri element of each transport must be unique within the set of transports.</p>
<p id="_28ead3a6-45db-af4a-6c00-7ca25f05d546">The set MAY contain one transport element without any child elements to indicate that the client may provide its own transport.</p>
</dd>
<dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_49045547-a5f6-41fa-07c9-c324838cb049" lang="xml"><body>&lt;!ELEMENT supported-transport-set (transport*)&gt;</body></sourcecode>

</clause>

<clause id="_caa1dd61-b2a3-22cc-4f66-e45825feb6f8" inline-header="false" obligation="normative">
<title id="_3119d938-0907-a259-6639-917942cbceb1">DAV-PUSH:transport</title>
<dl id="_e93cefb3-589b-b4f4-690f-cefde1371abe"><dt>Name:</dt>
<dd id="_e6b4432b-4c8f-d429-f05c-a05183684cc9"><p id="_522a989c-95e1-2193-7097-98c5fdec124b">transport</p>
</dd>
<dt>Namespace:</dt>
<dd id="_bf939445-d1ab-cdad-420f-e075609b0912"><p id="_c237ebae-b886-f3d6-83da-6fed2ebc2383">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_c2ab0d7c-4472-a4fc-d76a-7e81496c58d7"><p id="_8286d394-1134-23e9-c870-79c35da76e7e">Describes a specific transport.</p>
</dd>
<dt>Description:</dt>
<dd id="_60ccff95-4140-751a-4df7-71fc0d4805da"><p id="_3c929ece-08c3-341e-1aa3-94de749650cf">A transport element represents a specific push transport path to clients on a specific service. In general it contains a transport-uri element that uniquely identifies the transport.</p>
</dd>
<dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_0645407a-4be4-0ad7-d8ec-f069e1aceb28" lang="xml"><body>&lt;!ELEMENT transport (transport-uri,
                        transport-data, refresh-interval)?&gt;</body></sourcecode>

</clause>

<clause id="_64ac036e-b45b-f008-f883-71f39e8a5a22" inline-header="false" obligation="normative">
<title id="_9e550288-ccc0-6caf-ed37-372ca84b4a44">DAV-PUSH:transport-uri</title>
<dl id="_a2f5499b-742c-dfc7-a3b1-6ab85697cb69"><dt>Name:</dt>
<dd id="_2d18c9fc-07ec-3292-92e2-6534cc745f2b"><p id="_5824719f-b14e-d4b5-f98b-e027b0520194">transport-uri</p>
</dd>
<dt>Namespace:</dt>
<dd id="_f01e70ef-7f32-ed15-7f7f-4479116d8e2b"><p id="_f89c0376-d67f-e676-0ff9-85af939e75e8">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_355d7d09-9693-5943-5ca4-ce937e1dc1f9"><p id="_948a5ddd-0984-a9db-fa97-40a210d90798">Specifies the URI that identifes the transport.</p>
</dd>
<dt>Description:</dt>
<dd id="_00bcfaf4-2f21-9902-8352-139a242007a1"><p id="_dc2bfeb7-8e1b-f959-5dd7-0fdc9338f483">Clients compare the provided transport-uris to the transport-uris they support.</p>
</dd>
<dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_2a937039-0f66-ae67-0234-d53913e6305c" lang="xml"><body>&lt;!ELEMENT transport-uri (#PCDATA)&gt;
PCDATA value: The URI identifying the transport.</body></sourcecode>

</clause>

<clause id="_f95a3465-587a-9d6f-5b80-d929fb4b35e5" inline-header="false" obligation="normative">
<title id="_33391228-5b78-6a17-a70e-199a8b7246b9">DAV-PUSH:transport-data</title>
<dl id="_1ca394f4-b2b8-8c61-3144-94396794a34a"><dt>Name:</dt>
<dd id="_e5d41c06-fab7-84b1-7ded-7c74654b7255"><p id="_9b35e967-ea22-62a7-56a8-b2a208bfdb88">transport-data</p>
</dd>
<dt>Namespace:</dt>
<dd id="_327d355e-e88d-be83-27cc-581c060c100e"><p id="_5d026868-d849-44c4-5061-b6caaecadce3">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_8b892484-00fa-d415-098e-9ce9a317d26e"><p id="_459bfdcd-c091-7ab8-0963-de320e2a65ec">Contains a list of additional attributes that client needs to know in order to subscribe on this transport.</p>
</dd>
<dt>Description:</dt>
<dd/><dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_43c3b930-7690-a885-fdb7-f925635ba9e1" lang="xml"><body>&lt;!ELEMENT transport-data ANY&gt;</body></sourcecode>

</clause>

<clause id="_61f49106-4253-a496-d7cd-35b6d96fa35e" inline-header="false" obligation="normative">
<title id="_3a6d84d2-fd40-9fa1-9e72-451c6e48b80f">DAV-PUSH:refresh-interval</title>
<dl id="_fd63beb4-f736-e26d-328f-e5bc8e695ac5"><dt>Name:</dt>
<dd id="_cf80a14e-b6ae-d306-957f-6d14d27047cc"><p id="_a2742a7f-6a07-d916-7f24-96c41a86aafa">refresh-interval</p>
</dd>
<dt>Namespace:</dt>
<dd id="_03a96358-0b77-b39d-b2fd-909e0ad99774"><p id="_9aecb886-420d-ff11-2d11-d11f6a7a4576">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_a7a9cecc-4dcd-9ce2-7ad1-43fabd03f472"><p id="_fc4fea0f-d537-e1b4-1adb-feeef8b25c51">Specifies the maximum refresh interval.</p>
</dd>
<dt>Description:</dt>
<dd id="_ba4f0dbf-5d90-c20d-1a24-90de8b8bd3ac"><p id="_d01d33cb-db76-df69-c813-7acead0c0b8c">Specifies the duration in seconds after which the client is expected to re-subscribe. If the client didn't res-subscribe within this period of time the gateway MUST remove all subscriptions and no further push notifications will be delivered to the client until it subscribes again.</p>
<p id="_9d963a2f-2481-c3a5-05ea-96b2fb1db073">A Push Gateway MUST not accept subscription requests with an expiration time that would exceed the refresh interval.</p>
</dd>
<dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_50cba23f-c1a5-9ea7-999d-a2a5c76bf344" lang="xml"><body>&lt;!ELEMENT refresh-interval (#PCDATA)&gt;
PCDATA value: the maximum refresh interval in seconds</body></sourcecode>

</clause>

<clause id="_661afddc-31ac-225f-925f-58f204cd5a73" inline-header="false" obligation="normative">
<title id="_774a9993-5806-2be3-8f17-b7d11a204581">DAV-PUSH:topic</title>
<dl id="_aa20485a-11da-a36e-250d-d5939e78f9bb"><dt>Name:</dt>
<dd id="_c2ac3a57-4b3c-b8c1-8f31-db98f0794ed8"><p id="_5d2e16d3-f009-e936-3b74-89b83327c34d">topic</p>
</dd>
<dt>Namespace:</dt>
<dd id="_bbb3546f-cb19-7886-fe86-bbbcfe00876e"><p id="_a8e43f88-c40b-80fb-72be-e797c347142f">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_4c05193c-0c8a-66db-3610-daf4997e6237"><p id="_3f55087c-0cf1-7de3-1034-38673487c170">Specifies the push topic of a resource.</p>
</dd>
<dt>Description:</dt>
<dd id="_d8f09c77-40d2-5f67-04db-eb0dd9e6997e"><p id="_0737279a-0efc-acd9-e099-8c7e6f9ff56b">The topic identifies the name of the update channel for a resource. Clients send the topic in a subscription request to inform application server and gateway that it wants to receive update notifications for the resource.</p>
<p id="_5b45f636-d99e-c2f1-5d53-89b42526d3f7">This document doesn't specify a specific format for topics nor a specifc algorithm to generate them.</p>

<p id="_fa52d1d7-53ca-f84a-346b-9023098ce409">Server developers MUST ensure that topics on different installations won't collide.</p>

<p id="_ea327d6e-6364-14dc-558f-14381e06ec20">Resources within the same domain MAY share topics.</p>
</dd>
<dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_a0860e4b-b69c-11f3-08ec-9c5e65635df8" lang="xml"><body>&lt;!ELEMENT topic (#PCDATA)&gt;
PCDATA value: the push topic</body></sourcecode>

</clause>

<clause id="_5d9bd88f-d45f-ef1d-3858-76366598214a" inline-header="false" obligation="normative">
<title id="_e0d61d3d-abf4-5d27-38be-8577cce96b59">DAV-PUSH:version</title>
<dl id="_67f5a060-11a7-f354-e204-3004e551a33b"><dt>Name:</dt>
<dd id="_42fe4668-c2a9-00c8-d755-2cafbd1f8623"><p id="_dfa1b2b7-9ed9-556b-0b2f-ce46bcd3bcf8">push-version</p>
</dd>
<dt>Namespace:</dt>
<dd id="_130c8e00-05e8-5629-c8ce-221065c9eefb"><p id="_eb558089-fcf8-f2bd-7e1e-d5f7dd2f484c">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_98c5193e-0996-51bb-be6b-8e26028ab9ec"><p id="_1c1468e6-5b1f-204a-611c-4234e1fa4ee0">Specifies the highest version number of the push protocol supported by this server.</p>
</dd>
<dt>Description:</dt>
<dd/><dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_04cd6f96-f8b6-6abe-7b44-5b65bbb72cb8" lang="xml"><body>&lt;!ELEMENT push-version (#PCDATA)&gt;
PCDATA value: the highest push protocol version number
              supported by the application server</body></sourcecode>

</clause>
</clause>

<clause id="_b8420dbb-3ea9-c812-0904-d599637dba8d" inline-header="false" obligation="normative">
<title id="_0f8ecda1-f73c-8352-704c-57e1919ae846">Subscription request</title>
<clause id="_99986f7f-ad91-a70f-630c-82e83c604f97" inline-header="false" obligation="normative">
<title id="_2bf400ac-b15b-a070-4bf2-d7c1fc6e2289">DAV-PUSH:subscribe</title>
<dl id="_eaa93f15-7161-8674-68d3-0397da586e52"><dt>Name:</dt>
<dd id="_6f5454db-2ea8-06cc-58ec-e4b3cc06a9c2"><p id="_d4835dcd-0153-3cbc-ac75-359998fbfc35">subscribe</p>
</dd>
<dt>Namespace:</dt>
<dd id="_ccc20edd-2afd-14bf-915f-e85b56c3ae77"><p id="_3792a156-83aa-b522-e357-e683daf2529a">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_e9f45e76-005b-f3f7-234e-6e8c025c6316"><p id="_846165b8-dfbf-d2b1-b29a-883426ede18a">Represents a subscription request document.</p>
</dd>
<dt>Description:</dt>
<dd id="_4de613d4-4da0-cfad-0ae6-604fa04541e7"><p id="_5d5e711a-9a35-ff43-fad1-1540c2668d4b">The subscribe request contains all information to subscribe to specific topics selecting a specific transport to deliver push notifications.</p>
<p id="_5b813c5e-844b-1dc1-9ff2-3c9b7f7d54be">A subscription must have an expiration date after which the subscriptions will become void.</p>
</dd>
<dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_8f04e4d3-0ffc-2dec-6d6b-e1cc4d2e2752" lang="xml"><body>&lt;!ELEMENT subscribe (topic+, selected-transport,
                        expires)&gt;</body></sourcecode>

</clause>

<clause id="_633f8cf0-6e28-90af-9612-f2331e211dcd" inline-header="false" obligation="normative">
<title id="_3df2190c-52a7-37a6-de21-4b6a42066735">DAV-PUSH:selected-transport</title>
<dl id="_2bf24c40-993a-5245-8508-4748d49ead93"><dt>Name:</dt>
<dd id="_196a3431-1ba8-3a03-9693-9de8e3792ec7"><p id="_66496420-1bc9-2430-bbc8-22dcfa2de1df">selected-transport</p>
</dd>
<dt>Namespace:</dt>
<dd id="_721b4c43-fba7-4747-09d7-dece0a37e246"><p id="_445bb28c-7150-bdfa-910a-3e0441323ba7">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_19fbdfa5-f404-c127-432b-33a71d3922c9"><p id="_d4a1020c-cfd8-09a7-1a62-c0249bc8ee2e">Specifies the transport the client has chosen.</p>
</dd>
<dt>Description:</dt>
<dd id="_d6ca7a84-b5b8-60f4-5d41-3985ec14be12"><p id="_a08f0ecd-54ff-7b28-fd6c-17d78a3e7064">The selected-transport element contains the transport-uri of the transport that the client has chosen for push delivery. It also contains a client-data element to be forwarded to the push gateway.</p>
</dd>
<dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_b454d4df-a16e-91d5-a1e1-704517646773" lang="xml"><body>&lt;!ELEMENT selected-transport (transport-uri,
                        client-data)&gt;</body></sourcecode>

</clause>

<clause id="_894350d4-06ce-6a3b-ba6e-a3473d49841b" inline-header="false" obligation="normative">
<title id="_9473b3d7-9d3c-f4cf-7db5-8930689a3890">DAV-PUSH:client-data</title>
<dl id="_2d83a000-ed6b-7486-1a31-276576884ef6"><dt>Name:</dt>
<dd id="_752e7808-c56e-d717-e05f-6d77b93a034c"><p id="_788b788c-7865-7b02-260c-93ed8bb6f4c1">client-data</p>
</dd>
<dt>Namespace:</dt>
<dd id="_93a1648e-3a0d-594b-ece3-33374ae1f871"><p id="_295ed800-999e-84fc-71f2-b92963871fa3">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Purpose:</dt>
<dd id="_6dce1e74-1f92-8224-5a42-58b82608ec0c"><p id="_3b28da29-228b-7979-56d1-0b6467f930f5">Contains a string the client needs to provide to the push-gateway for the chosen transport.</p>
</dd>
<dt>Description:</dt>
<dd id="_e4749030-2d25-38fb-397e-3a248bf97e02"><p id="_df03f9aa-9fd1-f360-7837-a45e76578bd7">This element provides a mechanism for the client to communicate to the gateway. The format of the data string is not defined in this document. The application server MUST forward the client-data string as provided by the client.</p>
<p id="_d58e8d48-f197-8e5c-a0bd-8d092ab919f9">Gateways SHOULD use this to authenticate clients.</p>
</dd>
<dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_1c735a13-308e-307d-71de-304fd1cf2d26" lang="xml"><body>&lt;!ELEMENT client-data (#PCDATA)&gt;
PCDATA value: client data as required by the push gateway</body></sourcecode>


<dl id="_70143970-2148-01b4-0fc4-79ee3f4a63b4"><dt>Name:</dt>
<dd id="_dc77e0d8-3adf-a02f-1ae3-a4899f9fcb41"><p id="_295bf286-65fd-c369-f50c-ce9357872cd2">invalid-topics (precondition)</p>
</dd>
<dt>Purpose:</dt>
<dd id="_5400c606-6bea-02f8-b502-00b3203c6423"><p id="_bfc6e136-1fdc-4767-5719-1294faa5793a">The request could not succeed, because it contained invalid push topics. This element contains one topic element for each rejected push topic. The client may repeat the request without those topics.</p>
</dd>
<dt>Definition:</dt>
<dd/></dl>

<sourcecode id="_96617bbe-881d-3733-050f-c9038762b9e8" lang="xml"><body>&lt;!ELEMENT invalid-topics (topic+)&gt;</body></sourcecode>

</clause>
</clause>
</clause>

<clause id="_ac5d7ad1-c2aa-371a-111a-7452e775b35f" inline-header="false" obligation="normative">
<title id="_4eaaa321-4775-6591-3b99-0515bbf5c76e">HTTP Headers for DAV-Push</title>
<clause id="_4e8687fc-b292-ef5b-2c32-7777c0098f4f" inline-header="false" obligation="normative">
<title id="_6cb8134b-f231-0f38-9193-16618e9775ca">Push-Client-Id Header</title>
<sourcecode id="_9185a4e9-3509-d63a-b87a-d127927ef0b8"><body>Push-Client-Id = "Push-Client-Id" ":" token</body></sourcecode>


<p id="_810f54af-5386-ce5b-dc52-282027d9b6b4">The client sends this header to identify itself to the application server as the modifying instance. If the application server didn't coalesce multiple updates from different clients into a single push message, it SHOULD include the value in the update notification message. The provided token ([RFC7230]) MUST be percent-encoded as per [RFC3986]. Gateways can use this information to suppress push messages to this particular client.</p>

<p id="_630b59c6-56fc-a8d8-833f-d9be47c0c33a">The actual value of token is part of the contract between client and gateway. The token MUST NOT contain any sensitive data like user name or device identifiers. It SHOULD be either a random or an obfuscated token (using a cryptographic hash function).</p>
</clause>
</clause>

<clause id="_0a8211e1-0ef6-7698-c846-bc7626b6e002" inline-header="false" obligation="normative">
<title id="_fed67b62-4510-74b9-e315-0c878d7adb60">Guidelines</title>
<clause id="_125ef7ba-f94d-0e39-5e17-5a751758400c" inline-header="false" obligation="normative">
<title id="_3239ef36-04e6-62c6-37ed-889746aac4fc">Application Servers</title>
<p id="_ac0a50f8-8001-d619-e152-abe036e191b7">Servers may want to implement some form of "keep-alive" within the push protocol to ensures clients know they are still connected in cases where actual data changes happen at long intervals (e.g., a calendar user who only makes changes once a day).</p>

<p id="_df9fa5b5-cdc3-2060-fc54-a7dfcd0786c1">Priorities:</p>

<p id="_d5091c1f-ef0b-237d-ca39-181dd1a29428">Range 0 - 100 - 0 is lowest and 100 is highest</p>

<p id="_99ccf8d6-02fd-6d06-7bb6-b96e7c07edd5">e.g.:</p>

<ul id="_0b3f3657-677d-a657-4f03-d528056a0438"><li><p id="_250da666-88de-6f40-7921-abdce51ac922">low priority - updates due to other attendees changing their partstat</p>
</li>
<li><p id="_b7a648e5-ecbe-5bdb-4165-b7b942c701d9">high priority - updates to events occurring in the next 24 hours</p>
</li>
</ul>

<p id="_8c4495e0-ccd6-fc55-dfe6-b242d6ee4c97">Priority is used by a client to indicate what level of push they want at a specific time. It can also be used by the push gateway or push delivery system to throttle push notifications to the client based on load.</p>

<p id="_cbe81199-2b4d-fdbb-74d1-0e45026113ed">Servers MAY delay the delivery of push notifications for several seconds in order to coalesce notifications. This is useful to give the server a certain amount of control over the client's behavior during times of high load.</p>

<p id="_33ad46ac-6fcb-27ae-4ece-bd1a0d358729">Servers MUST NOT coalesce push notifications based on priority.</p>

<p id="_190fb3d3-44c9-7bad-327f-b9a26f0968f1">Application servers MAY allow clients to provide their own transports. If the transport-uri is not among the transport-uris as advertised by the application server, the transport-uri MUST be an HTTPS URL. If a client sends such a transport-uri, the application server SHOULD perform a transport discovery on the provided URL to discover all transports supported on this gateway.</p>
</clause>

<clause id="_3ed7ed18-f397-0c8c-9ee5-c8c1b520bb0b" inline-header="false" obligation="normative">
<title id="_c55d2f28-cccb-402a-a9c4-9c54ef260f82">Clients</title>
<p id="_914f7286-67ac-72ef-7622-c54abc6b3f49">Clients MUST be prepared that they might receive an initial push notification that acknowledges the subscription before the response to the push-subscribe request has been received.</p>

<p id="_f3faafbe-d9a4-3d95-5b7a-762f29fc23b2">Clients SHOULD NOT rely solely on push notifications. The framework described in this document does not make any guarantees about the delivery of a push notification. Clients should be prepared to trigger a synchronization themselves if no push message has been received within some time period.</p>

<p id="_59b7378e-70ae-4844-eee3-f99444fca668">Clients can expect that sometimes they will get a push but then not detect any actual changes when they sync (i.e., "no-op" push from server as a "keep-alive" mechanism).</p>
</clause>

<clause id="_e9f18030-8c18-eb31-5daf-8f9a33166e0d" inline-header="false" obligation="normative">
<title id="_9251c58f-4a29-1f96-61c7-6828649c1827">Push Gateway</title>
<p id="_3c951288-8b78-ed51-9afc-177c1b267c9c">A Push Gateway SHOULD require some kind of authentication to be encoded in the client-data string. This document doesn't specify any authentication methods. However, among others, encrypting the client-data string with a shared secret and digitally signing the data are two possible options to achieve this.</p>

<p id="_70f1c372-7130-c0f6-a424-bf69741d2a22">Client data MAY contain additional per-client preferences, like minimum priority to deliver or maximum delay of notifications when doing coalescing. This is part of the contract between client and transport an not subject of this specification.</p>

<p id="_12379a32-4a3c-4b30-f786-ca4229fb0cf9">Gateways MAY coalesce push notifications based on priority.</p>
</clause>
</clause>

<clause id="_5fd22e8a-357d-72d1-42e0-98c4aa55344d" inline-header="false" obligation="normative">
<title id="_881fb898-9683-9a03-21d9-1f6cfb7091fa">Security Considerations</title>
<p id="_e7f563f7-d14b-43ce-0a3d-fc303c9fdd28">To prevent abuse of the service, Push Gateways SHOULD require either servers or clients or both to authenticate. Servers SHOULD authenticate every request of Protocol #2 via HTTP.</p>

<p id="_d035a3ed-23fb-04c5-774d-a69ae6893034">Push Gateways use the <tt>&lt;gateway-data&gt;</tt> information to authenticate subscription requests from a Server by relating them to Client authorization requests. Clients will typically be authenticating to Servers to access protected data on the server and thus SHOULD authenticate when using Protocol #1.</p>
</clause>

<clause id="_8ac7d2ea-b1d3-7dab-0144-f176e23faa71" inline-header="false" obligation="normative">
<title id="_9d3c6c26-078a-3c40-91de-3680e90aa290">IANA Considerations</title>
<p id="_30c1cb2b-198e-bfb6-e92a-aa004f97503f">This document uses a URN to describe a new XML namespace conforming to the registry mechanism described in RFC 3688.</p>

<clause id="_2f6cd0fa-1937-95ef-8079-a30d4914fda8" inline-header="false" obligation="normative">
<title id="_e1409899-0f1c-e04f-426c-17a68f72f64c">Namespace Registration</title>
<p id="_3adf50cd-46f1-7620-8824-570dc4a3573a">Registration request for the push namespace:</p>

<dl id="_29364cc9-f844-eb6c-404e-87445b926712"><dt>URI:</dt>
<dd id="_b027ee3d-da25-2d79-d283-29f94e783fb3"><p id="_07a0ca4c-0212-3381-3786-ae450f97d3e5">urn:ietf:params:xml:ns:dav-push</p>
</dd>
<dt>Registrant Contact:</dt>
<dd id="_9dc36bf8-b0a3-1fff-4815-6798b8e2d332"><p id="_f67fd09a-33f4-4820-3287-f484301447a8">The IESG &lt;<link target="mailto:iesg@ietf.org"/>&gt;</p>
</dd>
<dt>XML:</dt>
<dd id="_2922161e-cb34-affe-3a6a-0ad898f0d132"><p id="_1a0e8d90-03dd-7692-41fa-f6163cd23061">None - not applicable for namespace registrations.</p>
</dd>
</dl>
</clause>
</clause>




</sections><bibliography><references id="_da3db9d8-4d02-87bb-0fb0-b25c5e8b01de" normative="true" obligation="informative">
<title id="_32b836db-96fe-5ec3-628c-c67d6db6b81e">Normative References</title>
<bibitem id="_8cd3eb3e-f7fe-ccd6-02f2-7e85bb24ac5b" type="standard" schema-version="v1.5.6" anchor="RFC2119">
  <fetched>2026-05-11</fetched>
  
<title type="main">Key words for use in RFCs to Indicate Requirement Levels</title>

  <uri type="src">https://www.rfc-editor.org/info/rfc2119</uri>
  <docidentifier type="IETF" primary="true">RFC 2119</docidentifier>
  <docidentifier type="DOI">10.17487/RFC2119</docidentifier>
  <docnumber>RFC2119</docnumber>
  <date type="published">
    <on>1997-03</on>
  </date>
  <contributor>
    <role type="author"/>
    <person>
      
<name>                    <formatted-initials language="en" script="Latn">S.</formatted-initials>          <surname language="en" script="Latn">Bradner</surname>          <completename language="en" script="Latn">S. Bradner</completename>       </name>

    </person>
  </contributor>
  <contributor>
    <role type="publisher"/>
    <organization>
      
<name language="en">RFC Publisher</name>

    </organization>
  </contributor>
  <contributor>
    <role type="authorizer"/>
    <organization>
      
<name language="en">RFC Series</name>

    </organization>
  </contributor>
  <language>en</language>
  <script>Latn</script>
  <abstract language="en" script="Latn">
    <p id="_92d80742-2184-c402-5724-376a568f58ca">In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized.  This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</p>

  </abstract>
  <status>
    <stage>BEST CURRENT PRACTICE</stage>
  </status>
  <series>
    
<title>BCP</title>

    <number>14</number>
  </series>
  <series>
    
<title>RFC</title>

    <number>2119</number>
  </series>
  <series type="stream">
    
<title>IETF</title>

  </series>
  <keyword>
    <vocab>Standards</vocab>
  </keyword>
  <keyword>
    <vocab>Track</vocab>
  </keyword>
  <keyword>
    <vocab>Documents</vocab>
  </keyword>
</bibitem>
<bibitem id="_4bbbbd0c-7ebc-c5f7-bc40-b779c4295b28" type="standard" schema-version="v1.5.6" anchor="RFC3339">
  <fetched>2026-05-11</fetched>
  
<title type="main">Date and Time on the Internet: Timestamps</title>

  <uri type="src">https://www.rfc-editor.org/info/rfc3339</uri>
  <docidentifier type="IETF" primary="true">RFC 3339</docidentifier>
  <docidentifier type="DOI">10.17487/RFC3339</docidentifier>
  <docnumber>RFC3339</docnumber>
  <date type="published">
    <on>2002-07</on>
  </date>
  <contributor>
    <role type="author"/>
    <person>
      
<name>                    <formatted-initials language="en" script="Latn">G.</formatted-initials>          <surname language="en" script="Latn">Klyne</surname>          <completename language="en" script="Latn">G. Klyne</completename>       </name>

    </person>
  </contributor>
  <contributor>
    <role type="author"/>
    <person>
      
<name>                    <formatted-initials language="en" script="Latn">C.</formatted-initials>          <surname language="en" script="Latn">Newman</surname>          <completename language="en" script="Latn">C. Newman</completename>       </name>

    </person>
  </contributor>
  <contributor>
    <role type="publisher"/>
    <organization>
      
<name language="en">RFC Publisher</name>

    </organization>
  </contributor>
  <contributor>
    <role type="authorizer"/>
    <organization>
      
<name language="en">RFC Series</name>

    </organization>
  </contributor>
  <contributor>
    <role type="author">
      <description>committee</description>
    </role>
    <organization>
      
<name language="en">Internet Engineering Task Force</name>

      <subdivision type="workgroup">
        
<name>Instant Messaging and Presence Protocol</name>

        <identifier>impp</identifier>
      </subdivision>
      <abbreviation language="en">IETF</abbreviation>
    </organization>
  </contributor>
  <language>en</language>
  <script>Latn</script>
  <abstract language="en" script="Latn">
    <p id="_3e7be73b-d57d-d32f-c7e6-3edf5d1f2eb4">This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</p>

  </abstract>
  <status>
    <stage>PROPOSED STANDARD</stage>
  </status>
  <series>
    
<title>RFC</title>

    <number>3339</number>
  </series>
  <series type="stream">
    
<title>IETF</title>

  </series>
  <keyword>
    <vocab>Timestamps</vocab>
  </keyword>
  <keyword>
    <vocab>gregorian calendar</vocab>
  </keyword>
  <keyword>
    <vocab>iso</vocab>
  </keyword>
  <keyword>
    <vocab>International Organization for Standardization</vocab>
  </keyword>
</bibitem>
<bibitem id="_48bbf740-80d4-996b-6a04-4745ff02e747" type="standard" schema-version="v1.5.6" anchor="RFC3688">
  <fetched>2026-05-11</fetched>
  
<title type="main">The IETF XML Registry</title>

  <uri type="src">https://www.rfc-editor.org/info/rfc3688</uri>
  <docidentifier type="IETF" primary="true">RFC 3688</docidentifier>
  <docidentifier type="DOI">10.17487/RFC3688</docidentifier>
  <docnumber>RFC3688</docnumber>
  <date type="published">
    <on>2004-01</on>
  </date>
  <contributor>
    <role type="author"/>
    <person>
      
<name>                    <formatted-initials language="en" script="Latn">M.</formatted-initials>          <surname language="en" script="Latn">Mealling</surname>          <completename language="en" script="Latn">M. Mealling</completename>       </name>

    </person>
  </contributor>
  <contributor>
    <role type="publisher"/>
    <organization>
      
<name language="en">RFC Publisher</name>

    </organization>
  </contributor>
  <contributor>
    <role type="authorizer"/>
    <organization>
      
<name language="en">RFC Series</name>

    </organization>
  </contributor>
  <language>en</language>
  <script>Latn</script>
  <abstract language="en" script="Latn">
    <p id="_89547991-c4ee-3dab-f775-46e293d97e67">This document describes an IANA maintained registry for IETF standards which use Extensible Markup Language (XML) related items such as Namespaces, Document Type Declarations (DTDs), Schemas, and Resource Description Framework (RDF) Schemas.</p>

  </abstract>
  <status>
    <stage>BEST CURRENT PRACTICE</stage>
  </status>
  <series>
    
<title>BCP</title>

    <number>81</number>
  </series>
  <series>
    
<title>RFC</title>

    <number>3688</number>
  </series>
  <series type="stream">
    
<title>IETF</title>

  </series>
  <keyword>
    <vocab>XML</vocab>
  </keyword>
  <keyword>
    <vocab>extensible markup language</vocab>
  </keyword>
</bibitem>
<bibitem id="_2f66d2bf-01ea-f50b-db85-d052d3244ee4" type="standard" schema-version="v1.5.6" anchor="RFC3986">
  <fetched>2026-05-11</fetched>
  
<title type="main">Uniform Resource Identifier (URI): Generic Syntax</title>

  <uri type="src">https://www.rfc-editor.org/info/rfc3986</uri>
  <docidentifier type="IETF" primary="true">RFC 3986</docidentifier>
  <docidentifier type="DOI">10.17487/RFC3986</docidentifier>
  <docnumber>RFC3986</docnumber>
  <date type="published">
    <on>2005-01</on>
  </date>
  <contributor>
    <role type="author"/>
    <person>
      
<name>                    <formatted-initials language="en" script="Latn">T.</formatted-initials>          <surname language="en" script="Latn">Berners-Lee</surname>          <completename language="en" script="Latn">T. Berners-Lee</completename>       </name>

    </person>
  </contributor>
  <contributor>
    <role type="author"/>
    <person>
      
<name>                    <formatted-initials language="en" script="Latn">R.</formatted-initials>          <surname language="en" script="Latn">Fielding</surname>          <completename language="en" script="Latn">R. Fielding</completename>       </name>

    </person>
  </contributor>
  <contributor>
    <role type="author"/>
    <person>
      
<name>                    <formatted-initials language="en" script="Latn">L.</formatted-initials>          <surname language="en" script="Latn">Masinter</surname>          <completename language="en" script="Latn">L. Masinter</completename>       </name>

    </person>
  </contributor>
  <contributor>
    <role type="publisher"/>
    <organization>
      
<name language="en">RFC Publisher</name>

    </organization>
  </contributor>
  <contributor>
    <role type="authorizer"/>
    <organization>
      
<name language="en">RFC Series</name>

    </organization>
  </contributor>
  <language>en</language>
  <script>Latn</script>
  <abstract language="en" script="Latn">
    <p id="_56ca9f42-d9cf-6e03-3373-4b3fabd25995">A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource.  This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet.  The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier.  This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</p>

  </abstract>
  <status>
    <stage>INTERNET STANDARD</stage>
  </status>
  <relation type="updates">
    <bibitem>
      <formattedref>RFC1738</formattedref>
      <docidentifier type="IETF" primary="true">RFC1738</docidentifier>
    </bibitem>

  </relation>
  <series>
    
<title>STD</title>

    <number>66</number>
  </series>
  <series>
    
<title>RFC</title>

    <number>3986</number>
  </series>
  <series type="stream">
    
<title>IETF</title>

  </series>
  <keyword>
    <vocab>Internet protocol</vocab>
  </keyword>
  <keyword>
    <vocab>IP</vocab>
  </keyword>
  <keyword>
    <vocab>uniform resource identifier</vocab>
  </keyword>
  <keyword>
    <vocab>URI</vocab>
  </keyword>
  <keyword>
    <vocab>www</vocab>
  </keyword>
  <keyword>
    <vocab>world wide web</vocab>
  </keyword>
</bibitem>
<bibitem id="_9d4a6459-ecfd-07f4-4c68-e2da1c73edd0" type="standard" schema-version="v1.5.6" anchor="RFC7230">
  <fetched>2026-05-11</fetched>
  
<title type="main">Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>

  <uri type="src">https://www.rfc-editor.org/info/rfc7230</uri>
  <docidentifier type="IETF" primary="true">RFC 7230</docidentifier>
  <docidentifier type="DOI">10.17487/RFC7230</docidentifier>
  <docnumber>RFC7230</docnumber>
  <date type="published">
    <on>2014-06</on>
  </date>
  <contributor>
    <role type="editor"/>
    <person>
      
<name>                    <formatted-initials language="en" script="Latn">R.</formatted-initials>          <surname language="en" script="Latn">Fielding</surname>          <completename language="en" script="Latn">R. Fielding</completename>       </name>

    </person>
  </contributor>
  <contributor>
    <role type="editor"/>
    <person>
      
<name>                    <formatted-initials language="en" script="Latn">J.</formatted-initials>          <surname language="en" script="Latn">Reschke</surname>          <completename language="en" script="Latn">J. Reschke</completename>       </name>

    </person>
  </contributor>
  <contributor>
    <role type="publisher"/>
    <organization>
      
<name language="en">RFC Publisher</name>

    </organization>
  </contributor>
  <contributor>
    <role type="authorizer"/>
    <organization>
      
<name language="en">RFC Series</name>

    </organization>
  </contributor>
  <contributor>
    <role type="author">
      <description>committee</description>
    </role>
    <organization>
      
<name language="en">Internet Engineering Task Force</name>

      <subdivision type="workgroup">
        
<name>HTTP</name>

        <identifier>httpbis</identifier>
      </subdivision>
      <abbreviation language="en">IETF</abbreviation>
    </organization>
  </contributor>
  <language>en</language>
  <script>Latn</script>
  <abstract language="en" script="Latn">
    <p id="_d188db24-8362-5be6-ee77-abbda15e3e96">The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</p>

  </abstract>
  <status>
    <stage>PROPOSED STANDARD</stage>
  </status>
  <relation type="updates">
    <bibitem>
      <formattedref>RFC2817</formattedref>
      <docidentifier type="IETF" primary="true">RFC2817</docidentifier>
    </bibitem>

  </relation>
  <relation type="updates">
    <bibitem>
      <formattedref>RFC2818</formattedref>
      <docidentifier type="IETF" primary="true">RFC2818</docidentifier>
    </bibitem>

  </relation>
  <relation type="obsoletedBy">
    <bibitem>
      <formattedref>RFC9110</formattedref>
      <docidentifier type="IETF" primary="true">RFC9110</docidentifier>
    </bibitem>

  </relation>
  <relation type="obsoletedBy">
    <bibitem>
      <formattedref>RFC9112</formattedref>
      <docidentifier type="IETF" primary="true">RFC9112</docidentifier>
    </bibitem>

  </relation>
  <series>
    
<title>RFC</title>

    <number>7230</number>
  </series>
  <series type="stream">
    
<title>IETF</title>

  </series>
  <keyword>
    <vocab>Hyptertext Transfer Protocol</vocab>
  </keyword>
  <keyword>
    <vocab>HTTP</vocab>
  </keyword>
  <keyword>
    <vocab>HTTP message format</vocab>
  </keyword>
</bibitem>
</references><references id="_a9af303f-61ad-9eac-52a3-37e18629430c" normative="false" obligation="informative">
<title id="_d78142cf-fee4-7aa4-bf03-fef36ffffd4a">Informative References</title>
</references></bibliography>
</metanorma>
