from cherrypy.test import test test.prefer_parent_path() import cherrypy script_names = ["", "/path/to/myapp"] def setup_server(): class Root: def index(self): raise cherrypy.HTTPRedirect('dummy') index.exposed = True def remoteip(self): return cherrypy.request.remote.ip remoteip.exposed = True def xhost(self): raise cherrypy.HTTPRedirect('blah') xhost.exposed = True xhost._cp_config = {'tools.proxy.local': 'X-Host', 'tools.trailing_slash.extra': True, } def base(self): return cherrypy.request.base base.exposed = True def newurl(self): return ("Browse to this page." % cherrypy.url("/this/new/page")) newurl.exposed = True for sn in script_names: cherrypy.tree.mount(Root(), sn) cherrypy.config.update({ 'environment': 'test_suite', 'tools.proxy.on': True, 'tools.proxy.base': 'www.mydomain.com', }) from cherrypy.test import helper class ProxyTest(helper.CPWebCase): def testProxy(self): self.getPage("/") self.assertHeader('Location', "%s://www.mydomain.com%s/dummy" % (self.scheme, self.prefix())) # Test X-Forwarded-Host (Apache 1.3.33+ and Apache 2) self.getPage("/", headers=[('X-Forwarded-Host', 'http://www.yetanother.com')]) self.assertHeader('Location', "http://www.yetanother.com/dummy") self.getPage("/", headers=[('X-Forwarded-Host', 'www.yetanother.com')]) self.assertHeader('Location', "%s://www.yetanother.com/dummy" % self.scheme) # Test X-Forwarded-For (Apache2) self.getPage("/remoteip", headers=[('X-Forwarded-For', '192.168.0.20')]) self.assertBody("192.168.0.20") self.getPage("/remoteip", headers=[('X-Forwarded-For', '67.15.36.43, 192.168.0.20')]) self.assertBody("192.168.0.20") # Test X-Host (lighttpd; see https://trac.lighttpd.net/trac/ticket/418) self.getPage("/xhost", headers=[('X-Host', 'www.yetanother.com')]) self.assertHeader('Location', "%s://www.yetanother.com/blah" % self.scheme) # Test X-Forwarded-Proto (lighttpd) self.getPage("/base", headers=[('X-Forwarded-Proto', 'https')]) self.assertBody("https://www.mydomain.com") # Test cherrypy.url() for sn in script_names: # Test the value inside requests self.getPage(sn + "/newurl") self.assertBody("Browse to this page.") self.getPage(sn + "/newurl", headers=[('X-Forwarded-Host', 'http://www.yetanother.com')]) self.assertBody("Browse to this page.") # Test the value outside requests port = "" if self.scheme == "http" and self.PORT != 80: port = ":%s" % self.PORT elif self.scheme == "https" and self.PORT != 443: port = ":%s" % self.PORT host = self.HOST if host == '': import socket host = socket.gethostname() self.assertEqual(cherrypy.url("/this/new/page", script_name=sn), "%s://%s%s%s/this/new/page" % (self.scheme, host, port, sn)) # Test trailing slash (see http://www.cherrypy.org/ticket/562). self.getPage("/xhost/", headers=[('X-Host', 'www.yetanother.com')]) self.assertHeader('Location', "%s://www.yetanother.com/xhost" % self.scheme) if __name__ == '__main__': setup_server() helper.testmain()