Archived
1
0
Fork 0
This repository has been archived on 2021-10-08. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
ACU/ACU/API/Base.pm
2013-09-16 06:43:17 +02:00

237 lines
4.3 KiB
Perl

#! /usr/bin/env perl
package API::Base;
use v5.10.1;
use strict;
use warnings;
use HTTP::Request::Common qw(GET POST);
use LWP::UserAgent;
use XML::LibXML;
use XML::SAX::ParserFactory;
use constant API_URL => "https://noyce.acu.epita.fr/api/";
#use constant API_URL => "https://rasmus.acu.epita.fr/intra/api/";
use ACU::Log;
sub make_response($$)
{
my $doc = XML::LibXML::Document->new('1.0');
my $root = $doc->createElement("response");
my $result = $doc->createElement("result");
$result->appendText(shift);
$root->appendChild($result);
my $message = $doc->createElement("message");
$message->appendText(shift);
$root->appendChild($message);
$doc->setDocumentElement( $root );
return $doc->toString();
}
sub parse($$)
{
my $mod = shift;
my $parsed = {};
my $sax_handler;
$sax_handler = ResultHandler->new($parsed) if ($mod eq "ResultHandler");
if ($mod eq "ProjectHandler")
{
use ACU::Project;
$sax_handler = ProjectHandler->new($parsed);
}
$sax_handler = ProjectMemberHandler->new($parsed) if ($mod eq "ProjectMemberHandler");
my $parser = XML::SAX::ParserFactory->parser( Handler => $sax_handler );
eval {
$parser->parse_string(shift);
};
if ($@)
{
$parsed->{result} = 256;
$parsed->{message} = "Erreur du parser : $@";
log WARN, "Erreur du parser.";
}
if (! exists $parsed->{result})
{
$parsed->{result} = -1;
$parsed->{message} = "Pas de code de retour fourni." if (! exists $parsed->{message});
}
$parsed->{message} = "" if (! exists $parsed->{message});
return $parsed;
}
sub get($$)
{
my $next = shift;
my $url = shift;
my $ua = LWP::UserAgent->new;
# Some old version of LWP::UserAgent doesn't support ssl_opts, this is not required
eval {
$ua->ssl_opts(SSL_ca_file => "/etc/ldap/cacert.pem");
};
log(DEBUG, 'GET Request to ', API_URL, $url);
my $req = GET API_URL . $url;
my $cnt = $ua->request($req)->content;
log TRACE, $cnt;
return parse($next, $cnt);
}
sub send($$$)
{
my $next = shift;
my $url = shift;
my $ua = LWP::UserAgent->new;
# Some old version of LWP::UserAgent doesn't support ssl_opts, this is not required
eval {
$ua->ssl_opts(SSL_ca_file => "/etc/ldap/cacert.pem");
};
log(DEBUG, 'POST Request to ', API_URL, $url);
my $req = POST API_URL . $url, shift;
my $cnt = $ua->request($req)->content;
log TRACE, $cnt;
return parse($next, $cnt);
}
package ResultHandler;
use v5.10.1;
use strict;
use warnings;
sub new ($$)
{
my $class = shift;
my $self = {
parsed => shift,
inResult => 0,
inMessage => 0,
values => ""
};
bless $self, $class;
return $self;
}
sub start_element
{
my ($self, $element) = @_;
if ($element->{Name} eq "result") {
$self->{inResult} = 1;
}
elsif ($element->{Name} eq "message") {
$self->{inMessage} = 1;
}
}
sub characters
{
my ($self, $characters) = @_;
if ($self->{inResult} || $self->{inMessage}) {
$self->{values} .= $characters->{Data};
}
}
sub end_element
{
my ($self, $element) = @_;
if ($element->{Name} eq "result")
{
$self->{parsed}{result} = $self->{values};
$self->{inResult} = 0;
$self->{values} = "";
}
elsif ($element->{Name} eq "message")
{
$self->{parsed}{message} = $self->{values};
$self->{inMessage} = 0;
$self->{values} = "";
}
}
package ProjectMemberHandler;
use v5.10.1;
use strict;
use warnings;
sub new ($$)
{
my $class = shift;
my $self = {
parsed => shift,
inResult => 0,
inUser => 0,
values => ""
};
bless $self, $class;
return $self;
}
sub start_element
{
my ($self, $element) = @_;
if ($element->{Name} eq "result") {
$self->{inResult} = 1;
}
elsif ($element->{Name} eq "user") {
$self->{inUser} = 1;
}
}
sub characters
{
my ($self, $characters) = @_;
if ($self->{inResult} or $self->{inUser}) {
$self->{values} .= $characters->{Data};
}
}
sub end_element
{
my ($self, $element) = @_;
if ($element->{Name} eq "result") {
$self->{parsed}{result} = $self->{values};
$self->{inResult} = 0;
$self->{values} = "";
}
elsif ($element->{Name} eq "user") {
if (!$self->{parsed}{user}) {
$self->{parsed}{user} = ();
}
push @{ $self->{parsed}{user} }, $self->{values};
$self->{inUser} = 0;
$self->{values} = "";
}
}
1;