Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

root/trunk/cherrypy/test/test_proxy.py

Revision 1980 (checked in by fumanchu, 3 months ago)

Fix for #782 (X-Forwarded-Ssl).

  • Property svn:eol-style set to native
Line 
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()
Note: See TracBrowser for help on using the browser.

Hosted by WebFaction

Log in as guest/cpguest to create tickets