httpd-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Marcos Gutiérrez Batz <sac...@gmail.com>
Subject [users@httpd] Apache2 sends two HTTP headers with a mapped “nph-” CGI
Date Tue, 18 Mar 2014 22:06:20 GMT
I'm having some problems when trying to map a file extension into a nph 
cgi executable. I've already asked for a solution in StackOverflow (
http://stackoverflow.com/questions/22483281/apache2-sends-two-http-headers-with-a-mapped-nph-cgi).

But I guess that list is a better place to do that:


    Summary

I'm trying to map some file extensions to be executed by a nph (Non 
Parsed Header) CGI executable.

Let's say I want to access a URL |http://server/file.ext| and map the 
"ext" file extension to "trigger" the execution of my nph CGI 
(/var/www/cgi-bin/nph-test.sh).


    Apache configuration

To do that I'm using mod_actions and mod_cgid, this is my relevant 
configuration information:

|<VirtualHost *:80>
         DocumentRoot /var/www/htdocs
         ScriptAlias /cgi-bin /var/www/cgi-bin

         Action cgi-wrapper /cgi-bin/nph-test.sh

         AddHandler cgi-wrapper .ext
</VirtualHost>
|


    NPH CGI script

This is my nph-test.sh shell:

|#!/bin/sh

echo "HTTP/1.0 200 OK"
echo "Server: Shell/1.0"
echo "Status: 200 \"OK\""
echo "Connection: close"
echo "Content-type: text/html"
echo ""
echo "<html><body><pre>"
echo "QUERY_STRING = "${QUERY_STRING}
echo "PATH_TRANSLATED = "${PATH_TRANSLATED}
echo "</pre></body></html>"
|


    Problem

When I access nph-test.sh with this URL 
|http://localhost/cgi-bin/nph-test.sh?Hello| I get:

|HTTP/1.0 200 OK
Server: Shell/1.0
Status: 200 "OK"
Connection: close
Content-type: text/html

<html><body><pre>
QUERY_STRING = Hello
PATH_TRANSLATED =
</pre></body></html>
|

The problem appears when using the file mapping like in this URL 
|http://localhost/file.ext| I get a *double* http header (it's treating 
the nph cgi script like a *non* nph cgi script):

|HTTP/1.0 200 OK
Server: Shell/1.0
Status: 200 "OK"
Connection: close
Content-type: text/html

<html><body><pre>
QUERY_STRING =
PATH_TRANSLATED = /var/www/htdocs/file.ext
</pre></body></html>
HTTP/1.1 200 OK^M
Date: Tue, 18 Mar 2014 14:32:29 GMT^M
Server: Apache/2.4.6 (Ubuntu)^M
Content-Length: 0^M
Keep-Alive: timeout=5, max=100^M
Connection: Keep-Alive^M
Content-Type: text/x-sh^M
^M
|


    My findings

After searching for some hours I only found this 2003 apache bug report 
(https://issues.apache.org/bugzilla/show_bug.cgi?id=22898) 
<https://issues.apache.org/bugzilla/show_bug.cgi?id=22898>. Which also 
suggests a patch that in theory has not being applied.

But searching the current mod_cgid source 
code(http://people.apache.org/~igalic/checks/httpd/2012-09-14-2/report-hrDYB3.html) 
<http://people.apache.org/%7Eigalic/checks/httpd/2012-09-14-2/report-hrDYB3.html> 
I can see that the code has been changed to be able to capture the 
"nph-" cgi file prefix (strrchr):

|1372 if ((argv0 = strrchr(r->filename, '/')) != NULL) {
1373    argv0++;
1374 }
1375 else {
1376    argv0 = r->filename;
1377 }
1378
1379 nph = !(strncmp(argv0, "nph-", 4));
|


    Question

Is there a way with apache2 to map a file extension to a nph cgi? 
(without returning two http headers)

Are there other ways to do that or any workarounds?


    Apache and OS server information

I'm using the default apache2 server in Ubuntu 13.10:

|# apachectl -V
Server version: Apache/2.4.6 (Ubuntu)
Server built:   Dec  5 2013 18:32:22
Server's Module Magic Number: 20120211:23
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     event
   threaded:     yes (fixed thread count)
     forked:     yes (variable process count)
Server compiled with....
  -D APR_HAS_SENDFILE
  -D APR_HAS_MMAP
  -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
  -D APR_USE_SYSVSEM_SERIALIZE
  -D APR_USE_PTHREAD_SERIALIZE
  -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
  -D APR_HAS_OTHER_CHILD
  -D AP_HAVE_RELIABLE_PIPED_LOGS
  -D DYNAMIC_MODULE_LIMIT=256
  -D HTTPD_ROOT="/etc/apache2"
  -D SUEXEC_BIN="/usr/lib/apache2/suexec"
  -D DEFAULT_PIDLOG="/var/run/apache2.pid"
  -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
  -D DEFAULT_ERRORLOG="logs/error_log"
  -D AP_TYPES_CONFIG_FILE="mime.types"
  -D SERVER_CONFIG_FILE="apache2.conf"
|


Best regards and thank you for any guide!
Marcos


Mime
View raw message