You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Joe Cullin <jc...@unipress.com> on 2005/05/25 23:29:00 UTC

[mp2] no STDIN for mod_cgi POST after ModPerl::Registry GET

-------------8<---------- Start Bug Report ------------8<----------
1. Problem Description:
---------------------
I'm trying to run some ModPerl::Registry and some mod_cgi scripts on
the same server.  The problem is that sometimes the mod_cgi scripts
get no input for POST requests (STDIN is closed?).  I'm able to
reproduce it consistently like this:

1. restart apache.
2. do a GET request to a ModPerl::Registry script (with input).
3. do a POST request to a mod_cgi script (with input).
 --> If the POST is served by the same child as the GET from step 2,
     the mod_cgi script doesn't see any input.  I can continue to
     re-POST to the mod_cgi script and repeat the problem.

(However, if I POST first to the mod_perl script, the mod_cgi script
works fine.)

Details:
---------------------
No errors show up in the apache log.  My script produces an error page
because it got no input, and then everything goes on.  If I then POST
to the mod_perl script, the child is ok from then on -- the mod_cgi
POSTS start working.
---------------------
This seems to happen not only on server startup, but whenever a new
child starts and serves first a mod_perl GET and then a mod_cgi POST.
---------------------
I compiled and loaded mod_logio so that I could verify that apache is
getting the POST data.  It is.  Here's my log format:
   LogFormat "%P %t \"%r\" %>s %b %U %I %O" joe1
Here's the result:
 24184 [25/May/2005:17:02:05 -0400] "GET /MRcgi-mp/MRtest.pl?var=1&var2=2 HTTP/1.1" 200 631 /MRcgi-mp/MRtest.pl 523 886
 24184 [25/May/2005:17:02:08 -0400] "POST /MRcgi/MRtest2.pl HTTP/1.1" 200 631 /MRcgi/MRtest2.pl 610 885
(The above POST shows 610 bytes of input, but the script never sees it.)
---------------------
I've reproduced this on multiple apaches on one machine (solaris) and
one apache on a linux.  The details below are for the latest version
(apache 2.0.54 and mod_perl 2.0), which I just installed today.  The
other configuration I've used is apache 2.0.50 and mod_perl 1.999.22,
with identical results.
---------------------
I've tried both CGI.pm and manually reading STDIN:
            read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
neither works.  (empty $in from read, empty hash from CGI's params method)
---------------------
TEST SCRIPT:
---------------------
I first saw this problem in a few larger scripts, but I've boiled it
down to a simple test script.  I have two copies of the script named
MRtest.pl and MRtest2.pl -- one for mod_perl and one for mod_cgi.

The only part that needs explanation is the commented out BEGIN
block.  On my solaris apache, if I remove the last letter of the line
("e"), everything works.  If I add it back, it fails again.
Consistently.  The same trick doesn't work on my linux -- the error
always occurs.

----------------------------
#!/usr/footprints_perl/bin/perl

use strict;
use warnings;

#BEGIN
#{
#    print "Content-type: text/html\n\ndebugging (b-e-g-i-n)...<BR>\n"; # x the
#}

print "Content-type: text/html\n\ndebugging (main)...<BR>\n";
print "<HTML><BODY>\n";

use CGI;
my $query = new CGI;
my @params = $query->param();
print "recieved " . scalar(@params) . " CGI parameters.<BR>\n";

print "

<FORM NAME=test1 METHOD=POST ACTION=/MRcgi-mp/MRtest.pl>
<INPUT TYPE=HIDDEN NAME=INPUT1 VALUE=1>
<INPUT TYPE=HIDDEN NAME=INPUT2 VALUE=2>
<INPUT TYPE=SUBMIT VALUE=\"Submit post data to MRtest.pl\">
</FORM>

<P>

<FORM NAME=test1 METHOD=POST ACTION=/MRcgi/MRtest2.pl>
<INPUT TYPE=HIDDEN NAME=INPUT1 VALUE=1>
<INPUT TYPE=HIDDEN NAME=INPUT2 VALUE=2>
<INPUT TYPE=SUBMIT VALUE=\"Submit post data to MRtest2.pl\">
</FORM>

<P>
<a href=\"/MRcgi-mp/MRtest.pl?var=1&var2=2\">MRtest.pl (get)</a>
<P>
<a href=\"/MRcgi/MRtest2.pl?var=1&var2=2\">MRtest2.pl (get)</a>

";

print "</BODY></HTML>\n";

---------------------
Also, here's the relevant part of my httpd.conf:

ScriptAlias /MRcgi/ "/export/home/footprints_2018/cgi/"
Alias /MRcgi-mp/ "/export/home/footprints_2018/cgi-mp/"
PerlRequire /export/home/footprints_2018/etc/mod_perl_startup.pl

<Files ~ "MR(login|entrancePage|debugEnv|quickHelp|homepage|directSearch|details|checkBack|search_page|directEdit|logsAlert|register_command|register_page|spellCheck|ABreghome|ABregdetails|ABregsearch_page|test)\.m?pl$">
   SetHandler perl-script
   PerlResponseHandler ModPerl::Registry
   Options +ExecCGI
   PerlOptions +ParseHeaders
   PerlInitHandler Apache2::Reload
</Files>

---------------------
And here's the startup file that the httpd.conf loads:

#!/usr/footprints_perl/bin/perl --
use ModPerl::Registry;
use ModPerl::Util ();
use Apache2::RequestRec ();
use APR::Pool ();
use warnings;
use lib '/export/home/footprints_2018/cgi';
# This is the only place to set ENV vars that seems to carry through to system commands.
$ENV{'PATH'} = join ':', '.', '/export/home/footprints_2018/bin', $ENV{'PATH'} unless $ENV{'PATH'} =~ /footprints_2018\/bin/;
# set a global var so that scripts know they're running under mod_perl:
$FP::mod_perl = 1;

---------------------


Thanks for any help you can give!  Please let me know if I can help
by providing more info or in any other way.

-Joe





2. Used Components and their Configuration:

*** mod_perl version 2.000000

*** using /usr/footprints_perl/lib/site_perl/5.8.1/sun4-solaris/Apache2/BuildConfig.pm

*** Makefile.PL options:
  MP_APR_LIB     => aprext
  MP_AP_PREFIX   => /usr/local/apache2
  MP_COMPAT_1X   => 1
  MP_GENERATE_XS => 1
  MP_LIBNAME     => mod_perl
  MP_USE_DSO     => 1


*** The httpd binary was not found
  (Here's the result of my manually running ./httpd -V)
      virgo(SCM 2018) 3583$ ./httpd -V
      Server version: Apache/2.0.54
      Server built:   May 25 2005 16:13:47
      Server's Module Magic Number: 20020903:9
      Architecture:   32-bit
      Server compiled with....
       -D APACHE_MPM_DIR="server/mpm/prefork"
       -D APR_HAS_SENDFILE
       -D APR_HAS_MMAP
       -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
       -D APR_USE_FCNTL_SERIALIZE
       -D APR_USE_PTHREAD_SERIALIZE
       -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
       -D APR_HAS_OTHER_CHILD
       -D AP_HAVE_RELIABLE_PIPED_LOGS
       -D HTTPD_ROOT="/usr/local/apache2"
       -D SUEXEC_BIN="/usr/local/apache2/bin/suexec"
       -D DEFAULT_PIDLOG="logs/httpd.pid"
       -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
       -D DEFAULT_LOCKFILE="logs/accept.lock"
       -D DEFAULT_ERRORLOG="logs/error_log"
       -D AP_TYPES_CONFIG_FILE="conf/mime.types"
       -D SERVER_CONFIG_FILE="conf/httpd.conf"

*** (apr|apu)-config linking info

 -L/usr/local/apache2/lib -laprutil-0 -lgdbm -lexpat -liconv
 -L/usr/local/apache2/lib -lapr-0 -lsendfile -lrt -lm -lsocket -lnsl -lresolv  -lpthread -ldl



*** /usr/footprints_perl/bin/perl -V
Summary of my perl5 (revision 5.0 version 8 subversion 1) configuration:
  Platform:
    osname=solaris, osvers=2.8, archname=sun4-solaris
    uname='sunos virgo 5.8 generic_108528-19 sun4u sparc sunw,sun-blade-1000 '
    config_args='-Dcc=gcc'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef use5005threads=undef useithreads=undef usemultiplicity=undef
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='gcc', ccflags ='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O',
    cppflags='-fno-strict-aliasing -I/usr/local/include'
    ccversion='', gccversion='2.95.3 20010315 (release)', gccosandvers='solaris2.8'
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=4321
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='gcc', ldflags =' -L/usr/local/lib '
    libpth=/usr/local/lib /usr/lib /usr/ccs/lib
    libs=-lsocket -lnsl -ldl -lm -lc
    perllibs=-lsocket -lnsl -ldl -lm -lc
    libc=/lib/libc.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='  -z ignore -z lazyload -z combreloc'
    cccdlflags='-fPIC', lddlflags=' -G  -z ignore -z lazyload -z combreloc -L/usr/local/lib'


Characteristics of this binary (from libperl): 
  Compile-time options: USE_LARGE_FILES
  Built under solaris
  Compiled at Oct 10 2003 15:07:29
  %ENV:
    PERL_LWP_USE_HTTP_10="1"
  @INC:
    /usr/footprints_perl/lib/5.8.1/sun4-solaris
    /usr/footprints_perl/lib/5.8.1
    /usr/footprints_perl/lib/site_perl/5.8.1/sun4-solaris
    /usr/footprints_perl/lib/site_perl/5.8.1
    /usr/footprints_perl/lib/site_perl
    .

*** Packages of interest status:

Apache2            : -
Apache2::Request   : -
CGI                : 3.08
ExtUtils::MakeMaker: 6.17
LWP                : 5.69
mod_perl           : 1.9914
mod_perl2          : 2.000000


3. This is the core dump trace: (if you get a core dump):

  [CORE TRACE COMES HERE]

This report was generated by /usr/footprints_perl/bin/mp2bug on Wed May 25 20:40:19 2005 GMT.

-------------8<---------- End Bug Report --------------8<----------

Note: Complete the rest of the details and post this bug report to
modperl <at> perl.apache.org. To subscribe to the list send an empty
email to modperl-subscribe@perl.apache.org.