- From: Olivier Thereaux via cvs-syncmail <cvsmail@w3.org>
- Date: Fri, 18 Nov 2005 08:03:18 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/perl/modules/WebService/Validator/Feed/lib/WebService/Validator/Feed
In directory hutz:/tmp/cvs-serv25066/lib/WebService/Validator/Feed
Added Files:
W3C.pm
Log Message:
first commit of this module. Based on Bjoern's WebService::Validator::CSS::W3C.
--- NEW FILE: W3C.pm ---
package WebService::Validator::Feed::W3C;
use strict;
use warnings;
use SOAP::Lite;
use LWP::UserAgent qw//;
use URI qw//;
use URI::QueryParam qw//;
use Carp qw//;
use base qw/Class::Accessor/;
our $VERSION = "0.1";
__PACKAGE__->mk_accessors qw/user_agent validator_uri/;
__PACKAGE__->mk_ro_accessors qw/response request_uri som success/;
sub new
{
my $proto = shift;
my $class = ref $proto || $proto;
my $self = bless {}, $class;
my $ua = shift;
my $uri = shift;
if (defined $ua) {
# check whether it really is
Carp::croak "$ua is not a LWP::UserAgent"
unless UNIVERSAL::isa($ua, 'LWP::UserAgent');
$self->user_agent($ua);
} else {
my $ua = LWP::UserAgent->new(agent => __PACKAGE__."/".$VERSION);
$self->user_agent($ua);
}
if (defined $uri) {
$self->validator_uri($uri);
} else {
$self->validator_uri("http://validator.w3.org/feed/check.cgi");
}
return $self;
}
sub _handle_response
{
my $self = shift;
my $res = shift;
# internal or server errors...
return 0 unless $res->is_success;
local $_ = $res->content;
# workaround for SOAP::Lite's lack of support for SOAP 1.2
s{xmlns:env="http://www.w3.org/2003/05/soap-envelope"}
{xmlns:env="http://www.w3.org/2001/06/soap-envelope"};
# workaround for SOAP::Lite's lack of support for SOAP 1.2
s{env:encodingStyle="http://www.w3.org/2003/05/soap-encoding"}
{env:encodingStyle="http://www.w3.org/2001/06/soap-encoding"};
my $som;
eval { $som = SOAP::Deserializer->new->deserialize($_); };
# Deserialization might fail if the response is not a legal
# SOAP response, e.g., if the response is ill-formed... Not
# sure how to make the reason for failure available to the
# application, suggestions welcome.
if ($@) {
# Carp::carp $@;
return 0;
}
# memorize the SOAP object model object
$self->{'som'} = $som;
# check whether this is really the CSS Validator responding
if ($som->match("/Envelope/Body/feedvalidationresponse")) {
$self->{'success'} = 1;
}
# if the response was a SOAP fault
elsif ($som->match("/Envelope/Body/Fault")) {
$self->{'success'} = 0;
}
# return whether the response was successfully processed
return $self->{'success'};
}
sub validate
{
my $self = shift;
my %parm = @_;
my $uri = URI->new($self->validator_uri);
my $ua = $self->user_agent;
$self->{'success'} = 0;
#
if (defined $parm{string}) {
$uri->query_param( rawdata => $parm{string});
$uri->query_param( manual => 1);
} elsif (defined $parm{uri}) {
$uri->query_param(url => $parm{uri});
} else {
Carp::croak "you must supply a string/uri parameter\n";
}
# request SOAP 1.2 output
$uri->query_param(output => "soap12");
# memorize request uri
$self->{'request_uri'} = $uri;
# generate new HTTP::Request object
my $req = HTTP::Request->new(GET => $uri);
my $res = $ua->simple_request($req);
# memorize response
$self->{'response'} = $res;
# print $res->as_string; # little printf debugging
return $self->_handle_response($res);
}
sub is_valid
{
my $self = shift;
my $som = $self->som;
# previous failure means the style sheet is invalid
return 0 unless $self->success and defined $som;
# fetch validity field in reponse
my $validity = $som->valueof("/Envelope/Body/cssvalidationresponse/validity");
# valid if m:validity is true
return 1 if defined $validity and $validity eq "true";
# else invalid
return 0;
}
sub errors
{
my $self = shift;
my $som = $self->som;
return () unless defined $som;
return $som->valueof("//error");
}
sub warnings
{
my $self = shift;
my $som = $self->som;
return () unless defined $som;
return $som->valueof("//warning");
}
sub errorcount
{
my $self = shift;
my $som = $self->som;
return () unless defined $som;
return $som->valueof("//errorcount");
}
sub warningcount
{
my $self = shift;
my $som = $self->som;
return () unless defined $som;
return $som->valueof("//warningcount");
}
1;
__END__
=pod
=head1 NAME
WebService::Validator::Feed::W3C - Interface to the W3C Feed Validation service
=head1 SYNOPSIS
use WebService::Validator::Feed::W3C;
my $feed_url = "http://www.example.com";
my $val = WebService::Validator::CSS::W3C->new;
my $ok = $val->validate(url => $feed_url);
if ($ok and !$val->is_valid) {
print "Errors:\n";
printf " * %s\n", $_->{message}
foreach $val->errors
}
=head1 DESCRIPTION
This module is an interface to the W3C Feed Validation online service
L<http://validator.w3.org/feed/>, based on its SOAP 1.2 support.
It helps to find errors in RSS or Atom feeds.
The following methods are available:
=over 4
=item my $val = WebService::Validator::Feed::W3C->new
=item my $val = WebService::Validator::Feed::W3C->new($ua)
=item my $val = WebService::Validator::Feed::W3C->new($ua, $url)
Creates a new WebService::Validator::Feed::W3C object. A custom
L<LWP::UserAgent> object can be supplied which is then used for HTTP
communication with the W3C Feed Validation service. $url is the URL of the Feed
Validator, C<http://validator.w3.org/feed/check.cgi> by default.
=item my $success = $val->validate(%params)
Validate a feed takes C<%params> as defined below. Either C<string>
or C<uri> must be supplied. Returns a true value if the validation succeeded
(regardless of whether the style sheet contains errors).
=over 4
=item string => $feed_string
An atom or RSS feed, as a string. It is currently unlikely that validation will work
if the string is not a legal UTF-8 string. If a string is specified, the C<uri>
parameter will be ignored. Note that C<GET> will be used to pass the string
to the Validator, it might not work with overly long strings.
=item uri => $feed_uri
The location of a style sheet or a RSS/Atom feed containing or
referencing style sheets.
=back
=item my $success = $val->success
Same as the return value of C<validate()>.
=item my $is_valid = $val->is_valid
Returns a true value if the last attempt to C<validate()> succeeded and the
validator reported no errors in the style sheet.
=item my @errors = $val->errors
Returns a list with information about the errors found for the
style sheet. An error is a hash reference; the example in the
synopsis would currently return something like
( {
context => 'p',
property => 'color',
expression => { start => '', end => 'not-a-color' }
errortype => 'parse-error',
message => 'not-a-color is not a color value',
line => 0,
} )
=item my @warnings = $val->warnings
Returns a list with information about the warnings found for the
style sheet. This is currently of limited use as it is broken, see
L<http://www.w3.org/Bugs/Public/show_bug.cgi?id=771> for details.
@@example
=item my $ua = $val->user_agent
=item my $ua = $val->user_agent($new_ua)
The L<LWP::UserAgent> object you supplied to the constructor or a
custom object created at construction time you can manipulate.
# set timeout to 30 seconds
$val->user_agent->timeout(30);
You can also supply a new object to replace the old one.
=item my $uri = $val->validator_uri
=item my $uri = $val->validator_uri($validator_uri)
Gets or sets the URI of the validator. If you did not specify a
custom URI, C<http://jigsaw.w3.org/css-validator/validator> by
default.
=item my $response = $val->response
The L<HTTP::Response> object returned from the last request. This is
useful to determine why validation might have failed.
if (!$val->validate(string => $feed_string)) {
if (!$val->response->is_success) {
print $val->response->message, "\n"
}
}
=item my $uri = $val->request_uri
The L<URI> object used for the last request.
=item my $som = $val->som
The L<SOAP::SOM> object for the last successful deserialization, check the
return value of C<validate()> or C<success()> before using the object.
=back
=head1 NOTE
Please remember that the Feed Validation service is a shared resource,
so do not abuse it: you should make your scripts sleep between requests.
=head1 AUTHOR
olivier Thereaux <ot@w3.org>
Based on the WebService::Validator::CSS::W3C module
by Bjoern Hoehrmann <bjoern@hoehrmann.de> et.al.
This module is licensed under the same terms as Perl itself.
=cut
Received on Friday, 18 November 2005 08:03:25 UTC