http://www.perlmonks.org?node_id=765800

cLive ;-) has asked for the wisdom of the Perl Monks concerning the following question:

Scratching my head on this one. My app works fine, except it sends a 500 Internal Server Error status rather than 200 OK.

Content displays fine in the browser. I only noticed it when adding error checking to the client app.

I've stripped it down to a minimal case:

package Test; use strict; use warnings; use base qw(CGI::Application); sub setup { my $self = shift; # default runmodes $self->start_mode('do_main'); $self->mode_param('m'); $self->run_modes([qw/ do_main testtt /]); } sub cgiapp_prerun { my $self = shift; $self->header_add( 'Content-type' => 'text/plain' ); } sub testtt { my $self = shift; return "test - OK to here"; } sub do_main { my $self = shift; return "main - OK to here"; } 1;

and call the url with query string:

?m=testtt

I get a screwed up content-type header back:

Content-Type: content-type

If I comment out the header line, the page serves correctly with the text/html content type (but I need text/plain!).

Changing the capitalization of the header name appears to make no difference.

Weird thing is that I have another app on the same server that works correctly, but I can't see what's any different in it.

Any ideas? AM I missing something extremely simple here?

EDIT: as always, writing out this question prods me to find the solution by myself.

I should have used:

$self->header_add( '-type' => 'text/plain' );

The other app wasn't looking at the status header, but had the same issue (now I check).

OK, that's enough for me for today :)

Replies are listed 'Best First'.
Re: CGI::Application header weirdness (docs)
by tye (Sage) on May 23, 2009 at 06:30 UTC

    The CGI::Application docs show you should use -type for that. It also references the CGI.pm docs that elaborate and show that to get arbitrary headers you would use -Content_type not 'Content-type'.

    $self->hea­der_add( -t­ype => 'text/plai­n' );

    - tye        

      Hey tye, yep, I worked it out. I think it should throw an exception though for a bad one. Bugs the hell out of me when I'm allowed to make those kind of errors by the module. Ah well, at least I can sleep now :)