Akamai-Open-Client

 view release on metacpan or  search on metacpan

MANIFEST  view on Meta::CPAN

META.yml
Makefile.PL
README
README.md
dist.ini
lib/Akamai/Open/Client.pm
lib/Akamai/Open/Debug.pm
lib/Akamai/Open/Request.pm
lib/Akamai/Open/Request/EdgeGridV1.pm
t/0001-client.t
t/0002-debug.t
t/0004-request.t
t/0005-edgegridv1.t
t/0006-signedrequest.t
t/0007-signedrequest-extended.t
t/release-no-tabs.t
t/release-pod-syntax.t
t/testdata.json

lib/Akamai/Open/Client.pm  view on Meta::CPAN

  $Akamai::Open::Client::AUTHORITY = 'cpan:PROBST';
}
# ABSTRACT: The Akamai Open API Perl client structure for authentication data
$Akamai::Open::Client::VERSION = '0.03';
use strict;
use warnings;

use Moose;
use Akamai::Open::Debug;

has 'debug'         => (is => 'rw', default => sub{ return(Akamai::Open::Debug->instance());});
has 'client_secret' => (is => 'rw', isa => 'Str', trigger => \&Akamai::Open::Debug::debugger);
has 'client_token'  => (is => 'rw', isa => 'Str', trigger => \&Akamai::Open::Debug::debugger);
has 'access_token'  => (is => 'rw', isa => 'Str', trigger => \&Akamai::Open::Debug::debugger);

1;

__END__

=pod

=encoding utf-8

=head1 NAME

lib/Akamai/Open/Debug.pm  view on Meta::CPAN

    return;
}

sub dump_obj {
    my $self = shift;
    my $ref = shift;
    $self->logger->info('Dumping object: ', Dumper($ref));
    return;
}

sub debugger {
    my $self = shift;
    my $new = shift;
    my $prev = shift;
    my $sub = (caller(1))[3];
    $self->debug->logger->debug(sprintf('setting %s to %s (%s before)', $sub, $new, $prev ? $prev : 'undef'));
    return;
}

1;

__END__

=pod

=encoding utf-8

lib/Akamai/Open/Debug.pm  view on Meta::CPAN

 use Akamai::Open::Client;
 
 my $log_conf = q/
     log4perl.category.Akamai.Open.Debug   = DEBUG, Screen
     log4perl.appender.Screen              = Log::Log4perl::Appender::Screen
     log4perl.appender.Screen.stderr       = 1
     log4perl.appender.Screen.layout       = Log::Log4perl::Layout::PatternLayout
     log4perl.appender.Screen.layout.ConversionPattern = %p - %C - %m%n
 /;
 
 my $debug = Akamai::Open::Debug->initialize(config => $log_conf);
 my $client = Akamai::Open::Client->new(debug => $debug);

I<Akamai::Open::Debug> uses L<Log::Log4perl|http://search.cpan.org/perldoc?Log::Log4perl> for logging purposes and thus is 
very flexible and easy configurable.

=head1 ABOUT

I<Akamai::Open::Debug> provides the debugging and logging functionality 
for the I<Akamai::Open> API client and uses uses L<MooseX::Singleton|http://search.cpan.org/perldoc?MooseX::Singleton> 
to provide a single instance based logging solution.

=head1 USAGE

If you want to configure your own logging, just initialize your 
L<Akamai::Open> API client, with an I<Akamai::Open::Debug> object. 
To do this, instantiate an object with your own I<Log::Log4perl> 
configuration (see I<Log::Log4perl> for example configurations):

 my $debug = Akamai::Open::Debug->initialize(config => $log_conf);

The only thing you've to consider is, that the I<Log::Log4perl> category 
has to be named I<log4perl.category.Akamai.Open.Debug>, as written in 
the example.

After that you can pass your object to your client:

 my $client = Akamai::Open::Client->new(debug => $debug);

=head1 AUTHOR

Martin Probst <internet+cpan@megamaddin.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Martin Probst.

This is free software; you can redistribute it and/or modify it under

lib/Akamai/Open/Request.pm  view on Meta::CPAN


use Moose;
use Data::UUID;
use POSIX qw(strftime);
use HTTP::Request;
use LWP::UserAgent;
use Akamai::Open::Debug;

use constant USER_AGENT => "Akamai::Open::Client/Perl-$^V";

has 'debug'     => (is => 'rw', default => sub{ return(Akamai::Open::Debug->instance());});
has 'nonce'     => (is => 'rw', isa => 'Str', default => \&gen_uuid, trigger => \&Akamai::Open::Debug::debugger);
has 'timestamp' => (is => 'rw', isa => 'Str', default => \&gen_timestamp, trigger => \&Akamai::Open::Debug::debugger);
has 'request'   => (is => 'rw', default => sub{return(HTTP::Request->new());});
has 'response'  => (is => 'rw', trigger => \&Akamai::Open::Debug::debugger);
has 'user_agent'=> (is => 'rw', default => sub {
                                                 my $agent = LWP::UserAgent->new();
                                                 $agent->timeout(600);
                                                 $agent->agent(USER_AGENT);
                                                 return($agent);
                                               });

sub gen_timestamp {
    return(strftime('%Y%m%dT%H:%M:%S%z', gmtime()));
}

lib/Akamai/Open/Request/EdgeGridV1.pm  view on Meta::CPAN

    HEADER_NAME     => 'Authorization',
    CLIENT_TOKEN    => 'client_token=',
    ACCESS_TOKEN    => 'access_token=',
    TIMESTAMP_TOKEN => 'timestamp=',
    NONCE_TOKEN     => 'nonce=',
    SIGNATURE_TOKEN => 'signature='
};

extends 'Akamai::Open::Request';

has 'client'         => (is => 'rw', trigger => \&Akamai::Open::Debug::debugger);
has 'signed_headers' => (is => 'rw', trigger => \&Akamai::Open::Debug::debugger);
has 'signature'      => (is => 'rw', trigger => \&Akamai::Open::Debug::debugger);
has 'signing_key'    => (is => 'rw', isa => 'Str', trigger => \&Akamai::Open::Debug::debugger);

before 'sign_request' => sub {
    my $self = shift;
    my $tmp_key;
    $self->debug->logger->debug(sprintf('Calculating signing key from %s and %s', $self->timestamp(),$self->client->client_secret()));
    $tmp_key = encode_base64(hmac_sha256($self->timestamp(),$self->client->client_secret()));
    chomp($tmp_key);
    $self->signing_key($tmp_key);
    return;
};

after 'sign_request' => sub {
    my $self = shift;

    if(defined($self->signature)) {
        my $header_name = HEADER_NAME;
        my $auth_header = sprintf('%s %s', EDGEGRIDV1ALGO,
                                           join(';', CLIENT_TOKEN . $self->client->client_token(),
                                                     ACCESS_TOKEN . $self->client->access_token(),
                                                     TIMESTAMP_TOKEN . $self->timestamp(),
                                                     NONCE_TOKEN . $self->nonce(),
                                                     SIGNATURE_TOKEN . $self->signature()));

        $self->debug->logger->debug("Setting Authorization header to $auth_header");
        $self->request->header($header_name => $auth_header);
    }

    if(defined($self->signed_headers)) {
        my $headers = $self->signed_headers;
        $self->request->header($_ => $headers->{$_}) foreach(keys(%{$headers}));
    }
};


lib/Akamai/Open/Request/EdgeGridV1.pm  view on Meta::CPAN

    my $content_hash = $self->content_hash;
    # and the authorization header content
    my $auth_header  = sprintf('%s %s;', EDGEGRIDV1ALGO,
                                         join(';', CLIENT_TOKEN . $self->client->client_token,
                                                   ACCESS_TOKEN . $self->client->access_token,
                                                   TIMESTAMP_TOKEN . $self->timestamp,
                                                   NONCE_TOKEN . $self->nonce));
    # now create the token to sign
    my $token = join("\t", $http_method, $http_scheme, $http_host, $http_uri, $http_headers, $content_hash, $auth_header);

    $self->debug->logger->info("Signing token is $token");
    if($self->debug->logger->is_debug()) {
        my $dbg = $token;
        $dbg =~ s#\t#\\t#g;
        $self->debug->logger->debug("Quoted sigining token is $dbg");
    }

    # and sign the token
    $self->debug->logger->info(sprintf('signing with key %s', $self->signing_key()));
    my $tmp_stoken = encode_base64(hmac_sha256($token, $self->signing_key()));
    chomp($tmp_stoken);
    $self->signature($tmp_stoken);
    return;
}

sub content_hash {
    my $self = shift;
    my $content_hash = '';

t/0001-client.t  view on Meta::CPAN


BEGIN {
    use_ok('Akamai::Open::Client');
}
require_ok('Akamai::Open::Client');

# object tests
my $client = new_ok('Akamai::Open::Client');

# subobject tests
isa_ok($client->debug, 'Akamai::Open::Debug');

# functional tests
ok($client->access_token('foobar'),             'setting access_token');
ok($client->client_token('barfoo'),             'setting client_token');
ok($client->client_secret('Zm9vYmFyYmFyZm9v'),  'setting client_secret');

is($client->access_token, 'foobar',             'getting access_token');
is($client->client_token, 'barfoo',             'getting client_token');
is($client->client_secret, 'Zm9vYmFyYmFyZm9v',  'getting client_secret');
isa_ok($client->debug, 'Akamai::Open::Debug');

done_testing;

t/0002-debug.t  view on Meta::CPAN

require_ok('Akamai::Open::Debug');

my $log_conf = q/
            log4perl.category.Akamai.Open.Debug   = DEBUG, Screen
            log4perl.appender.Screen              = Log::Log4perl::Appender::Screen
            log4perl.appender.Screen.stderr       = 1
            log4perl.appender.Screen.layout       = Log::Log4perl::Layout::PatternLayout
            log4perl.appender.Screen.layout.ConversionPattern = %p %m
        /;

my $debug = Akamai::Open::Debug->initialize(config => $log_conf);
my $clone = Akamai::Open::Debug->instance();
my @array = (1, 2, 'a', 'b');

# object tests
isa_ok($debug,      'Akamai::Open::Debug');
isa_ok($clone,      'Akamai::Open::Debug');

# functional tests
is($debug, $clone,                  'test for a singleton object');
ok($debug->logger->debug('foo'),    'print a message of priority DEBUG');
ok($debug->logger->info('foo'),     'print a message of priority INFO');
ok($debug->logger->warn('foo'),     'print a message of priority WARN');
ok($debug->logger->error('foo'),    'print a message of priority ERROR');
ok($debug->logger->fatal('foo'),    'print a message of priority FATAL');

done_testing;

t/0004-request.t  view on Meta::CPAN

}
require_ok('Akamai::Open::Request');
require_ok('POSIX');

# object tests
my $req = new_ok('Akamai::Open::Request');

# subobjects tests
isa_ok($req->user_agent, 'LWP::UserAgent');
isa_ok($req->request, 'HTTP::Request');
isa_ok($req->debug, 'Akamai::Open::Debug');

# functional tests
like($req->nonce, qr/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/i,    'testing for a correct UUID');
is($req->gen_timestamp, strftime('%Y%m%dT%H:%M:%S%z', gmtime()),                               'testing for correct timestamp');

done_testing;

t/0005-edgegridv1.t  view on Meta::CPAN

    use_ok('Akamai::Open::Client');
}
require_ok('Akamai::Open::Request::EdgeGridV1');
require_ok('Akamai::Open::Client');

# object tests
my $client = new_ok('Akamai::Open::Client');
my $req    = new_ok('Akamai::Open::Request::EdgeGridV1');

# subobject tests
isa_ok($req->debug, 'Akamai::Open::Debug');

# functional tests
ok($req->client($client),    'setting client');

# functional tests

done_testing;

t/0006-signedrequest.t  view on Meta::CPAN

require_ok('Akamai::Open::Request::EdgeGridV1');
require_ok('Akamai::Open::Client');
require_ok('URI');

# object tests
my $client = new_ok('Akamai::Open::Client');
my $req    = new_ok('Akamai::Open::Request::EdgeGridV1');
my $uri    = new_ok('URI' => ['http://www.cpan.org/']);

# subobject tests
isa_ok($req->debug, 'Akamai::Open::Debug');

# functional tests
ok($client->access_token('foobar'),             'setting access_token');
ok($client->client_token('barfoo'),             'setting client_token');
ok($client->client_secret('Zm9vYmFyYmFyZm9v'),  'setting client_secret');
ok($req->client($client),    'setting client');


# create a signed header
# for the test we've some static vars

t/release-no-tabs.t  view on Meta::CPAN


use Test::More 0.88;
use Test::NoTabs;

my @files = (
    'lib/Akamai/Open/Client.pm',
    'lib/Akamai/Open/Debug.pm',
    'lib/Akamai/Open/Request.pm',
    'lib/Akamai/Open/Request/EdgeGridV1.pm',
    't/0001-client.t',
    't/0002-debug.t',
    't/0004-request.t',
    't/0005-edgegridv1.t',
    't/0006-signedrequest.t',
    't/0007-signedrequest-extended.t',
    't/release-no-tabs.t',
    't/release-pod-syntax.t',
    't/testdata.json'
);

notabs_ok($_) foreach @files;



( run in 1.138 second using v1.01-cache-2.11-cpan-49f99fa48dc )