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