Package cherrypy :: Package test :: Module test_proxy
[hide private]
[frames] | no frames]

Source Code for Module cherrypy.test.test_proxy

  1  import cherrypy 
  2  from cherrypy.test import helper 
  3   
  4  script_names = ["", "/path/to/myapp"] 
  5   
  6   
7 -class ProxyTest(helper.CPWebCase):
8
9 - def setup_server():
10 11 # Set up site 12 cherrypy.config.update({ 13 'tools.proxy.on': True, 14 'tools.proxy.base': 'www.mydomain.test', 15 }) 16 17 # Set up application 18 19 class Root: 20 21 def __init__(self, sn): 22 # Calculate a URL outside of any requests. 23 self.thisnewpage = cherrypy.url( 24 "/this/new/page", script_name=sn)
25 26 def pageurl(self): 27 return self.thisnewpage
28 pageurl.exposed = True 29 30 def index(self): 31 raise cherrypy.HTTPRedirect('dummy') 32 index.exposed = True 33 34 def remoteip(self): 35 return cherrypy.request.remote.ip 36 remoteip.exposed = True 37 38 def xhost(self): 39 raise cherrypy.HTTPRedirect('blah') 40 xhost.exposed = True 41 xhost._cp_config = {'tools.proxy.local': 'X-Host', 42 'tools.trailing_slash.extra': True, 43 } 44 45 def base(self): 46 return cherrypy.request.base 47 base.exposed = True 48 49 def ssl(self): 50 return cherrypy.request.base 51 ssl.exposed = True 52 ssl._cp_config = {'tools.proxy.scheme': 'X-Forwarded-Ssl'} 53 54 def newurl(self): 55 return ("Browse to <a href='%s'>this page</a>." 56 % cherrypy.url("/this/new/page")) 57 newurl.exposed = True 58 59 for sn in script_names: 60 cherrypy.tree.mount(Root(sn), sn) 61 setup_server = staticmethod(setup_server) 62
63 - def testProxy(self):
64 self.getPage("/") 65 self.assertHeader('Location', 66 "%s://www.mydomain.test%s/dummy" % 67 (self.scheme, self.prefix())) 68 69 # Test X-Forwarded-Host (Apache 1.3.33+ and Apache 2) 70 self.getPage( 71 "/", headers=[('X-Forwarded-Host', 'http://www.example.test')]) 72 self.assertHeader('Location', "http://www.example.test/dummy") 73 self.getPage("/", headers=[('X-Forwarded-Host', 'www.example.test')]) 74 self.assertHeader('Location', "%s://www.example.test/dummy" % 75 self.scheme) 76 # Test multiple X-Forwarded-Host headers 77 self.getPage("/", headers=[ 78 ('X-Forwarded-Host', 'http://www.example.test, www.cherrypy.test'), 79 ]) 80 self.assertHeader('Location', "http://www.example.test/dummy") 81 82 # Test X-Forwarded-For (Apache2) 83 self.getPage("/remoteip", 84 headers=[('X-Forwarded-For', '192.168.0.20')]) 85 self.assertBody("192.168.0.20") 86 #Fix bug #1268 87 self.getPage("/remoteip", 88 headers=[ 89 ('X-Forwarded-For', '67.15.36.43, 192.168.0.20') 90 ]) 91 self.assertBody("67.15.36.43") 92 93 # Test X-Host (lighttpd; see https://trac.lighttpd.net/trac/ticket/418) 94 self.getPage("/xhost", headers=[('X-Host', 'www.example.test')]) 95 self.assertHeader('Location', "%s://www.example.test/blah" % 96 self.scheme) 97 98 # Test X-Forwarded-Proto (lighttpd) 99 self.getPage("/base", headers=[('X-Forwarded-Proto', 'https')]) 100 self.assertBody("https://www.mydomain.test") 101 102 # Test X-Forwarded-Ssl (webfaction?) 103 self.getPage("/ssl", headers=[('X-Forwarded-Ssl', 'on')]) 104 self.assertBody("https://www.mydomain.test") 105 106 # Test cherrypy.url() 107 for sn in script_names: 108 # Test the value inside requests 109 self.getPage(sn + "/newurl") 110 self.assertBody( 111 "Browse to <a href='%s://www.mydomain.test" % self.scheme 112 + sn + "/this/new/page'>this page</a>.") 113 self.getPage(sn + "/newurl", headers=[('X-Forwarded-Host', 114 'http://www.example.test')]) 115 self.assertBody("Browse to <a href='http://www.example.test" 116 + sn + "/this/new/page'>this page</a>.") 117 118 # Test the value outside requests 119 port = "" 120 if self.scheme == "http" and self.PORT != 80: 121 port = ":%s" % self.PORT 122 elif self.scheme == "https" and self.PORT != 443: 123 port = ":%s" % self.PORT 124 host = self.HOST 125 if host in ('0.0.0.0', '::'): 126 import socket 127 host = socket.gethostname() 128 expected = ("%s://%s%s%s/this/new/page" 129 % (self.scheme, host, port, sn)) 130 self.getPage(sn + "/pageurl") 131 self.assertBody(expected) 132 133 # Test trailing slash (see 134 # https://bitbucket.org/cherrypy/cherrypy/issue/562). 135 self.getPage("/xhost/", headers=[('X-Host', 'www.example.test')]) 136 self.assertHeader('Location', "%s://www.example.test/xhost" 137 % self.scheme)
138