/usr/local/CPAN/Net-Amazon-MechanicalTurk/Net/Amazon/MechanicalTurk/Transport/RESTTransport.pm


package Net::Amazon::MechanicalTurk::Transport::RESTTransport;
use strict;
use warnings;
use Net::Amazon::MechanicalTurk;
use Net::Amazon::MechanicalTurk::BaseObject;
use Net::Amazon::MechanicalTurk::Transport;
use Net::Amazon::MechanicalTurk::DataStructure;
use LWP::UserAgent;

our $VERSION = '1.00';

our @ISA = qw{ Net::Amazon::MechanicalTurk::Transport };

Net::Amazon::MechanicalTurk::Transport::RESTTransport->attributes(qw{
    userAgent
});

sub init {
    my $self = shift;
    $self->setAttributes(@_);
    my $softwareName = "MTurkPerlSDK/" . $Net::Amazon::MechanicalTurk::VERSION;
    if (!defined($self->userAgent)) {
        $self->userAgent(LWP::UserAgent->new);
        $self->userAgent->agent(
            $softwareName .
            " " .
            $self->userAgent->_agent
        );
    }
    $self->userAgent->default_headers->push_header(
        'X-Amazon-Software' => $softwareName
    );
}

sub call {
    my ($self, $client, $operation, $params) = @_;
    
    my $httpParams = Net::Amazon::MechanicalTurk::DataStructure->toProperties($params);

    if ($self->debug) {
        $self->debugMessage("Calling url " . $client->serviceUrl . " with parameters:");
        foreach my $key (sort keys %$httpParams) {
            $self->debugMessage("    [$key] = [$httpParams->{$key}]");
        }
    }

    my $response = $self->userAgent->post($client->serviceUrl, $httpParams); 

    if ($self->debug) {
        $self->debugMessage("HTTP Response " . $response->status_line);
        $self->debugMessage($response->headers->as_string);
        $self->debugMessage("HTTP Content:");
        $self->debugMessage($response->content);
    }

    if (!$response->is_success) {
        # ServiceUnavailable errors have an XML response and come back as a 503.
        if ($response->code eq "503" and $response->content =~ /<\s*Errors\s*>/s) {
            return $response->content;
        }
        die "HTTP Error calling $operation - " . $response->status_line;
    }

    return $response->content;
}

return 1;