File: mod_proxy_add_forward.c

package info (click to toggle)
libapache-mod-proxy-add-forward 0.20010201-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 44 kB
  • ctags: 19
  • sloc: ansic: 46
file content (138 lines) | stat: -rw-r--r-- 4,538 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/* ====================================================================
 * "THE FOO LICENSE" (Revision 3.14159265358979323844): 
 *
 * <ask@netcetera.dk> wrote this file. As long as you retain this
 * notice you can do whatever you want with this stuff. If it does
 * anything you didn't want it to do, it is of course your own fault.
 * If we meet some day, and you think this stuff is worth it, you
 * can buy me a beer in return. - Ask Bjoern Hansen.
 *
 * ==================================================================== */

/* proxy_add_forward module
 *
 * This module adds a 'X-Forwarded-For' header to outgoing
 * proxy requests like Squid does.
 *
 * You can then get the client ip back on the "proxied host" by
 * setting r->connection->remote_ip from this header.
 *
 * Ask Bjoern Hansen <ask@netcetera.dk>, October 1998

 * Changes:
 *
 * February 1st 2001: Added X-Host and X-Server-Name forwarding.
 * 
 * January 15 2001: Fixed the copyright to not be ASF's since I never
 *                  got around to put this into mod_perl.
 *
 * April 12 2000: Changed the license to the ASF 1.1 license.
 *
 * April 12 2000: Made it so that we append our IP to an existing
 *                "X-Forwarded-For" line instead of clobbering an 
 *                existing one. - <ahosey@systhug.com>
 *
 * June   8 1999: Added instructions on how to compile it into the
 *                frontend apache
 *
 * April 12 1999: Changed the sample code so it doesn't confuse the
 *                C compiler, ydkhr! Thanks to Mike Whitaker for 
 *                noticing. 
 *
 * March  1 1999: Added sample code on how to use the header with
 *                mod_perl
 * 

To use the module you have to compile it into the frontend part of
your server, I usually copy the module to apache-1.3/src/modules/extra/
and use APACI like:

  ./configure --prefix=/usr/local/apache \
     --activate-module=src/modules/extra/mod_proxy_add_forward.c \
     --enable-module=proxy_add_forward [... more apaci options ...]    

You should also be able to compile and use this module as a
dynamically loaded module (DSO).
 
TMTOWTDI, but I usually make the 'backend' part of the system
something like the following:

in startup.pl:

  sub My::ProxyRemoteAddr ($) {
    my $r = shift;

	# we'll only look at the X-Forwarded-For header if the requests
	# comes from our proxy at localhost
	return OK unless ($r->connection->remote_ip eq "127.0.0.1");

	if (my ($ip) = $r->header_in('X-Forwarded-For') =~ /([^,\s]+)$/) {
	  $r->connection->remote_ip($ip);
	}
	
	return OK;
  }

And in httpd.conf:

  PerlPostReadRequestHandler My::ProxyRemoteAddr
 
 */


#include "httpd.h"
#include "http_config.h"
#include "http_core.h"

module MODULE_VAR_EXPORT proxy_add_forward_module;

static int add_forward_header(request_rec *r)
{
    const char *oldvalue;

    if (r->proxyreq) {
	/* If there is an existing header, append our IP to that. */
	if (oldvalue = ap_table_get(r->headers_in, "X-Forwarded-For")) {
	    ap_table_set(r->headers_in, "X-Forwarded-For",
			 ap_pstrcat(r->pool, oldvalue, ", ", 
				    r->connection->remote_ip, NULL));
	}
	else {
          ap_table_set(r->headers_in, "X-Forwarded-For",
                       r->connection->remote_ip);
	}

        ap_table_set(r->headers_in, "X-Host",
                     ap_table_get(r->headers_in, "Host"));

        ap_table_set(r->headers_in, "X-Server-Hostname",
                     r->server->server_hostname);

	return OK;
    }
    return DECLINED;
}

module MODULE_VAR_EXPORT proxy_add_forward_module = {
    STANDARD_MODULE_STUFF,
    NULL,                       /* initializer */
    NULL,                       /* dir config creater */
    NULL,                       /* dir merger --- default is to override */
    NULL,                       /* server config */
    NULL,                       /* merge server configs */
    NULL,                       /* command table */
    NULL,                       /* handlers */
    NULL,                       /* filename translation */
    NULL,                       /* check_user_id */
    NULL,                       /* check auth */
    NULL,                       /* check access */
    NULL,                       /* type_checker */
    add_forward_header,         /* fixups */
    NULL,                       /* logger */
    NULL,                       /* header parser */
    NULL,                       /* child_init */
    NULL,                       /* child_exit */
    NULL                        /* post read-request */
};