From 90163734aa21f38bb4d0b67339d08b98b1e4a0fc Mon Sep 17 00:00:00 2001 From: Kelketek Date: Wed, 6 Feb 2013 01:07:25 -0600 Subject: [PATCH] Added support for X-Forwarded-For. --- src/server/webserver.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/server/webserver.py b/src/server/webserver.py index 14774c27aa..4104e42f44 100644 --- a/src/server/webserver.py +++ b/src/server/webserver.py @@ -11,7 +11,7 @@ application. a great example/aid on how to do this.) """ -from twisted.web import resource +from twisted.web import resource, http from twisted.python import threadpool from twisted.internet import reactor from twisted.application import service, internet @@ -19,6 +19,31 @@ from twisted.application import service, internet from twisted.web.wsgi import WSGIResource from django.core.handlers.wsgi import WSGIHandler +from settings import UPSTREAM_IPS + +# +# X-Forwarded-For Handler +# + +class HTTPChannelWithXForwardedFor(http.HTTPChannel): + def allHeadersReceived(self): + """ + Check to see if this is a reverse proxied connection. + """ + IP = 0 + PORT = 1 + http.HTTPChannel.allHeadersReceived(self) + req = self.requests[-1] + client_ip, port = self.transport.client + forwarded = req.getHeader('X-FORWARDED-FOR') + if forwarded and client_ip in UPSTREAM_IPS: + self.transport.client = (forwarded, port) + + +# Monkey-patch Twisted to handle X-Forwarded-For. + +http.HTTPFactory.protocol = HTTPChannelWithXForwardedFor + # # Website server resource #