use strict; package JSONRPC::Transport::HTTP; use base qw(JSONRPC); # # # package JSONRPC::Transport::HTTP::Server; use base qw(JSONRPC); use JSON; sub handle { my $self = shift; unless(ref $self){ $self = $self->new(@_) } if( my $request = $self->request() ){ my $js = jsonToObj($request) or return $self->invalid_request(); $self->{json_data} = $js; if( defined $self->request_id($js->{id}) ){ my $res = $self->handle_method() or return $self->invalid_request(); return $self->response($res); } else{ $self->notification(); $self->no_response(); } } else{ return $self->invalid_request(); } } # # # package JSONRPC::Transport::HTTP::CGI; use CGI; use base qw(JSONRPC::Transport::HTTP::Server); sub new { my $self = shift; unless (ref $self) { my $class = ref($self) || $self; $self = $class->SUPER::new(@_); } return $self; } sub handle { my $self = shift->new; my $length = $ENV{'CONTENT_LENGTH'} || 0; $self->SUPER::handle(); } sub request { my $self = shift; my $q = new CGI; $self->{query} = $q; # check? my @name = $q->param; return (@name == 1) ? $q->param($name[0]) : undef; } sub response { my $self = shift; my $resonse = shift; my $q = $self->{query}; print $q->header(-type => 'text/plain; charset=UTF-8'); print $resonse; } sub invalid_request { my $self = shift; my $q = $self->{query} || new CGI; print $q->header(-status => '500'); } sub no_response { my $self = shift; my $q = $self->{query} || new CGI; print $q->header(-status => '200'); } 1; __END__ =head1 COPYRIGHT Copyright 2005 makamaka [at] donzoko.net This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut