Saturday, February 13, 2010

Curl-ing up with WebFinger and PubSubHubub

This morning I've been playing around with WebFinger and PubSubHubub. One of the great things about open web APIs is that you can tinker around with them without even writing an application. Just use curl!

Let's start with WebFinger. First, we need to figure out how to get my WebFinger data from gmail. There's standard place to look for that explanation, given a domain name:
So for gmail we get the explanation of how to get my WebFinger data like so:
$ curl
Out pops an XRD doc that contains a URI template (in bold, below):
<?xml version='1.0' encoding='UTF-8'?>
<!-- NOTE: this host-meta end-point is a pre-alpha work in progress.   Don't rely on it. -->
<!-- Please follow the list at -->
<XRD xmlns='' 
  <hm:Host xmlns=''></hm:Host>
  <Link rel='lrdd' 
    <Title>Resource Descriptor</Title>
Substitute my email address for {uri} and curl it:
$ curl
That spits out another XRD that describes some other resources associated with my email address:
<?xml version='1.0'?>
<XRD xmlns=''>
 <Link rel=''
 <Link rel='' 
href='' type='text/html'/>
 <Link rel='' 
href='' type='text/html'/>
 <Link rel='' 
href='' type='text/html'/>
 <Link rel='' 
 <Link rel='describedby' 
href='' type='text/html'/>
 <Link rel='describedby' 
 <Link rel='' 
Bolded above is the rel='' URI for my public status updates. Let's fetch that:
$ curl
<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='' 
<link rel='self' type='application/atom+xml'
<link rel='hub' href=''/>
<!-- lots more feed data not relevant to this discussion -->
It's a standard Atom feed. Amongst a lot of other stuff in the beginning is a rel="hub" link. This is where PubSubHubub comes in. Suppose that I want some other service to be notified whenever I post a status update (for instance, I have an app that reposts it in the sidebar of my blog). I could poll this Atom feed but polling is pretty janky. With PuSH I can register a callback to be notified whenever I post an update. Since this feed has a rel="hub" link set to, that's where I go to do register a callback.

If you just navigate to with your browser you get a form you can fill out to create a subscription. One of the fields is for a "Callback" url. I don't run any websites that know how to handle PuSH callbacks (or subscription confirmation, for that matter). Luckily there is a test subscriber on appspot that accepts subscription requests for anything: To create your own callback URL for testing, just add /subscriber.{some_unique_identifier} to the end of it.

According to the PuSH spec, I should POST some form fields to the hub URL like so:
$ curl -v \
-d hub.callback=\&\
And that creates the subscription. Here's the verbose output:
* About to connect() to port 80 (#0)
*   Trying connected
* Connected to ( port 80 (#0)
> POST /subscribe HTTP/1.1
> User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
> Host:
> Accept: */*
> Content-Length: 219
> Content-Type: application/x-www-form-urlencoded
< HTTP/1.1 204 No Content
< Cache-Control: no-cache
< Content-Type: text/plain
< Expires: Fri, 01 Jan 1990 00:00:00 GMT
< Date: Sat, 13 Feb 2010 17:41:29 GMT
< Server: Google Frontend
< Content-Length: 0
< X-XSS-Protection: 0
* Connection #0 to host left intact
* Closing connection #0

The 204 No Content response indicates the subscription was created and is active, according to the spec.

And if you go to right now (Saturday morning, October 13th 2009), you'll indeed see a bunch of my posts on it.

Ta Da. No code. Just curl. I love the internet.


  1. This was an extremely helpful post. Thanks!

  2. Thank you a lot for providing individuals with a very spectacular possibility to read critical reviews from this site.
    java training in bangalore java training in bangalore


  3. Thanks for sharing this informative article..!!
    Keep posting waiting for next post

    Java Training in Bangalore
    iOS Training in Bangalore

  4. Thanks a lot for sharing this useful information. Towelroot