1 import cherrypy
2 from cherrypy.test import helper
3
4 script_names = ["", "/path/to/myapp"]
5
6
8
10
11
12 cherrypy.config.update({
13 'tools.proxy.on': True,
14 'tools.proxy.base': 'www.mydomain.test',
15 })
16
17
18
19 class Root:
20
21 def __init__(self, sn):
22
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
64 self.getPage("/")
65 self.assertHeader('Location',
66 "%s://www.mydomain.test%s/dummy" %
67 (self.scheme, self.prefix()))
68
69
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
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
83 self.getPage("/remoteip",
84 headers=[('X-Forwarded-For', '192.168.0.20')])
85 self.assertBody("192.168.0.20")
86
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
94 self.getPage("/xhost", headers=[('X-Host', 'www.example.test')])
95 self.assertHeader('Location', "%s://www.example.test/blah" %
96 self.scheme)
97
98
99 self.getPage("/base", headers=[('X-Forwarded-Proto', 'https')])
100 self.assertBody("https://www.mydomain.test")
101
102
103 self.getPage("/ssl", headers=[('X-Forwarded-Ssl', 'on')])
104 self.assertBody("https://www.mydomain.test")
105
106
107 for sn in script_names:
108
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
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
134
135 self.getPage("/xhost/", headers=[('X-Host', 'www.example.test')])
136 self.assertHeader('Location', "%s://www.example.test/xhost"
137 % self.scheme)
138