Gmane
From: Christian Seiler <chris_se@...>
Subject: [PATCH] Incorrect handling of -pass-header
Newsgroups: gmane.comp.web.fastcgi.devel
Date: 2007-11-20 21:34:00 GMT (1 year, 32 weeks, 3 days, 17 hours and 26 minutes ago)
Hi,

I was just trying to set up PHP 5 with FastCGI and Suexec and discovered
that HTTP Authentication [1] didn't work with PHP. After reading the
manual I thought that using

FastCgiConfig -pass-header Authorization

it would work. But actually, it didn't. I then used phpinfo() to see
whether this was a problem with PHP or with FastCGI. In the environment
variables set, I found a variable called "Authorization" which was set
to the HTTP Basic Auth string my browser sent. Unfortunately, PHP (and
probably any program conforming to the CGI specification) looks for an
environment variable called "HTTP_AUTHORIZATION" and not "Authorization".

I attached a patch against mod_fastcgi 2.4.6 that will create the
correct environment variable instead. I borrowed a function from
server/util_script.c from Apache 2.2.6 - unfortunately it is not part of
the official Apache API so I couldn't just call it and had to copy it.

Regards,
Christian

[1] http://www.php.net/manual/en/features.http-auth.php
--- fcgi_protocol.c.old	2007-11-20 22:18:11.000000000 +0100
+++ fcgi_protocol.c	2007-11-20 22:18:13.000000000 +0100
@@ -169,6 +169,35 @@
     }
 }

+/*******************************************************************************
+ * Taken from server/util_script.c. Unfortunately, this function is not defined
+ * in any header file.
+ */
+static char *fcgi_http2env(apr_pool_t *a, const char *w)
+{
+    char *res = (char *)apr_palloc(a, sizeof("HTTP_") + strlen(w));
+    char *cp = res;
+    char c;
+
+    *cp++ = 'H';
+    *cp++ = 'T';
+    *cp++ = 'T';
+    *cp++ = 'P';
+    *cp++ = '_';
+
+    while ((c = *w++) != 0) {
+        if (!apr_isalnum(c)) {
+            *cp++ = '_';
+        }
+        else {
+            *cp++ = apr_toupper(c);
+        }
+    }
+    *cp = 0;
+
+    return res;
+}
+
 static void add_pass_header_vars(fcgi_request *fr)
 {
     const array_header *ph = fr->dynamic ? dynamic_pass_headers : fr->fs->pass_headers;
@@ -180,7 +209,7 @@
         for ( ; i; --i, ++elt) {
             const char *val = ap_table_get(fr->r->headers_in, *elt);
             if (val) {
-                ap_table_setn(fr->r->subprocess_env, *elt, val);
+                ap_table_setn(fr->r->subprocess_env, fcgi_http2env (fr->r->pool, *elt), val);
             }
         }
     }
___________________________________
fastcgi-developers mailing list
http://fastcgi.com/fastcgi-developers/