1 import os
2 localDir = os.path.dirname(__file__)
3 logfile = os.path.join(localDir, "test_misc_tools.log")
4
5 import cherrypy
6 from cherrypy import tools
7
8
10 class Root:
11
12 def index(self):
13 yield "Hello, world"
14 index.exposed = True
15 h = [("Content-Language", "en-GB"), ('Content-Type', 'text/plain')]
16 tools.response_headers(headers=h)(index)
17
18 def other(self):
19 return "salut"
20 other.exposed = True
21 other._cp_config = {
22 'tools.response_headers.on': True,
23 'tools.response_headers.headers': [("Content-Language", "fr"),
24 ('Content-Type', 'text/plain')],
25 'tools.log_hooks.on': True,
26 }
27
28 class Accept:
29 _cp_config = {'tools.accept.on': True}
30
31 def index(self):
32 return '<a href="feed">Atom feed</a>'
33 index.exposed = True
34
35
36
37 def feed(self):
38 return """<?xml version="1.0" encoding="utf-8"?>
39 <feed xmlns="http://www.w3.org/2005/Atom">
40 <title>Unknown Blog</title>
41 </feed>"""
42 feed.exposed = True
43 feed._cp_config = {'tools.accept.media': 'application/atom+xml'}
44
45 def select(self):
46
47 mtype = tools.accept.callable(['text/html', 'text/plain'])
48 if mtype == 'text/html':
49 return "<h2>Page Title</h2>"
50 else:
51 return "PAGE TITLE"
52 select.exposed = True
53
54 class Referer:
55
56 def accept(self):
57 return "Accepted!"
58 accept.exposed = True
59 reject = accept
60
61 class AutoVary:
62
63 def index(self):
64
65 ae = cherrypy.request.headers.get('Accept-Encoding')
66
67 cl = cherrypy.request.headers['Host']
68
69 hasif = 'If-Modified-Since' in cherrypy.request.headers
70
71 if hasattr(dict, 'has_key'):
72
73 has = cherrypy.request.headers.has_key('Range')
74 else:
75
76 has = 'Range' in cherrypy.request.headers
77
78 mtype = tools.accept.callable(['text/html', 'text/plain'])
79 return "Hello, world!"
80 index.exposed = True
81
82 conf = {'/referer': {'tools.referer.on': True,
83 'tools.referer.pattern': r'http://[^/]*example\.com',
84 },
85 '/referer/reject': {'tools.referer.accept': False,
86 'tools.referer.accept_missing': True,
87 },
88 '/autovary': {'tools.autovary.on': True},
89 }
90
91 root = Root()
92 root.referer = Referer()
93 root.accept = Accept()
94 root.autovary = AutoVary()
95 cherrypy.tree.mount(root, config=conf)
96 cherrypy.config.update({'log.error_file': logfile})
97
98
99 from cherrypy.test import helper
100
101
114
115
136
137
139 setup_server = staticmethod(setup_server)
140
174
176
177 self.getPage('/accept/select', [('Accept', 'text/html')])
178 self.assertStatus(200)
179 self.assertBody('<h2>Page Title</h2>')
180 self.getPage('/accept/select', [('Accept', 'text/plain')])
181 self.assertStatus(200)
182 self.assertBody('PAGE TITLE')
183 self.getPage('/accept/select',
184 [('Accept', 'text/plain, text/*;q=0.5')])
185 self.assertStatus(200)
186 self.assertBody('PAGE TITLE')
187
188
189
190 self.getPage('/accept/select', [('Accept', 'text/*')])
191 self.assertStatus(200)
192 self.assertBody('<h2>Page Title</h2>')
193 self.getPage('/accept/select', [('Accept', '*/*')])
194 self.assertStatus(200)
195 self.assertBody('<h2>Page Title</h2>')
196
197
198 self.getPage('/accept/select', [('Accept', 'application/xml')])
199 self.assertErrorPage(
200 406,
201 "Your client sent this Accept header: application/xml. "
202 "But this resource only emits these media types: "
203 "text/html, text/plain.")
204
205
216