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 def index(self):
12 yield "Hello, world"
13 index.exposed = True
14 h = [("Content-Language", "en-GB"), ('Content-Type', 'text/plain')]
15 tools.response_headers(headers=h)(index)
16
17 def other(self):
18 return "salut"
19 other.exposed = True
20 other._cp_config = {
21 'tools.response_headers.on': True,
22 'tools.response_headers.headers': [("Content-Language", "fr"),
23 ('Content-Type', 'text/plain')],
24 'tools.log_hooks.on': True,
25 }
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 def accept(self):
56 return "Accepted!"
57 accept.exposed = True
58 reject = accept
59
60 class AutoVary:
61 def index(self):
62
63 ae = cherrypy.request.headers.get('Accept-Encoding')
64
65 cl = cherrypy.request.headers['Host']
66
67 hasif = 'If-Modified-Since' in cherrypy.request.headers
68
69 if hasattr(dict, 'has_key'):
70
71 has = cherrypy.request.headers.has_key('Range')
72 else:
73
74 has = 'Range' in cherrypy.request.headers
75
76 mtype = tools.accept.callable(['text/html', 'text/plain'])
77 return "Hello, world!"
78 index.exposed = True
79
80 conf = {'/referer': {'tools.referer.on': True,
81 'tools.referer.pattern': r'http://[^/]*example\.com',
82 },
83 '/referer/reject': {'tools.referer.accept': False,
84 'tools.referer.accept_missing': True,
85 },
86 '/autovary': {'tools.autovary.on': True},
87 }
88
89 root = Root()
90 root.referer = Referer()
91 root.accept = Accept()
92 root.autovary = AutoVary()
93 cherrypy.tree.mount(root, config=conf)
94 cherrypy.config.update({'log.error_file': logfile})
95
96
97 from cherrypy.test import helper
98
111
112
133
134
136 setup_server = staticmethod(setup_server)
137
170
172
173 self.getPage('/accept/select', [('Accept', 'text/html')])
174 self.assertStatus(200)
175 self.assertBody('<h2>Page Title</h2>')
176 self.getPage('/accept/select', [('Accept', 'text/plain')])
177 self.assertStatus(200)
178 self.assertBody('PAGE TITLE')
179 self.getPage('/accept/select', [('Accept', 'text/plain, text/*;q=0.5')])
180 self.assertStatus(200)
181 self.assertBody('PAGE TITLE')
182
183
184
185 self.getPage('/accept/select', [('Accept', 'text/*')])
186 self.assertStatus(200)
187 self.assertBody('<h2>Page Title</h2>')
188 self.getPage('/accept/select', [('Accept', '*/*')])
189 self.assertStatus(200)
190 self.assertBody('<h2>Page Title</h2>')
191
192
193 self.getPage('/accept/select', [('Accept', 'application/xml')])
194 self.assertErrorPage(406,
195 "Your client sent this Accept header: application/xml. "
196 "But this resource only emits these media types: "
197 "text/html, text/plain.")
198
199
207