package Catalyst::View::Component::SubInclude::HTTP; use Moose; use namespace::clean -except => 'meta'; use Moose::Util::TypeConstraints; use LWP::UserAgent; use List::MoreUtils 'firstval'; use URI; our $VERSION = '0.01'; $VERSION = eval $VERSION; has http_method => ( isa => 'Str', is => 'ro', default => 'GET', ); has ua_timeout => ( isa => 'Int', is => 'ro', default => 10, ); has base_url => ( isa => 'Str', is => 'ro', required => 0, ); has uri_map => ( isa => 'HashRef', is => 'ro', required => 0, ); has user_agent => ( isa => duck_type([qw/get post/]), is => 'ro', lazy => 1, builder => '_build_user_agent', ); sub _build_user_agent { my $self = shift; return LWP::UserAgent->new( agent => ref($self), timeout => $self->ua_timeout, ); } sub generate_subinclude { my ($self, $c, $path, $args) = @_; my $error_msg_prefix = "SubInclude for $path failed: "; my $base_url = $self->base_url || $c->req->base; my $uri_map = $self->uri_map || { q{/} => $base_url }; $base_url = $uri_map->{ firstval { $path =~ s/^$_// } keys %$uri_map }; $base_url =~ s{/$}{}; my $uri = URI->new(join(q{/}, $base_url, $path)); my $req_method = q{_} . lc $self->http_method . '_request'; my $response; if ( $self->can($req_method) ) { $response = $self->$req_method($uri, $args); } else { confess $self->http_method . ' not supported'; } if ($response->is_success) { return $response->content; } else { $c->log->info($error_msg_prefix . $response->status_line); return undef; } } sub _get_request { my ( $self, $uri, $args) = @_; $uri->query_form($args); return $self->user_agent->get($uri); } sub _post_request { my ( $self, $uri, $args ) = @_; return $self->user_agent->post($uri, $args); } __PACKAGE__->meta->make_immutable; 1; __END__ =head1 NAME Catalyst::View::Component::SubInclude::HTTP - HTTP plugin for C::V::Component::SubInclude =head1 SYNOPSIS In your view class: package MyApp::View::TT; use Moose; extends 'Catalyst::View::TT'; with 'Catalyst::View::Component::SubInclude'; __PACKAGE__->config( subinclude_plugin => 'HTTP::GET', subinclude => { 'HTTP::GET' => { class => 'HTTP', http_method => 'GET', ua_timeout => '10', uri_map => { '/my/' => 'http://localhost:5000/', }, }, 'HTTP::POST' => { class => 'HTTP', http_method => 'POST', ua_timeout => '10', uri_map => { '/foo/' => 'http://www.foo.com/', }, }, }, ); Then, somewhere in your templates: [% subinclude('/my/widget') %] ... [% subinclude_using('HTTP::POST', '/foo/path', { foo => 1 }) %] =head1 DESCRIPTION C does HTTP requests (currently using L) and uses the responses to render subinclude contents. =head1 CONFIGURATION The configuration is passed in the C key based on your plugin name which can be arbitrary. =over =item class Required just in case your plugin name differs from C. =item http_method Accepts C and C as values. The default one is C. =item user_agent This lazily builds a L obj, however you can pass a different user agent obj that implements the required API. =item ua_timeout User Agent's timeout config param. Defaults to 10 seconds. =item uri_map This expects a HashRef in order to map paths to different URLs. =item base_url Used only if C is C and defaults to C<< $c->request->base >>. =back =head1 METHODS =head2 C Note that C<$path> should be the relative path. =head1 SEE ALSO L =head1 AUTHOR Wallace Reis C<< >> =head1 SPONSORSHIP Development sponsored by Ionzero LLC L. =head1 COPYRIGHT & LICENSE Copyright (c) 2010 Wallace Reis. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut