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

root/branches/cherrypy-2.x/cherrypy/test/standalone_test_alt_script_name.py

Revision 959 (checked in by dowski, 3 years ago)

1. Removed request.wsgi_environ from _cphttpserver.
2. Added cherrypy.server.wsgi_app attribute to ease wrapping the CP wsgiApp with WSGI middleware.
3. Modified _cpwsgiserver to set SCRIPT_NAME to and to instead put the request path in PATH_INFO. Modified _cpwsgi to deal with this change.
4. Added standalone test for mounting the CP wsgiApp at an alternate SCRIPT_NAME. Not sure how best to integrate it into the test suite.

Line 
1 import test
2 test.prefer_parent_path()
3
4 import cherrypy
5 from cherrypy._cpwsgi import wsgiApp, WSGIServer
6
7 class Root:
8     def index(self, name="world"):
9         return name
10     index.exposed = True
11    
12     def default(self, *params):
13         return "default:"+repr(params)
14     default.exposed = True
15    
16     def other(self):
17         return "other"
18     other.exposed = True
19    
20     def extra(self, *p):
21         return repr(p)
22     extra.exposed = True
23    
24     def redirect(self):
25         raise cherrypy.HTTPRedirect('dir1/', 302)
26     redirect.exposed = True
27    
28     def notExposed(self):
29         return "not exposed"
30    
31     def confvalue(self):
32         return cherrypy.config.get("user")
33     confvalue.exposed = True
34
35     def script_name(self):
36         env = getattr(cherrypy.request, 'wsgi_environ', {})
37         sn = env.get('SCRIPT_NAME', '*MISSING*')
38         return sn
39     script_name.exposed = True
40            
41
42 def mapped_func(self, ID=None):
43     return "ID is %s" % ID
44 mapped_func.exposed = True
45 setattr(Root, "Von B\xfclow", mapped_func)
46
47
48 class Exposing:
49     def base(self):
50         return "expose works!"
51     cherrypy.expose(base)
52     cherrypy.expose(base, "1")
53     cherrypy.expose(base, "2")
54
55 class ExposingNewStyle(object):
56     def base(self):
57         return "expose works!"
58     cherrypy.expose(base)
59     cherrypy.expose(base, "1")
60     cherrypy.expose(base, "2")
61
62
63
64 class Dir1:
65     def index(self):
66         return "index for dir1"
67     index.exposed = True
68    
69     def myMethod(self):
70         return "myMethod from dir1, object Path is:" + repr(cherrypy.request.object_path)
71     myMethod.exposed = True
72    
73     def default(self, *params):
74         return "default for dir1, param is:" + repr(params)
75     default.exposed = True
76
77
78 class Dir2:
79     def index(self):
80         return "index for dir2, path is:" + cherrypy.request.path
81     index.exposed = True
82    
83     def mount_point(self):
84         return cherrypy.tree.mount_point()
85     mount_point.exposed = True
86    
87     def tree_url(self):
88         return cherrypy.tree.url("/extra")
89     tree_url.exposed = True
90    
91     def posparam(self, *vpath):
92         return "/".join(vpath)
93     posparam.exposed = True
94
95
96 class Dir3:
97     def default(self):
98         return "default for dir3, not exposed"
99
100
101 class Dir4:
102     def index(self):
103         return "index for dir4, not exposed"
104
105 Root.exposing = Exposing()
106 Root.exposingnew = ExposingNewStyle()
107 Root.dir1 = Dir1()
108 Root.dir1.dir2 = Dir2()
109 Root.dir1.dir2.dir3 = Dir3()
110 Root.dir1.dir2.dir3.dir4 = Dir4()
111
112 mount_points = ["/apps", "/apps/users/fred/blog", "/apps/corp/blog"]
113 for url in mount_points:
114     conf = {'user': url.split("/")[-2]}
115     cherrypy.tree.mount(Root(), url, {'/': conf})
116
117 cherrypy.config.update({
118     'server.log_to_screen': False,
119     'server.environment': "production",
120 })
121
122
123 class Isolated:
124     def index(self):
125         return "made it!"
126     index.exposed = True
127
128 cherrypy.tree.mount(Isolated(), "/apps/isolated")
129
130 # dispatch code courtesy of Ian Bicking
131 # (posted on the python WEB-SIG ml)
132 def dispatch(app_map):
133     app_map = app_map.items()
134     app_map.sort(lambda a, b: -cmp(len(a[0]), len(b[0])))
135     def application(environ, start_response):
136         path_info = environ.get('PATH_INFO', '')
137         for app_prefix, app in app_map:
138             app_prefix = app_prefix.rstrip('/')+'/'
139             if path_info.startswith(app_prefix):
140                 environ['SCRIPT_NAME'] += app_prefix[:-1]
141                 environ['PATH_INFO'] = environ.get(
142                     'PATH_INFO', '')[len(app_prefix)-1:]
143                 return app(environ, start_response)
144             else:
145                 start_response('404 Not Found', [])
146                 return []
147     return application
148
149 mp = '/apps'
150
151 dispatching_app = dispatch({
152   mp: wsgiApp,
153   })
154
155 cherrypy.server.wsgi_app = dispatching_app
156
157 import helper
158
159 class ObjectMappingTest(helper.CPWebCase):
160    
161     def testWSGIMountPoint(self):
162         self.getPage('/missing')
163         self.assertStatus('404 Not Found')
164
165         self.mount_point = mp
166         self.getPage('/script_name')
167         self.assertBody(mp)
168
169     def testObjectMapping(self):
170         for url in mount_points:
171             prefix = self.mount_point = url
172             if prefix == "/":
173                 prefix = ""
174            
175             self.getPage('/')
176             self.assertBody('world')
177            
178             self.getPage("/dir1/myMethod")
179             self.assertBody("myMethod from dir1, object Path is:'%s/dir1/myMethod'"
180                             % prefix)
181            
182             self.getPage("/this/method/does/not/exist")
183             self.assertBody("default:('this', 'method', 'does', 'not', 'exist')")
184            
185             self.getPage("/extra/too/much")
186             self.assertBody("('too', 'much')")
187            
188             self.getPage("/other")
189             self.assertBody('other')
190            
191             self.getPage("/notExposed")
192             self.assertBody("default:('notExposed',)")
193            
194             self.getPage("/dir1/dir2/")
195             self.assertBody('index for dir2, path is:%s/dir1/dir2/'
196                             % prefix)
197            
198             self.getPage("/dir1/dir2")
199             self.assert_(self.status in ('302 Found', '303 See Other'))
200             self.assertHeader('Location', 'http://%s:%s%s/dir1/dir2/'
201                               % (self.HOST, self.PORT, prefix))
202            
203             self.getPage("/dir1/dir2/dir3/dir4/index")
204             self.assertBody("default for dir1, param is:('dir2', 'dir3', 'dir4', 'index')")
205            
206             self.getPage("/redirect")
207             self.assertStatus('302 Found')
208             self.assertHeader('Location', 'http://%s:%s%s/dir1/'
209                               % (self.HOST, self.PORT, prefix))
210            
211             # Test that we can use URL's which aren't all valid Python identifiers
212             # This should also test the %XX-unquoting of URL's.
213             self.getPage("/Von%20B%fclow?ID=14")
214             self.assertBody("ID is 14")
215            
216             # Test that %2F in the path doesn't get unquoted too early;
217             # that is, it should not be used to separate path components.
218             # See ticket #393.
219             self.getPage("/page%2Fname")
220             self.assertBody("default:('page/name',)")
221            
222             self.getPage("/dir1/dir2/mount_point")
223             self.assertBody(url)
224             self.getPage("/dir1/dir2/tree_url")
225             self.assertBody(prefix + "/extra")
226            
227             # Test that configs don't overwrite each other from diferent apps
228             self.getPage("/confvalue")
229             self.assertBody(url.split("/")[-2])
230        
231         self.mount_point = mp
232        
233         # Test that the "isolated" app doesn't leak url's into the root app.
234         # If it did leak, Root.default() would answer with
235         #   "default:('isolated', 'doesnt', 'exist')".
236         self.getPage("/isolated/")
237         self.assertStatus("200 OK")
238         self.assertBody("made it!")
239         self.getPage("/isolated/doesnt/exist")
240         self.assertStatus("404 Not Found")
241    
242     def testPositionalParams(self):
243         self.mount_point = mp
244
245         self.getPage("/dir1/dir2/posparam/18/24/hut/hike")
246         self.assertBody("18/24/hut/hike")
247        
248         # intermediate index methods should not receive posparams;
249         # only the "final" index method should do so.
250         self.getPage("/dir1/dir2/5/3/sir")
251         self.assertBody("default for dir1, param is:('dir2', '5', '3', 'sir')")
252    
253     def testExpose(self):
254         self.mount_point = mp
255        
256         # Test the cherrypy.expose function/decorator
257         self.getPage("/exposing/base")
258         self.assertBody("expose works!")
259        
260         self.getPage("/exposing/1")
261         self.assertBody("expose works!")
262        
263         self.getPage("/exposing/2")
264         self.assertBody("expose works!")
265        
266         self.getPage("/exposingnew/base")
267         self.assertBody("expose works!")
268        
269         self.getPage("/exposingnew/1")
270         self.assertBody("expose works!")
271        
272         self.getPage("/exposingnew/2")
273         self.assertBody("expose works!")
274
275
276
277 if __name__ == "__main__":
278     helper.testmain(WSGIServer)
Note: See TracBrowser for help on using the browser.

Hosted by WebFaction

Log in as guest/cpguest to create tickets