--- squid-2.5.STABLE7/src/client_side.c.orig	Wed Oct  6 01:34:42 2004
+++ squid-2.5.STABLE7/src/client_side.c	Thu Jan 13 16:04:41 2005
@@ -2717,8 +2717,13 @@
 	    int vport;
 	    char *q;
 	    const char *protocol_name = "http";
-	    if (vport_mode)
-		vport = (int) ntohs(http->conn->me.sin_port);
+	    if (vport_mode) {
+#if LINUX_NETFILTER
+		/* If the call fails the address structure will be unchanged */
+		getsockopt(conn->fd, SOL_IP, SO_ORIGINAL_DST, &conn->me, &sock_sz);
+#endif
+		vport = (int) ntohs(conn->me.sin_port);
+	    }
 	    else
 		vport = (int) Config.Accel.port;
 	    /* If a Host: header was specified, use it to build the URL 
@@ -2741,9 +2746,9 @@
 	    http->uri = xcalloc(url_sz, 1);
 
 #if SSL_FORWARDING_NOT_YET_DONE
-	    if (Config.Sockaddr.https->s.sin_port == http->conn->me.sin_port) {
+	    if (Config.Sockaddr.https->s.sin_port == conn->me.sin_port) {
 		protocol_name = "https";
-		vport = ntohs(http->conn->me.sin_port);
+		vport = ntohs(conn->me.sin_port);
 	    }
 #endif
 	    snprintf(http->uri, url_sz, "%s://%s:%d%s",
@@ -2754,14 +2759,14 @@
 	    url_sz = strlen(url) + 32 + Config.appendDomainLen;
 	    http->uri = xcalloc(url_sz, 1);
 	    if (vport_mode)
-		vport = (int) ntohs(http->conn->me.sin_port);
+		vport = (int) ntohs(conn->me.sin_port);
 	    else
 		vport = (int) Config.Accel.port;
 #if IPF_TRANSPARENT
-	    natLookup.nl_inport = http->conn->me.sin_port;
-	    natLookup.nl_outport = http->conn->peer.sin_port;
-	    natLookup.nl_inip = http->conn->me.sin_addr;
-	    natLookup.nl_outip = http->conn->peer.sin_addr;
+	    natLookup.nl_inport = conn->me.sin_port;
+	    natLookup.nl_outport = conn->peer.sin_port;
+	    natLookup.nl_inip = conn->me.sin_addr;
+	    natLookup.nl_outip = conn->peer.sin_addr;
 	    natLookup.nl_flags = IPN_TCP;
 	    if (natfd < 0) {
 		int save_errno;
@@ -2805,7 +2810,7 @@
 		    return parseHttpRequestAbort(conn, "error:nat-lookup-failed");
 		} else
 		    snprintf(http->uri, url_sz, "http://%s:%d%s",
-			inet_ntoa(http->conn->me.sin_addr),
+			inet_ntoa(conn->me.sin_addr),
 			vport, url);
 	    } else {
 		if (vport_mode)
@@ -2823,10 +2828,10 @@
 		return parseHttpRequestAbort(conn, "error:pf-open-failed");
 	    }
 	    memset(&nl, 0, sizeof(struct pfioc_natlook));
-	    nl.saddr.v4.s_addr = http->conn->peer.sin_addr.s_addr;
-	    nl.sport = http->conn->peer.sin_port;
-	    nl.daddr.v4.s_addr = http->conn->me.sin_addr.s_addr;
-	    nl.dport = http->conn->me.sin_port;
+	    nl.saddr.v4.s_addr = conn->peer.sin_addr.s_addr;
+	    nl.sport = conn->peer.sin_port;
+	    nl.daddr.v4.s_addr = conn->me.sin_addr.s_addr;
+	    nl.dport = conn->me.sin_port;
 	    nl.af = AF_INET;
 	    nl.proto = IPPROTO_TCP;
 	    nl.direction = PF_OUT;
@@ -2838,7 +2843,7 @@
 		    return parseHttpRequestAbort(conn, "error:pf-lookup-failed");
 		} else
 		    snprintf(http->uri, url_sz, "http://%s:%d%s",
-			inet_ntoa(http->conn->me.sin_addr),
+			inet_ntoa(conn->me.sin_addr),
 			vport, url);
 	    } else
 		snprintf(http->uri, url_sz, "http://%s:%d%s",
@@ -2848,12 +2853,12 @@
 #if LINUX_NETFILTER
 	    /* If the call fails the address structure will be unchanged */
 	    getsockopt(conn->fd, SOL_IP, SO_ORIGINAL_DST, &conn->me, &sock_sz);
-	    debug(33, 5) ("parseHttpRequest: addr = %s", inet_ntoa(conn->me.sin_addr));
+	    debug(33, 5) ("parseHttpRequest: addr = %s\n", inet_ntoa(conn->me.sin_addr));
 	    if (vport_mode)
-		vport = (int) ntohs(http->conn->me.sin_port);
+		vport = (int) ntohs(conn->me.sin_port);
 #endif
 	    snprintf(http->uri, url_sz, "http://%s:%d%s",
-		inet_ntoa(http->conn->me.sin_addr),
+		inet_ntoa(conn->me.sin_addr),
 		vport, url);
 #endif
 	    debug(33, 5) ("VHOST REWRITE: '%s'\n", http->uri);


