diff -aur ../Pound-2.3.2/http.c ../Pound-XForwardedForHeader-fix/http.c --- ../Pound-2.3.2/http.c 2007-09-27 11:49:54.000000000 +0100 +++ ../Pound-XForwardedForHeader-fix/http.c 2007-09-27 13:50:12.000000000 +0100 @@ -451,7 +451,7 @@ X509 *x509; char request[MAXBUF], response[MAXBUF], buf[MAXBUF], url[MAXBUF], loc_path[MAXBUF], **headers, headers_ok[MAXHEADERS], v_host[MAXBUF], referer[MAXBUF], u_agent[MAXBUF], u_name[MAXBUF], - caddr[MAXBUF], req_time[LOG_TIME_SIZE], s_res_bytes[LOG_BYTES_SIZE], *mh; + caddr[MAXBUF], req_time[LOG_TIME_SIZE], s_res_bytes[LOG_BYTES_SIZE], *mh, x_forwarded_for[MAXBUF]; SSL *ssl; long cont, res_bytes; struct sockaddr_in *srv; @@ -546,7 +546,7 @@ for(cl_11 = be_11 = 0;;) { res_bytes = 0L; - v_host[0] = referer[0] = u_agent[0] = u_name[0] = '\0'; + v_host[0] = referer[0] = u_agent[0] = u_name[0] = x_forwarded_for[0] = '\0'; conn_closed = 0; for(n = 0; n < MAXHEADERS; n++) headers_ok[n] = 1; @@ -621,6 +621,14 @@ else cont = atol(buf); break; + case HEADER_X_FORWARDED_FOR: + strcpy(x_forwarded_for, buf); + + /* this header is manually regenerated later - so + * don't automatically pass on the request header version + */ + headers_ok[n] = 0; + break; case HEADER_ILLEGAL: if(lstn->log_level > 0) { addr2str(caddr, MAXBUF - 1, &from_host); @@ -938,8 +946,17 @@ } /* put additional client IP header */ if(cur_backend->be_type == BACK_END) { - addr2str(caddr, MAXBUF - 1, &from_host); - BIO_printf(be, "X-Forwarded-For: %s\r\n", caddr); + addr2str(caddr, MAXBUF - 1, &from_host); + + char* new_x_forwarded_for_header; + + if (x_forwarded_for != NULL && strlen(x_forwarded_for) > 0) { + new_x_forwarded_for_header = strcat(strcat(x_forwarded_for, ", "), caddr); + } + else { + new_x_forwarded_for_header = caddr; + } + BIO_printf(be, "X-Forwarded-For: %s\r\n", new_x_forwarded_for_header); /* final CRLF */ BIO_puts(be, "\r\n"); diff -aur ../Pound-2.3.2/pound.h ../Pound-XForwardedForHeader-fix/pound.h --- ../Pound-2.3.2/pound.h 2007-09-27 11:49:54.000000000 +0100 +++ ../Pound-XForwardedForHeader-fix/pound.h 2007-09-27 11:59:31.000000000 +0100 @@ -385,6 +385,7 @@ #define HEADER_USER_AGENT 8 #define HEADER_URI 9 #define HEADER_DESTINATION 10 +#define HEADER_X_FORWARDED_FOR 11 /* control request stuff */ typedef enum { diff -aur ../Pound-2.3.2/svc.c ../Pound-XForwardedForHeader-fix/svc.c --- ../Pound-2.3.2/svc.c 2007-09-27 11:49:54.000000000 +0100 +++ ../Pound-XForwardedForHeader-fix/svc.c 2007-09-27 12:01:36.000000000 +0100 @@ -369,6 +369,7 @@ { "Referer", 7, HEADER_REFERER }, { "User-agent", 10, HEADER_USER_AGENT }, { "Destination", 11, HEADER_DESTINATION }, + { "X-Forwarded-For", 15, HEADER_X_FORWARDED_FOR }, { "", 0, HEADER_OTHER }, }; int i;