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

Source Code for Module cherrypy.test.test_proxy

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