- From: <joshco@gmail.com>
- Date: Mon, 12 Aug 2024 13:49:40 -0400
- To: <ietf-http-wg@w3.org>
- Message-ID: <002c01daece0$02028540$06078fc0$@gmail.com>
Hi Folks, (apologies for the HTML email) I've put together a comparison of the different HTTP pub/sub proposals. I've focused on 4 categories. These are likely discussion points for the group, should we take on the mission of converging on a standard for PubSub. We can do it! By adding new semantic features, which web devs and end users desire, we may also create pull that helps drive upgrades to middleboxes interfering with h2/h3. What do people think? Categories Subscription Setup The methods use to set up a subscription Event Channel How events are delivered to the subscriber Event Payload What the content of the events are. Discovery Discovery of PubSub features After the comparison, I've included examples from the relevant specifications. The proposals Mark Nottingham's aka MNOT https://www.mnot.net/blog/2022/02/20/websockets Braid aka BRAID https://datatracker.ietf.org/doc/html/draft-toomim-httpbis-braid-http Braid Multiresponse idea: https://datatracker.ietf.org/doc/html/draft-toomim-httpbis-versions#section- 2.4.4 Rahul Gupta's aka PREP https://www.ietf.org/archive/id/draft-gupta-httpbis-per-resource-events-01.h tml GENA <https://datatracker.ietf.org/doc/html/draft-cohen-gena-p-base-01> https://datatracker.ietf.org/doc/html/draft-cohen-gena-p-base-01 and <https://datatracker.ietf.org/doc/html/draft-cohen-gena-client-00> https://datatracker.ietf.org/doc/html/draft-cohen-gena-client-00 Subscription Setup MNOT uses a new method SUB BRAID uses GET with a Subscribe: HTTP header PREP uses GET with an Accept-Events: HTTP header GENA uses new method SUBSCRIBE Event channel MNOT uses return path, with 1xx PUB response codes BRAID uses return path with a 209 Subscription response code BRAID Multiresponse uses a return path with a 209 Multiresponse code PREP uses return path with multipart MIME GENA has a POLL and NOTIFY method. The client can use the POLL method to ask for available events. Symmetric HTTP - When the client SUBSCRIBE includes a Call-Back: HTTP header, the server can use the NOTIFY method to deliver asynchronous events to the client. This assumes that the client is also running an HTTP server, for symmetric HTTP. In 1999, this was only feasible within intranets or sans-firewall setups. However, with h2/h3 this may be feasible. Event payload MNOT carries event data in the http headers. 1xx responses prohibit bodies. BRAID contains the content of the resource at a specific version, or a patch from a previous version PREP includes the current state of the resource and information about the HTTP requests that changed the resource state including HTTP method, timestamp, Etag, Event-ID GENA body is optional, and unspecified type Discovery MNOT can use OPTIONS BRAID is Star Trek VI: The Undiscovered Country PREP uses HEAD and checks for Accept-Events: HTTP header GENA can use OPTIONS Examples MNOT Subscription SUB /foo/stream HTTP/2 Host: example.com HTTP/2 105 PUB Date: Sun, 20 Feb 2022 04:36:53 GMT My-App-Data: 54 Last-Event-ID: 1 HTTP/2 105 PUB Date: Sun, 20 Feb 2022 04:37:05 GMT My-App-Data: 42 Last-Event-ID: 2 HTTP/2 105 PUB Date: Sun, 20 Feb 2022 04:38:31 GMT My-App-Data: 36 Last-Event-ID: 3 Discovery OPTIONS /foo/stream HTTP/2 HTTP/2 200 OK Allow: SUB BRAID Subscription GET /chat Subscribe: true HTTP/1.1 209 Subscription Subscribe: true Version: "ej4lhb9z78" Parents: "oakwn5b8qh", "uc9zwhw7mf" Content-Type: application/json Merge-Type: sync9 Content-Length: 64 [{"text": "Hi, everyone!", "author": {"link": "/user/tommy"}}] Version: "g09ur8z74r" Parents: "ej4lhb9z78" Content-Type: application/json Merge-Type: sync9 Patches: 1 Content-Length: 53 Content-Range: json .messages[1:1] [{"text": "Yo!", "author": {"link": "/user/yobot"}] BRAID (Multiresponse <https://datatracker.ietf.org/doc/html/draft-toomim-httpbis-versions#section -2.4.4> ) GET /chat Subscribe: true HTTP/1.1 209 Multiresponse Subscribe: true HTTP/1.1 200 OK Version: "2" Parents: "1a", "1b" Content-Type: application/json Content-Length: 64 [{"text": "Hi, everyone!", "author": {"link": "/user/tommy"}}] HTTP/1.1 200 OK Version: "3" Parents: "2" Content-Type: application/json Merge-Type: sync9 Content-Length: 117 [{"text": "Hi, everyone!", "author": {"link": "/user/tommy"}} {"text": "Yo!", "author": {"link": "/user/yobot"}] PREP GET /foo HTTP/1.1 Host: example.org Accept-Events: "prep" HTTP/1.1 200 OK Last-Modified: Sat, 1 April 2023 10:11:12 GMT Transfer-Encoding: chunked ETag: 1234abcd Events: protocol="prep", status=200 Vary: Accept-Events Accept-Events: "prep"; accept="message/rfc822" Content-Type: multipart/mixed; boundary="MAIN-SEPARATOR" --MAIN SEPARATOR Content-Type: text/plain Hello World! --MAIN-SEPARATOR Content-Type: multipart/digest; boundary="MESSAGE-SEPARATOR" --MESSAGE-SEPARATOR Method: PUT Date: Sat, 1 April 2023 10:11:12 GMT Event-ID: 456 E-tag: 6789wxyz --MESSAGE-SEPARATOR Method: DELETE Date: Sat, 1 April 2023 10:11:12 GMT Event-ID: 789 --MESSAGE-SEPARATOR-- --MAIN-SEPARATOR-- Discovery HEAD /foo HTTP/1.1 Host: example.org HTTP/1.1 200 OK Accept: text/html Accept-Events: "prep"; accept="message/rfc822" GENA Subscribe SUBSCRIBE URI HTTP/1.1 Notification-Type: CoreNotificationType Call-back: cbURI [ URI ] Delivery-control: poll-interval = seconds Subscription-Lifetime: 900 Notification-Version: 1.0 HTTP/1.1 200 Subscribed Notification-Version: 1.0 Call-back: [ accepted callback URIs] Delivery-control: poll-interval = acc Subscription-Lifetime: 900 Subscription-ID: FFFFF Asynchronous NOTIFY NOTIFY cbURI HTTP/1.1 Subscription-ID: FFFF (optional) Notification-Type: UPDATE Notification-Version: 1.0 Content-Type: Synchronous POLL POLL URI HTTP/1.1 Subscription-ID: FFFF Delivery-control: Wait-time=20 HTTP/1.1 200 Notification Subscription-ID: FFFF Notification-Type: UPDATE Discovery OPTIONS URI HTTP/1.1 HTTP/1.1 200 OK Allow: SUBSCRIBE, POLL, NOTIFY
Received on Monday, 12 August 2024 17:49:47 UTC