Hellanzb + PERL + RPC::XML::Client

Je m’amuse actuellement à interfacer Hellanzb avec un script créé en Perl.
Hellanzb nécessite une authentification pour faire appel aux différente méthode, j’ai donc utilisé RPC::XML::Client qui semblait être la seule librairie qui prenait en compte les crédentials.

Cependant malgré une authentification conforme à la signature de la méthode, impossible d’avoir un résultat. Toujours le même message d’erreur dans les logs apache :

[DEBUG] $VAR1 = 'RPC::XML::Client::send_request: HTTP server error: Method Not Allowed';

Après m’être cassé les dents sur ce problème à essayer de mettre tout et n’importe quoi dans les paramètres, j’ai cherché à effectuer du debug. La seule solution que j’ai trouvé c’est d’utiliser directement tcpdump pour voir le traffic et comprendre qu’elle est la différence entre le PHP qui fonctionne et Perl qui fonctionne pas.

tcpdump port 8760 -A -i lo

PHP :

POST / HTTP/1.0
User-Agent: XML-RPC for PHP 2.0RC2
Host: localhost
Authorization: Basic aFVqbGFuemI6shhbfmdlbWU=
Accept-Encoding: gzip, deflate
Accept-Charset: UTF-8,ISO-8859-1,US-ASCII
Content-Type: text/xml
Content-Length: 100

<?xml version="1.0"?>
<methodCall>
<methodName>status</methodName>
<params>
</params>
</methodCall>

PERL

POST / HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Accept-Encoding: deflate
Host: localhost
User-Agent: RPC::XML::Client/1.32 libwww-perl/5.836
Content-Length: 114
Content-Type: text/xml

<?xml version="1.0"?>
<methodCall>
<methodName>status</methodName>
<params>
</params>
</methodCall>

J’ai donc la confirmation que le problème est dans l’authentification, mais pourquoi la fonction credentials de RPC::XML::Client fait pas sont boulot ?

Puis je me suis rappelé que dans mes test, même avec curl j’arrivais à me connecter simplement, pourquoi ne pas faire de la même façon et oublier la fonction credentials ?

$ curl http://127.0.0.1:8760
<html><body>Access Denied.</body></html>
$ curl http://myUser:myPassword@127.0.0.1:8760 

it works !

J’adapte le code rapidement, et hop ça fonctionne !

#!/usr/bin/perl -w

package Controller::DownloadLive;

use Data::Dumper;
use lib '/home/MY2/www/lib';
use MyDB;
use MyLogger;
use Mod::Download;
use RPC::XML::Client;

use strict;
use warnings;

#
# Constructor
#
sub new
{
    my ($class, $action, $actionValue, $cgi) = @_;

    my $return = {'action' => $action, 'actionValue' => $actionValue};

    my $host    = 'localhost';
    my $port    =  8760;
    my $user    = 'myUser';
    my $passwd  = 'myPassword'; 
    
    my $xmlrpc = RPC::XML::Client->new("http://$user:$passwd\@$host:$port");
    # $xmlrpc->credentials($host, $user, $passwd);
    my $res = $xmlrpc->send_request("status");
    MyLogger::debug(Dumper($xmlrpc));
    MyLogger::debug(Dumper($res));

    return $return;
}

1;

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *