package Plack::Middleware::SuppressResponseCodes;
{
  $Plack::Middleware::SuppressResponseCodes::VERSION = '0.2';
}
#ABSTRACT: Return HTTP Status code 200 for errors on request

use strict;
use parent qw(Plack::Middleware);

use Plack::Util;

sub call {
    my($self, $env) = @_;
    my $res = $self->app->($env);
    Plack::Util::response_cb($res, sub {
        my $res = shift;
        if ( $res->[0] =~ /^[45]../ and
             $env->{QUERY_STRING} =~ /(?:^|&)suppress_response_codes(=([^&]+))?/ 
             and !($1 and $2 =~ /^(0|false)$/) ) {
            $res->[0] = 200;
        }
    });
}

1;



__END__
=pod

=head1 NAME

Plack::Middleware::SuppressResponseCodes - Return HTTP Status code 200 for errors on request

=head1 VERSION

version 0.2

=head1 SYNOPSIS

    use Plack::Builder;

    builder {
        enable 'SuppressResponseCodes';
        $app;
    };

=head1 DESCRIPTION

Plack::Middleware::SuppressResponseCodes modifies error responses (PSGI
response with HTTP status code 4xx or 5xx) if the query parameter
C<suppress_response_codes> is present with any value except C<0> or C<false>.
The status code is set to 200 in this case. This behaviour is useful for
clients that cannot handle HTTP errors.  It has also been implemented in
popular APIs such as Twitter and Microsoft Live.

=head1 SEE ALSO

One should think about embedding the status code in the response body when
using this middleware, for instance with L<Plack::Middleware::JSONP::Headers>.

=encoding utf8

=head1 AUTHOR

Jakob Voß <voss@gbv.de>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by Jakob Voß.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut