1package OpenXPKI::Client::Service::Response;
2
3use strict;
4use warnings;
5
6use Moose;
7use OpenXPKI::Debug;
8use OpenXPKI::Exception;
9use OpenXPKI::Server::Context qw( CTX );
10
11## constructor and destructor stuff
12
13has error => (
14    is => 'rw',
15    isa => 'Int',
16    predicate => 'has_error',
17    clearer => 'clear_error',
18    lazy => 1,
19    default => 0,
20);
21
22has __error_message => (
23    is => 'rw',
24    isa => 'Str',
25    predicate => 'has_error_message',
26    clearer => 'clear_error_message',
27    init_arg  => 'error_message',
28);
29
30has retry_after => (
31    is => 'ro',
32    isa => 'Int',
33    predicate => 'is_pending',
34    lazy => 1,
35    default => 0,
36);
37
38has workflow => (
39    is => 'rw',
40    isa => 'HashRef',
41    default => sub { return {}; }
42);
43
44has result => (
45    is => 'rw',
46    isa => 'Str',
47    lazy => 1,
48    default => '',
49);
50
51has transaction_id => (
52    is => 'rw',
53    isa => 'Str',
54    lazy => 1,
55    default => sub {
56        my $self = shift;
57        return $self->workflow->{context}->{transaction_id};
58    },
59);
60
61# Use predefined numeric codes for dedicated problems
62our %named_messages = (
63    '40001' => 'Signature invalid',
64    '40002' => 'Unable to parse request',
65    '40003' => 'Incoming enrollment with empty body',
66    '40004' => 'Missing or invalid parameters',
67    '40006' => 'Request was rejected',
68    '50001' => 'Unable to initialize client',
69    '50003' => 'Unexpected response from backend',
70    '50011' => 'Unable to initialize endpoint parameters',
71);
72
73# this allows a constructor with the error code as scalar
74around BUILDARGS => sub {
75
76    my $orig = shift;
77    my $class = shift;
78
79    my $args = shift;
80    if (!ref $args) {
81        $args = { error => $args };
82    }
83
84    return $class->$orig( $args );
85
86};
87
88
89sub http_status_code {
90    my $self = shift;
91    return '202' if ($self->is_pending());
92    return '200' unless ($self->has_error());
93    return substr($self->error(),0,3) || '500';
94}
95
96sub http_status_line {
97
98    my $self = shift;
99    if ($self->is_pending()) {
100        return sprintf('202 Request Pending - Retry Later (%s)', $self->transaction_id());
101    }
102
103    if ($self->has_error()) {
104        my $err = $self->http_status_code();
105        if (my $msg = $OpenXPKI::Client::Service::Response::named_messages{$self->error()}) {
106            $err .= ' '.$msg;
107        } else {
108            $err .= ' Other Error ' . $self->error();
109        }
110        return $err;
111    }
112
113    return '200 OK';
114}
115
116sub error_message {
117
118    my $self = shift;
119    return '' unless ($self->has_error());
120
121    return $self->__error_message() if ($self->has_error_message());
122
123    return $OpenXPKI::Client::Service::Response::named_messages{$self->error()}
124        || 'Unknown error';
125
126}
127
128sub is_server_error {
129
130    my $self = shift;
131    return 0 unless ($self->has_error());
132    my $err = $self->error();
133    return 0 unless ($err >= 50000);
134    return $err;
135
136}
137
138sub is_client_error {
139
140    my $self = shift;
141    return 0 unless ($self->has_error());
142    my $err = $self->error();
143    return 0 unless ($err >= 40000 && $err < 50000);
144    return $err;
145
146}
147
1481;
149
150 __END__;
151
152=head1 OpenXPKI::Client::Service::Response
153