in reply to Re: problems with HTTP::Server::Simple::CGI
in thread problems with HTTP::Server::Simple::CGI

I see it prints HTTP headers with the status line first. So I changed the handler to work around that. I capture the output that has been written through CGI STDOUT, then mangle the headers and print that.

sub handler { capture { MyModule->new->go; } \$out; my ($header, $body) = split /\r\n\r\n/, $out, 2; my $h = HTTP::Headers->new; for my $line (split /\r\n/, $header) { my ($key, $value) = split /: /, $line, 2; $h->header($key, $value); } $h->header('Status' => 200) unless $h->header('Status'); my $status = $h->header('Status'); $h->remove_header('Status'); print 'HTTP/1.1 ' . HTTP::Response->new($status => undef, $h, $body)->as_string("\ +r\n"); }

Now the tests pass, except the last one! That's the one about POST data. Thus:

is $r->content, $post_data; # Failed test at foobar.t line 85. # got: '' # expected: 'some post data' # Looks like you failed 1 test of 8.
diag $r->as_string shows:
# HTTP/1.1 201 Created # Location: http://localhost:12345 # Content-Type: text/html; charset=ISO-8859-1 # Client-Aborted: die # Client-Date: Tue, 17 Feb 2009 18:16:12 GMT # Client-Response-Num: 1 # X-Died: read failed: Connection reset by peer at .../LWP/Protocol/ht +tp.pm line 382, <DATA> line 16. #

Note that the transmitted HTTP body disappeared. I can confirm that it does not arrive anymore by the time CGI is initialised. I can confirm that the capturing causes that.

What do I do now?

Replies are listed 'Best First'.
Re^3: problems with HTTP::Server::Simple::CGI
by Anonymous Monk on Feb 18, 2009 at 04:44 UTC
    Now you fix it ?:) Sorry, I've never heard of capture, so can't guess what you're doing wrong :) Maybe you're closing the connection prematurely? ( die "oh noes")

      capture is exported by use IO::CaptureOutput qw(capture);. I am not closing anything. I blame that module for closing. I have no skill in debugging the deep bowels of sockets (LWP/Protocol/http.pm) and file handles (IO::CaptureOutput). Mostly because unlike variables, one cannot just dump them to inspect what's in them.

      Please continue to help me, Anonmonk. You give me hope and other ideas.

        After careful examination and testing, you weren't returning full http headers, which you tried to fix up with capture, but all you need is nph:
        D:\>perl -MCGI -le"print CGI->header" Content-Type: text/html D:\>perl -MCGI -le"print CGI->header(-nph => 1)" HTTP/1.0 200 OK Server: cmdline Date: Fri, 20 Feb 2009 10:35:31 GMT Content-Type: text/html D:\>
        USING NPH SCRIPTS, No-Parse Headers