2 from cherrypy
.test
import helper
4 script_names
= ["", "/path/to/myapp"]
7 class ProxyTest(helper
.CPWebCase
):
12 cherrypy
.config
.update({
13 'tools.proxy.on': True,
14 'tools.proxy.base': 'www.mydomain.test',
21 def __init__(self
, sn
):
22 # Calculate a URL outside of any requests.
23 self
.thisnewpage
= cherrypy
.url("/this/new/page", script_name
=sn
)
26 return self
.thisnewpage
27 pageurl
.exposed
= True
30 raise cherrypy
.HTTPRedirect('dummy')
34 return cherrypy
.request
.remote
.ip
35 remoteip
.exposed
= True
38 raise cherrypy
.HTTPRedirect('blah')
40 xhost
._cp
_config
= {'tools.proxy.local': 'X-Host',
41 'tools.trailing_slash.extra': True,
45 return cherrypy
.request
.base
49 return cherrypy
.request
.base
51 ssl
._cp
_config
= {'tools.proxy.scheme': 'X-Forwarded-Ssl'}
54 return ("Browse to <a href='%s'>this page</a>."
55 % cherrypy
.url("/this/new/page"))
58 for sn
in script_names
:
59 cherrypy
.tree
.mount(Root(sn
), sn
)
60 setup_server
= staticmethod(setup_server
)
64 self
.assertHeader('Location',
65 "%s://www.mydomain.test%s/dummy" %
66 (self
.scheme
, self
.prefix()))
68 # Test X-Forwarded-Host (Apache 1.3.33+ and Apache 2)
69 self
.getPage("/", headers
=[('X-Forwarded-Host', 'http://www.example.test')])
70 self
.assertHeader('Location', "http://www.example.test/dummy")
71 self
.getPage("/", headers
=[('X-Forwarded-Host', 'www.example.test')])
72 self
.assertHeader('Location', "%s://www.example.test/dummy" % self
.scheme
)
73 # Test multiple X-Forwarded-Host headers
74 self
.getPage("/", headers
=[
75 ('X-Forwarded-Host', 'http://www.example.test, www.cherrypy.test'),
77 self
.assertHeader('Location', "http://www.example.test/dummy")
79 # Test X-Forwarded-For (Apache2)
80 self
.getPage("/remoteip",
81 headers
=[('X-Forwarded-For', '192.168.0.20')])
82 self
.assertBody("192.168.0.20")
83 self
.getPage("/remoteip",
84 headers
=[('X-Forwarded-For', '67.15.36.43, 192.168.0.20')])
85 self
.assertBody("192.168.0.20")
87 # Test X-Host (lighttpd; see https://trac.lighttpd.net/trac/ticket/418)
88 self
.getPage("/xhost", headers
=[('X-Host', 'www.example.test')])
89 self
.assertHeader('Location', "%s://www.example.test/blah" % self
.scheme
)
91 # Test X-Forwarded-Proto (lighttpd)
92 self
.getPage("/base", headers
=[('X-Forwarded-Proto', 'https')])
93 self
.assertBody("https://www.mydomain.test")
95 # Test X-Forwarded-Ssl (webfaction?)
96 self
.getPage("/ssl", headers
=[('X-Forwarded-Ssl', 'on')])
97 self
.assertBody("https://www.mydomain.test")
100 for sn
in script_names
:
101 # Test the value inside requests
102 self
.getPage(sn
+ "/newurl")
103 self
.assertBody("Browse to <a href='%s://www.mydomain.test" % self
.scheme
104 + sn
+ "/this/new/page'>this page</a>.")
105 self
.getPage(sn
+ "/newurl", headers
=[('X-Forwarded-Host',
106 'http://www.example.test')])
107 self
.assertBody("Browse to <a href='http://www.example.test"
108 + sn
+ "/this/new/page'>this page</a>.")
110 # Test the value outside requests
112 if self
.scheme
== "http" and self
.PORT
!= 80:
113 port
= ":%s" % self
.PORT
114 elif self
.scheme
== "https" and self
.PORT
!= 443:
115 port
= ":%s" % self
.PORT
117 if host
in ('0.0.0.0', '::'):
119 host
= socket
.gethostname()
120 expected
= ("%s://%s%s%s/this/new/page"
121 % (self
.scheme
, host
, port
, sn
))
122 self
.getPage(sn
+ "/pageurl")
123 self
.assertBody(expected
)
125 # Test trailing slash (see http://www.cherrypy.org/ticket/562).
126 self
.getPage("/xhost/", headers
=[('X-Host', 'www.example.test')])
127 self
.assertHeader('Location', "%s://www.example.test/xhost"