My CGI scripts need to recontruct the absolute URI that the client
browser used.  However, that information is lost if they run under an
accelerated Apache behind squid.  The HTTP_ and SERVER_ environment
vars reflect squid's connection to Apache, not the client to squid.
So, I modified the latest squid from CVS to add an X-Forwarded-URI
header.  The diff is below for your patching pleasure.
--Noel
diff -ur squid/src/HttpHeader.c squid-nbk/src/HttpHeader.c
--- squid/src/HttpHeader.c	Fri Apr 13 17:31:01 2001
+++ squid-nbk/src/HttpHeader.c	Thu Aug  9 15:33:48 2001
@@ -123,6 +123,8 @@
     {"X-Cache-Lookup", HDR_X_CACHE_LOOKUP, ftStr},
     {"X-Forwarded-For", HDR_X_FORWARDED_FOR, ftStr},
     {"X-Request-URI", HDR_X_REQUEST_URI, ftStr},
+    /* NBK - Aug 9, 2001: record the client's URI in forwarded requests */
+    {"X-Forwarded-URI", HDR_X_FORWARDED_URI, ftStr},
     {"X-Squid-Error", HDR_X_SQUID_ERROR, ftStr},
     {"Negotiate", HDR_NEGOTIATE, ftStr},
 #if X_ACCELERATOR_VARY
@@ -161,6 +163,7 @@
 #if X_ACCELERATOR_VARY
     HDR_X_ACCELERATOR_VARY,
 #endif
+    HDR_X_FORWARDED_URI,
     HDR_X_FORWARDED_FOR
 };
 
diff -ur squid/src/client_side.c squid-nbk/src/client_side.c
--- squid/src/client_side.c	Sat Jul 28 15:34:19 2001
+++ squid-nbk/src/client_side.c	Thu Aug  9 15:32:59 2001
@@ -302,10 +302,22 @@
             new_request = urlParse(old_request->method, result);
     }
     if (new_request) {
+
+	httpHeaderAppend(&new_request->header, &old_request->header);
+
+	/* NBK - Aug 8, 2001: append X-Forwarded-URI */
+	if( http->forwarded_uri ) {
+	    String str;
+
+	    str = httpHeaderGetList(&new_request->header, HDR_X_FORWARDED_URI);
+	    strListAdd(&str, http->forwarded_uri, ',');
+	    httpHeaderPutStr(&new_request->header, HDR_X_FORWARDED_URI, strBuf(str));
+	    stringClean(&str);
+	}
+
         safe_free(http->uri);
         http->uri = xstrdup(urlCanonical(new_request));
         new_request->http_ver = old_request->http_ver;
-	httpHeaderAppend(&new_request->header, &old_request->header);
         new_request->client_addr = old_request->client_addr;
         new_request->my_addr = old_request->my_addr;
         new_request->my_port = old_request->my_port;
@@ -813,6 +825,7 @@
         checkFailureRatio(request->err_type, http->al.hier.code);
     safe_free(http->uri);
     safe_free(http->log_uri);
+    safe_free(http->forwarded_uri);
     safe_free(http->al.headers.request);
     safe_free(http->al.headers.reply);
     safe_free(http->redirect.location);
@@ -1364,6 +1377,7 @@
     httpHeaderPutStr(hdr, HDR_X_REQUEST_URI,
         http->entry->mem_obj->url ? http->entry->mem_obj->url : http->uri);
 #endif
+
     httpHdrMangleList(hdr, request);
 }
 
@@ -2671,6 +2685,28 @@
         http->log_uri = xstrndup(http->uri, MAX_URL);
     else
         http->log_uri = xstrndup(rfc1738_escape_unescaped(http->uri), MAX_URL);
+
+    /* X-Forwarded-URI */
+    {
+	const char *proto, *host;
+	int port;
+
+	proto = "http";
+	if( Config.Sockaddr.https->s.sin_port == http->conn->me.sin_port ) {
+	    proto = "https";
+	}
+	port = ntohs(http->conn->me.sin_port);
+	host = mime_get_header(req_hdr, "Host");
+	if( !host ) {
+	    host = getMyHostname();
+	}
+	http->forwarded_uri = xcalloc(MAX_URL+32, 1);
+	if( http->forwarded_uri ) {
+	    snprintf(http->forwarded_uri, MAX_URL+32, 
+		     "%s://%s:%d%s", proto, host, port, url);
+	}
+    }
+
     debug(33, 5) ("parseHttpRequest: Complete request received\n");
     xfree(inbuf);
     *status = 1;
diff -ur squid/src/debug.c squid-nbk/src/debug.c
--- squid/src/debug.c	Fri Jun 29 15:34:19 2001
+++ squid-nbk/src/debug.c	Thu Aug  9 15:31:59 2001
@@ -55,7 +55,10 @@
 {
     const char *format = NULL;
 #endif
-    LOCAL_ARRAY(char, f, BUFSIZ);
+
+    /* NBK - Aug 9, 2001: for some reason, LOCAL_ARRAY here crashes on
+       my RedHat-7.1 box */
+    char f[BUFSIZ];
     va_list args1;
 #if STDC_HEADERS
     va_list args2;
@@ -68,7 +71,7 @@
 #define args3 args1
     format = va_arg(args1, const char *);
 #endif
-    snprintf(f, BUFSIZ, "%s| %s",
+    snprintf(f, sizeof(f), "%s| %s",
         debugLogTime(squid_curtime),
         format);
     _db_print_file(f, args1);
diff -ur squid/src/enums.h squid-nbk/src/enums.h
--- squid/src/enums.h	Fri Apr 20 14:35:33 2001
+++ squid-nbk/src/enums.h	Thu Aug  9 15:23:13 2001
@@ -238,6 +238,8 @@
 #if X_ACCELERATOR_VARY
     HDR_X_ACCELERATOR_VARY,
 #endif
+    /* NBK - Aug 9, 2001: record the client's URI in forwarded requests */
+    HDR_X_FORWARDED_URI,
     HDR_OTHER,
     HDR_ENUM_END
 } http_hdr_type;
diff -ur squid/src/structs.h squid-nbk/src/structs.h
--- squid/src/structs.h	Sat Jul 28 15:34:19 2001
+++ squid-nbk/src/structs.h	Thu Aug  9 15:27:21 2001
@@ -1012,6 +1012,8 @@
     store_client *old_sc;	/* ... for entry to be validated */
     char *uri;
     char *log_uri;
+    /* NBK - Aug 9, 2001: record the client's URI in forwarded requests */
+    char *forwarded_uri;
     struct {
         off_t offset;
         size_t size;
Received on Wed Aug 15 2001 - 16:46:53 MDT
This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:14:12 MST