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;



=head1 NAME

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

=head1 VERSION

version 0.2


    use Plack::Builder;

    builder {
        enable 'SuppressResponseCodes';


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ß <>


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.