############################################################################## package JSON::RPC::Legacy::Server::Daemon; use strict; use JSON::RPC::Legacy::Server; # for old Perl 5.005 use base qw(JSON::RPC::Legacy::Server); $JSON::RPC::Legacy::Server::Daemon::VERSION = '1.06'; use Data::Dumper; sub new { my $class = shift; my $self = $class->SUPER::new(); my $pkg; if( grep { $_ =~ /^SSL_/ } @_ ){ $self->{_daemon_pkg} = $pkg = 'HTTP::Daemon::SSL'; } else{ $self->{_daemon_pkg} = $pkg = 'HTTP::Daemon'; } eval qq| require $pkg; |; if($@){ die $@ } $self->{_daemon} ||= $pkg->new(@_) or die; return $self; } sub handle { my $self = shift; my %opt = @_; my $d = $self->{_daemon} ||= $self->{_daemon_pkg}->new(@_) or die; while (my $c = $d->accept) { $self->{con} = $c; while (my $r = $c->get_request) { $self->request($r); $self->path_info($r->url->path); $self->SUPER::handle(); last; } $c->close; } } sub retrieve_json_from_post { return $_[0]->request->content; } sub retrieve_json_from_get { } sub response { my ($self, $response) = @_; $self->{con}->send_response($response); } 1; __END__ =head1 NAME JSON::RPC::Legacy::Server::Daemon - JSON-RPC sever for daemon =head1 SYNOPSIS # Daemon version #-------------------------- # In your daemon server script use JSON::RPC::Legacy::Server::Daemon; JSON::RPC::Legacy::Server::Daemon->new(LocalPort => 8080); ->dispatch({'/jsonrpc/API' => 'MyApp'}) ->handle(); #-------------------------- # In your application class package MyApp; use base qw(JSON::RPC::Legacy::Procedure); # Perl 5.6 or more than sub echo : Public { # new version style. called by clients # first argument is JSON::RPC::Legacy::Server object. return $_[1]; } sub sum : Public(a:num, b:num) { # sets value into object member a, b. my ($s, $obj) = @_; # return a scalar value or a hashref or an arryaref. return $obj->{a} + $obj->{b}; } sub a_private_method : Private { # ... can't be called by client } sub sum_old_style { # old version style. taken as Public my ($s, @arg) = @_; return $arg[0] + $arg[1]; } =head1 DESCRIPTION This module is for http daemon servers using L or L. =head1 METHODS They are inherited from the L methods basically. The below methods are implemented in JSON::RPC::Legacy::Server::Daemon. =over =item new Creates new JSON::RPC::Legacy::Server::Daemon object. Arguments are passed to L or L. =item handle Runs server object and returns a response. =item retrieve_json_from_post retrieves a JSON request from the body in POST method. =item retrieve_json_from_get In the protocol v1.1, 'GET' request method is also allowable. it retrieves a JSON request from the query string in GET method. =item response returns a response JSON data to a client. =back =head1 SEE ALSO L, L, L, L, L, L, L, =head1 AUTHOR Makamaka Hannyaharamitu, Emakamaka[at]cpan.orgE =head1 COPYRIGHT AND LICENSE Copyright 2007-2008 by Makamaka Hannyaharamitu This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut