Async OpenID discovery in Mojo

While still working on my async OpenID implementation Protocol::OpenID that can be found at http://github.com/vti/protocol-openid I was refactoring discovery part and tried to test it on live examples. Thanks to Mojo::Client, that now has async interface, the code looks very clean.

#!/usr/bin/perl

use strict;
use warnings;

use Protocol::OpenID::Identifier;
use Protocol::OpenID::Discoverer;

use Mojo::Client;
use Mojo::Transaction::Single;

my $client = Mojo::Client->new(max_redirects => 3);

my $discoverer = Protocol::OpenID::Discoverer->new(
    http_req_cb => sub {
        my ($url, $method, $headers, $body, $cb) = @_;

        $client->get(
            $url => $headers => sub {
                my ($self, $tx) = @_;

                my $res = $tx->res;

                $cb->(
                    $tx->req->url->to_string, $res->code,
                    $res->headers->to_hash,   $res->body
                );
            }
        )->process;
    }
);

my $identifier = Protocol::OpenID::Identifier->new(shift @ARGV);

$discoverer->discover(
    $identifier => sub {
        my ($self, $discovery) = @_;

        if ($discovery) {
            use Data::Dumper;
            warn Dumper $discovery;
        }
        else {
            warn 'Error: ' . $self->error;
        }
    }
);

Important thing to remember is that $client should be created outside of closures.

Comments

blog comments powered by Disqus