EPrints Technical Mailing List Archive

Message: #07341


< Previous (by date) | Next (by date) > | < Previous (in thread) | Next (in thread) > | Messages - Most Recent First | Threads - Most Recent First

Re: [EP-tech] Sending out Error Statuses with Error codes


Yeah - when I was looking at something similar, I felt this solution was a bit lacking.

For passing JSON data, it might be OK.

 

I wanted to emit a complete screen as the response, so did an internal_redirect after outputting the status/header - something like this (either 403 or 401 response):

 

### in the 'what response to emit' module:

if( defined $user ){

                EPrints::Apache::AnApache::send_status_line( $r, FORBIDDEN, "Forbidden");

                EPrints::Apache::AnApache::send_http_header( $r );

                $r->internal_redirect( '/cgi/acl_40X_handler' );

                $r->status( FORBIDDEN );

                return FORBIDDEN;

} else {

                EPrints::Apache::AnApache::send_status_line( $r, AUTH_REQUIRED, "Unauthorised");

                EPrints::Apache::AnApache::send_http_header( $r );

                $r->internal_redirect( '/cgi/acl_40X_handler' );

                $r->status( AUTH_REQUIRED );

                return 401;

}

###

 

 

In a cgi/40Xhandler:

 

use EPrints;

use strict;

 

my $repo = EPrints->new->current_repository;

exit( 0 ) unless( defined $repo );

 

my $r = $repo->get_request;

my $screenid = $repo->param( "screen" );

if( !defined $screenid )

{

        $screenid = "YourDefaultScreen";

}

 

EPrints::ScreenProcessor->process(

        session => $repo,

        screenid => $screenid

);

 

Not sure if that is useful in any way - I found it a tricky part of mod_perl2 to get my head around!

 

Cheers,

John

 

 

From: eprints-tech-bounces@ecs.soton.ac.uk [mailto:eprints-tech-bounces@ecs.soton.ac.uk] On Behalf Of Adam Field
Sent: 27 June 2018 12:51
To: eprints-tech@ecs.soton.ac.uk
Subject: Re: [EP-tech] Sending out Error Statuses with Error codes

 

Thanks, John.  My function looks like this now:

 

sub api_error

{

        my ($repo, $code, $message) = @_;

 

        my $r = $repo->request;

 

        $r->status($code);

        $r->custom_response($code, $message);

 

        return $code;

}

 

…and while isn’t quite as fancy as I’d like it, it does the job well enough to integrate with swagger UI (which was the key goal).  I can always make it better later.

 

--

Adam

 

 

 

From: <eprints-tech-bounces@ecs.soton.ac.uk> on behalf of John Salter <J.Salter@leeds.ac.uk>
Reply-To: <eprints-tech@ecs.soton.ac.uk>
Date: Tuesday, 26 June 2018 17:32
To: "eprints-tech@ecs.soton.ac.uk" <eprints-tech@ecs.soton.ac.uk>
Subject: Re: [EP-tech] Sending out Error Statuses with Error codes

 

Apologies - that was only ½ helpful…

This is the other bit that I think you need:

https://perl.apache.org/docs/2.0/api/Apache2/Response.html#C_custom_response_

 

Cheers,

John

 

From: John Salter
Sent: 26 June 2018 17:27
To: eprints-tech@ecs.soton.ac.uk
Subject: RE: Sending out Error Statuses with Error codes

 

Hi Adam,

You need the 'mod_perl2 User's Guide' by Bekman and Brandt… :o)

 

Or hopefully this:

https://perl.apache.org/docs/2.0/api/Apache2/RequestRec.html#C_err_headers_out_

 

Cheers,

John

 

From: eprints-tech-bounces@ecs.soton.ac.uk [mailto:eprints-tech-bounces@ecs.soton.ac.uk] On Behalf Of Adam Field
Sent: 26 June 2018 17:01
To: eprints-tech@ecs.soton.ac.uk
Subject: [EP-tech] Sending out Error Statuses with Error codes

 

Hi

 

                I’m working on an API that spits out objects in JSON, and I have a function that handles errors.  I can’t seem to get it to behave, and I wonder if anyone can offer me any advice.

 

sub api_error

{

        my ($repo, $code, $message) = @_;

 

        my $r = $repo->request;

 

        $r->status($code);

        EPrints::Apache::AnApache::send_status_line( $r, $code );

        $r->content_type('application/json');

 

        my $json = JSON->new;

        my $content = $json->encode(

        {

                status => $code,

                message => $message

        }

        );

 

        $r->err_headers_out->{'Content-Length'} = length $content;

 

#       binmode(STDOUT, ":utf8");

#       print $content;

 

        return $code;

}

 

Using CURL to look at the headers and body, I get this:

 

HTTP/1.1 400 Bad Request

Date: Tue, 26 Jun 2018 15:48:51 GMT

Server: Apache/2.4.7 (Ubuntu)

Content-Length: 120

Connection: close

Content-Type: text/html; charset=iso-8859-1

 

 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<html><head>

<title>400 Bad Request</title>

</head><body>

<h1>Bad Request</h1>

<p>Your browser sent a request that this server could not understand.<br />

</p>

<hr>

<address>Apache/2.4.7 (Ubuntu) Server at sherpaneo-test.sherpa.ac.uk Port 443</address>

</body></html>

 

If I uncomment the two commented lines, I get this:

 

HTTP/1.1 200 OK

Date: Tue, 26 Jun 2018 15:48:36 GMT

Server: Apache/2.4.7 (Ubuntu)

Content-Length: 120

Content-Type: application/json

 

 

{"message":"unrecognised api key in 'api-key' at /usr/share/eprints3/lib/plugins/SherpaAPI.pm line 470.\n","status":400}

 

 

Essentially, if I output anything to STDOUT, something (maybe MOD Perl) switches the status to ‘200 OK’.  How can I get the status code from the first version, and the body from the second?  Any ideas?

 

 

Cheers

 

--

Adam Field

*** Options: http://mailman.ecs.soton.ac.uk/mailman/listinfo/eprints-tech *** Archive: http://www.eprints.org/tech.php/ *** EPrints community wiki: http://wiki.eprints.org/ *** EPrints developers Forum: http://forum.eprints.org/