Atompub
view release on metacpan or search on metacpan
lib/Atompub/Client.pm view on Meta::CPAN
return $client->error('No URI') unless $uri;
$client->_get_feed({ uri => $uri }) or return;
$client->rc;
}
sub createEntry {
my($client, $uri, $entry, $slug) = @_;
return $client->error('No URI') unless $uri;
return $client->error('No Entry') unless $entry;
unless (UNIVERSAL::isa($entry, 'XML::Atom::Entry')) {
$entry = XML::Atom::Entry->new($entry)
or return $client->error(XML::Atom::Entry->errstr);
}
my $headers = HTTP::Headers->new;
$headers->content_type(media_type('entry'));
$headers->slug(_escape(uri_unescape $slug)) if defined $slug;
$client->_create_resource({
uri => $uri,
rc => $entry,
headers => $headers,
}) or return;
$client->res->location;
}
sub createMedia {
my($client, $uri, $stream, $content_type, $slug) = @_;
return $client->error('No URI') unless $uri;
return $client->error('No stream') unless $stream;
return $client->error('No Content-Type') unless $content_type;
my $media = ref $stream ? $$stream : read_file($stream, binmode => ':raw')
or return $client->error('No media');
my $headers = HTTP::Headers->new;
$headers->content_type($content_type);
$headers->slug(_escape( uri_unescape $slug)) if defined $slug;
$client->_create_resource({
uri => $uri,
rc => \$media,
headers => $headers,
}) or return;
$client->res->location;
}
sub getEntry {
my($client, $uri) = @_;
return $client->error('No URI') unless $uri;
$client->_get_resource({ uri => $uri }) or return;
return $client->error('Response is not Atom Entry')
unless UNIVERSAL::isa($client->rc, 'XML::Atom::Entry');
$client->rc;
}
sub getMedia {
my($client, $uri) = @_;
return $client->error('No URI') unless $uri;
$client->_get_resource({ uri => $uri }) or return;
return $client->error('Response is not Media Resource')
if UNIVERSAL::isa($client->rc, 'XML::Atom::Entry');
wantarray ? ($client->rc, $client->res->content_type) : $client->rc;
}
sub updateEntry {
my($client, $uri, $entry) = @_;
return $client->error('No URI') unless $uri;
return $client->error('No Entry') unless $entry;
unless (UNIVERSAL::isa( $entry, 'XML::Atom::Entry')) {
$entry = XML::Atom::Entry->new($entry)
or return $client->error(XML::Atom::Entry->errstr);
}
my $headers = HTTP::Headers->new;
$headers->content_type(media_type('entry'));
$client->_update_resource({
uri => $uri,
rc => $entry,
headers => $headers,
});
}
sub updateMedia {
my($client, $uri, $stream, $content_type) = @_;
return $client->error('No URI') unless $uri;
return $client->error('No stream') unless $stream;
return $client->error('No Content-Type') unless $content_type;
my $media = ref $stream ? $$stream : read_file($stream, binmode => ':raw')
or return $client->error('No media resource');
my $headers = HTTP::Headers->new;
$headers->content_type($content_type);
$client->_update_resource({
uri => $uri,
rc => \$media,
headers => $headers,
});
}
sub deleteEntry {
my($client, $uri) = @_;
return $client->error('No URI') unless $uri;
$client->_delete_resource({ uri => $uri });
}
*deleteMedia = \&deleteEntry;
sub _get_service {
my($client, $args) = @_;
my $uri = $args->{uri};
$client->_clear;
return $client->error('No URI') unless $uri;
$client->req(HTTP::Request->new(GET => $uri));
$client->res($client->make_request($client->req));
return $client->error(join "\n", $client->res->status_line, $client->res->content)
unless is_success $client->res->code;
warn 'Bad Content-Type: '.$client->res->content_type
unless media_type($client->res->content_type)->is_a('service');
$client->rc(XML::Atom::Service->new(\$client->res->content))
or return $client->error(XML::Atom::Service->errstr);
for my $work ($client->rc->workspaces) {
$client->info->put($_->href, $_) for $work->collections;
}
$client;
}
sub _get_categories {
my($client, $args) = @_;
my $uri = $args->{uri};
$client->_clear;
return $client->error('No URI') unless $uri;
$client->req(HTTP::Request->new(GET => $uri));
$client->res($client->make_request($client->req));
return $client->error(join "\n", $client->res->status_line, $client->res->content)
unless is_success $client->res->code;
warn 'Bad Content-Type: '.$client->res->content_type
unless media_type($client->res->content_type)->is_a('categories');
$client->rc(XML::Atom::Categories->new(\$client->res->content))
or return $client->error(XML::Atom::Categories->errstr);
$client;
}
sub _get_feed {
my($client, $args) = @_;
( run in 1.983 second using v1.01-cache-2.11-cpan-9581c071862 )