summary refs log tree commit diff
path: root/lib/Net/HTTP/Console/Dispatcher/HTTP.pm
blob: 88f8814bb7569e9ee25d71f2dd7f48edd6d20f61 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package Net::HTTP::Console::Dispatcher::HTTP;

use MooseX::Declare;

class Net::HTTP::Console::Dispatcher::HTTP with Net::HTTP::Console::Dispatcher {

    use Try::Tiny;

    method pattern($input) {
        $input =~ /^(?:GET|POST|PUT|DELETE|HEAD)\s/ ? return $input : return 0;
    }

    method dispatch($input) {
        $self->_clean_http_lib;

        my ($method, $path, $body);
        if (($method, $path) = $input =~ /^(GET|DELETE)\s(.*)$/) {
            $self->_do_request($method, $path);
        }
        elsif (($method, $path, $body) = $input =~ /^(POST|PUT)\s(.*)(?:\s(.*))$/) {
            $self->_do_request_with_body($method, $path, $body);
        }
        else {
            $self->application->logger('error', 'unsupported HTTP method');
        }
        return 1;
    }

    method _do_request($http_method, $path) {
        $self->application->new_anonymous_method($http_method, $path);
        try {
            my ($content, $result) = $self->application->api_object->anonymous;
            $self->application->_set_and_show($content, $result);
        }catch{
            $self->application->error('error', $_);
        };
    }

    method _clean_http_lib {
        if ($self->application->api_lib eq "Net::HTTP::Console::Dummy") {
            map { $self->application->api_lib->meta->remove_net_api_method($_) }
              $self->application->api_lib->meta->get_all_net_api_methods();
        }
    }

    method _do_request_with_body($http_method, $path, $body) {
        $self->application->new_anonymous_method($http_method, $path);

        # XXX clean handlers
        $self->application->api_object->api_useragent->add_handler(
            request_prepare => sub {
                my $request = shift;
                $request->header('Content-Type' => 'application/json');
                $request->content('{"foof":"bar"}');
            }
        );
        try {
            my ($content, $result) = $self->application->api_object->anonymous;
            $self->application->_set_and_show($content, $result);
        }catch{
            $self->application->error('error', $_);
        };
    }
}

1;