1
import unittest, warnings
2
from webob import Request, BaseRequest, UTC
6
warnings.showwarning = lambda *args, **kw: None
8
class BaseRequestTests(unittest.TestCase):
9
def _makeStringIO(self, text):
11
from io import BytesIO
12
except ImportError: # Python < 2.6
13
from StringIO import StringIO as BytesIO
1
# -*- coding: utf-8 -*-
13
from webob.compat import (
21
class TestRequestCommon(unittest.TestCase):
22
# unit tests of non-bytes-vs-text-specific methods of request object
23
def _getTargetClass(self):
24
from webob.request import Request
27
def _makeOne(self, *arg, **kw):
28
cls = self._getTargetClass()
29
return cls(*arg, **kw)
31
def _blankOne(self, *arg, **kw):
32
cls = self._getTargetClass()
33
return cls.blank(*arg, **kw)
16
35
def test_ctor_environ_getter_raises_WTF(self):
17
self.assertRaises(TypeError, Request, {}, environ_getter=object())
36
self.assertRaises(TypeError, self._makeOne, {}, environ_getter=object())
19
38
def test_ctor_wo_environ_raises_WTF(self):
20
self.assertRaises(TypeError, Request, None)
39
self.assertRaises(TypeError, self._makeOne, None)
22
41
def test_ctor_w_environ(self):
24
req = BaseRequest(environ)
43
req = self._makeOne(environ)
25
44
self.assertEqual(req.environ, environ)
46
def test_ctor_w_non_utf8_charset(self):
48
self.assertRaises(DeprecationWarning, self._makeOne, environ,
51
def test_scheme(self):
52
environ = {'wsgi.url_scheme': 'something:',
54
req = self._makeOne(environ)
55
self.assertEqual(req.scheme, 'something:')
27
57
def test_body_file_getter(self):
29
INPUT = self._makeStringIO(body)
30
60
environ = {'wsgi.input': INPUT,
31
61
'CONTENT_LENGTH': len(body),
32
62
'REQUEST_METHOD': 'POST',
34
req = BaseRequest(environ)
35
self.assert_(req.body_file is not INPUT)
64
req = self._makeOne(environ)
65
self.assertTrue(req.body_file is not INPUT)
37
67
def test_body_file_getter_seekable(self):
39
INPUT = self._makeStringIO(body)
40
70
environ = {'wsgi.input': INPUT,
41
71
'CONTENT_LENGTH': len(body),
42
72
'REQUEST_METHOD': 'POST',
43
73
'webob.is_body_seekable': True,
45
req = BaseRequest(environ)
46
self.assert_(req.body_file is INPUT)
75
req = self._makeOne(environ)
76
self.assertTrue(req.body_file is INPUT)
48
78
def test_body_file_getter_cache(self):
50
INPUT = self._makeStringIO(body)
51
81
environ = {'wsgi.input': INPUT,
52
82
'CONTENT_LENGTH': len(body),
53
83
'REQUEST_METHOD': 'POST',
55
req = BaseRequest(environ)
56
self.assert_(req.body_file is req.body_file)
85
req = self._makeOne(environ)
86
self.assertTrue(req.body_file is req.body_file)
58
88
def test_body_file_getter_unreadable(self):
60
INPUT = self._makeStringIO(body)
61
91
environ = {'wsgi.input': INPUT, 'REQUEST_METHOD': 'FOO'}
62
req = BaseRequest(environ)
92
req = self._makeOne(environ)
63
93
assert req.body_file_raw is INPUT
64
94
assert req.body_file is not INPUT
65
assert req.body_file.read() == ''
67
def test_body_file_setter_w_string(self):
68
BEFORE = self._makeStringIO('before')
70
environ = {'wsgi.input': BEFORE,
71
'CONTENT_LENGTH': len('before'),
72
'REQUEST_METHOD': 'POST',
74
req = BaseRequest(environ)
75
warnings.simplefilter('ignore', PendingDeprecationWarning)
77
warnings.resetwarnings()
78
self.assertEqual(req.content_length, len(AFTER))
79
self.assertEqual(req.body_file.read(), AFTER)
81
self.assertEqual(req.content_length, 0)
82
assert req.is_body_seekable
84
self.assertEqual(req.body_file.read(), '')
86
def test_body_file_setter_non_string(self):
87
BEFORE = self._makeStringIO('before')
88
AFTER = self._makeStringIO('after')
95
assert req.body_file.read() == b''
97
def test_body_file_setter_w_bytes(self):
98
req = self._blankOne('/')
99
self.assertRaises(DeprecationWarning, setattr, req, 'body_file', b'foo')
101
def test_body_file_setter_non_bytes(self):
102
BEFORE = BytesIO(b'before')
103
AFTER = BytesIO(b'after')
89
104
environ = {'wsgi.input': BEFORE,
90
105
'CONTENT_LENGTH': len('before'),
91
106
'REQUEST_METHOD': 'POST'
93
req = BaseRequest(environ)
108
req = self._makeOne(environ)
94
109
req.body_file = AFTER
95
self.assert_(req.body_file is AFTER)
110
self.assertTrue(req.body_file is AFTER)
96
111
self.assertEqual(req.content_length, None)
98
113
def test_body_file_deleter(self):
99
INPUT = self._makeStringIO('before')
115
INPUT = BytesIO(body)
100
116
environ = {'wsgi.input': INPUT,
101
'CONTENT_LENGTH': len('before'),
117
'CONTENT_LENGTH': len(body),
102
118
'REQUEST_METHOD': 'POST',
104
req = BaseRequest(environ)
120
req = self._makeOne(environ)
105
121
del req.body_file
106
self.assertEqual(req.body_file.getvalue(), '')
122
self.assertEqual(req.body_file.getvalue(), b'')
107
123
self.assertEqual(req.content_length, 0)
109
125
def test_body_file_raw(self):
110
INPUT = self._makeStringIO('input')
126
INPUT = BytesIO(b'input')
111
127
environ = {'wsgi.input': INPUT,
112
128
'CONTENT_LENGTH': len('input'),
113
129
'REQUEST_METHOD': 'POST',
115
req = BaseRequest(environ)
116
self.assert_(req.body_file_raw is INPUT)
131
req = self._makeOne(environ)
132
self.assertTrue(req.body_file_raw is INPUT)
118
134
def test_body_file_seekable_input_not_seekable(self):
119
INPUT = self._makeStringIO('input')
136
INPUT = BytesIO(data)
120
137
INPUT.seek(1, 0) # consume
121
138
environ = {'wsgi.input': INPUT,
122
139
'webob.is_body_seekable': False,
123
'CONTENT_LENGTH': len('input')-1,
140
'CONTENT_LENGTH': len(data)-1,
124
141
'REQUEST_METHOD': 'POST',
126
req = BaseRequest(environ)
143
req = self._makeOne(environ)
127
144
seekable = req.body_file_seekable
128
self.assert_(seekable is not INPUT)
129
self.assertEqual(seekable.getvalue(), 'nput')
145
self.assertTrue(seekable is not INPUT)
146
self.assertEqual(seekable.getvalue(), b'nput')
131
148
def test_body_file_seekable_input_is_seekable(self):
132
INPUT = self._makeStringIO('input')
149
INPUT = BytesIO(b'input')
133
150
INPUT.seek(1, 0) # consume
134
151
environ = {'wsgi.input': INPUT,
135
152
'webob.is_body_seekable': True,
136
153
'CONTENT_LENGTH': len('input')-1,
137
154
'REQUEST_METHOD': 'POST',
139
req = BaseRequest(environ)
156
req = self._makeOne(environ)
140
157
seekable = req.body_file_seekable
141
self.assert_(seekable is INPUT)
143
def test_scheme(self):
144
environ = {'wsgi.url_scheme': 'something:',
146
req = BaseRequest(environ)
147
self.assertEqual(req.scheme, 'something:')
149
def test_method(self):
150
environ = {'REQUEST_METHOD': 'OPTIONS',
152
req = BaseRequest(environ)
153
self.assertEqual(req.method, 'OPTIONS')
155
def test_http_version(self):
156
environ = {'SERVER_PROTOCOL': '1.1',
158
req = BaseRequest(environ)
159
self.assertEqual(req.http_version, '1.1')
161
def test_script_name(self):
162
environ = {'SCRIPT_NAME': '/script',
164
req = BaseRequest(environ)
165
self.assertEqual(req.script_name, '/script')
167
def test_path_info(self):
168
environ = {'PATH_INFO': '/path/info',
170
req = BaseRequest(environ)
171
self.assertEqual(req.path_info, '/path/info')
173
def test_content_length_getter(self):
174
environ = {'CONTENT_LENGTH': '1234',
176
req = BaseRequest(environ)
177
self.assertEqual(req.content_length, 1234)
179
def test_content_length_setter_w_str(self):
180
environ = {'CONTENT_LENGTH': '1234',
182
req = BaseRequest(environ)
183
req.content_length = '3456'
184
self.assertEqual(req.content_length, 3456)
186
def test_remote_user(self):
187
environ = {'REMOTE_USER': 'phred',
189
req = BaseRequest(environ)
190
self.assertEqual(req.remote_user, 'phred')
192
def test_remote_addr(self):
193
environ = {'REMOTE_ADDR': '1.2.3.4',
195
req = BaseRequest(environ)
196
self.assertEqual(req.remote_addr, '1.2.3.4')
198
def test_query_string(self):
199
environ = {'QUERY_STRING': 'foo=bar&baz=bam',
201
req = BaseRequest(environ)
202
self.assertEqual(req.query_string, 'foo=bar&baz=bam')
204
def test_server_name(self):
205
environ = {'SERVER_NAME': 'somehost.tld',
207
req = BaseRequest(environ)
208
self.assertEqual(req.server_name, 'somehost.tld')
210
def test_server_port_getter(self):
211
environ = {'SERVER_PORT': '6666',
213
req = BaseRequest(environ)
214
self.assertEqual(req.server_port, 6666)
216
def test_server_port_setter_with_string(self):
217
environ = {'SERVER_PORT': '6666',
219
req = BaseRequest(environ)
220
req.server_port = '6667'
221
self.assertEqual(req.server_port, 6667)
223
def test_uscript_name(self):
224
environ = {'SCRIPT_NAME': '/script',
226
req = BaseRequest(environ)
227
self.assert_(isinstance(req.uscript_name, unicode))
228
self.assertEqual(req.uscript_name, '/script')
230
def test_upath_info(self):
231
environ = {'PATH_INFO': '/path/info',
233
req = BaseRequest(environ)
234
self.assert_(isinstance(req.upath_info, unicode))
235
self.assertEqual(req.upath_info, '/path/info')
237
def test_content_type_getter_no_parameters(self):
238
environ = {'CONTENT_TYPE': 'application/xml+foobar',
240
req = BaseRequest(environ)
241
self.assertEqual(req.content_type, 'application/xml+foobar')
243
def test_content_type_getter_w_parameters(self):
244
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
246
req = BaseRequest(environ)
247
self.assertEqual(req.content_type, 'application/xml+foobar')
249
def test_content_type_setter_w_None(self):
250
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
252
req = BaseRequest(environ)
253
req.content_type = None
254
self.assertEqual(req.content_type, '')
255
self.assert_('CONTENT_TYPE' not in environ)
257
def test_content_type_setter_existing_paramter_no_new_paramter(self):
258
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
260
req = BaseRequest(environ)
261
req.content_type = 'text/xml'
262
self.assertEqual(req.content_type, 'text/xml')
263
self.assertEqual(environ['CONTENT_TYPE'], 'text/xml;charset="utf8"')
265
def test_content_type_deleter_clears_environ_value(self):
266
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
268
req = BaseRequest(environ)
270
self.assertEqual(req.content_type, '')
271
self.assert_('CONTENT_TYPE' not in environ)
273
def test_content_type_deleter_no_environ_value(self):
275
req = BaseRequest(environ)
277
self.assertEqual(req.content_type, '')
278
self.assert_('CONTENT_TYPE' not in environ)
280
def test_charset_getter_cache_hit(self):
281
CT = 'application/xml+foobar'
282
environ = {'CONTENT_TYPE': CT,
284
req = BaseRequest(environ)
285
req._charset_cache = (CT, 'cp1252')
286
self.assertEqual(req.charset, 'cp1252')
288
def test_charset_getter_cache_miss_w_parameter(self):
289
CT = 'application/xml+foobar;charset="utf8"'
290
environ = {'CONTENT_TYPE': CT,
292
req = BaseRequest(environ)
293
self.assertEqual(req.charset, 'utf8')
294
self.assertEqual(req._charset_cache, (CT, 'utf8'))
296
def test_charset_getter_cache_miss_wo_parameter(self):
297
CT = 'application/xml+foobar'
298
environ = {'CONTENT_TYPE': CT,
300
req = BaseRequest(environ)
301
self.assertEqual(req.charset, 'UTF-8')
302
self.assertEqual(req._charset_cache, (CT, 'UTF-8'))
304
def test_charset_setter_None_w_parameter(self):
305
CT = 'application/xml+foobar;charset="utf8"'
306
environ = {'CONTENT_TYPE': CT,
308
req = BaseRequest(environ)
310
self.assertEqual(environ['CONTENT_TYPE'], 'application/xml+foobar')
311
self.assertEqual(req.charset, 'UTF-8')
313
def test_charset_setter_empty_w_parameter(self):
314
CT = 'application/xml+foobar;charset="utf8"'
315
environ = {'CONTENT_TYPE': CT,
317
req = BaseRequest(environ)
319
self.assertEqual(environ['CONTENT_TYPE'], 'application/xml+foobar')
320
self.assertEqual(req.charset, 'UTF-8')
322
def test_charset_setter_nonempty_w_parameter(self):
323
CT = 'application/xml+foobar;charset="utf8"'
324
environ = {'CONTENT_TYPE': CT,
326
req = BaseRequest(environ)
327
req.charset = 'cp1252'
328
self.assertEqual(environ['CONTENT_TYPE'],
329
#'application/xml+foobar; charset="cp1252"') WTF?
330
'application/xml+foobar;charset=cp1252',
332
self.assertEqual(req.charset, 'cp1252')
334
def test_charset_setter_nonempty_wo_parameter(self):
335
CT = 'application/xml+foobar'
336
environ = {'CONTENT_TYPE': CT,
338
req = BaseRequest(environ)
339
req.charset = 'cp1252'
340
self.assertEqual(environ['CONTENT_TYPE'],
341
'application/xml+foobar; charset="cp1252"',
342
#'application/xml+foobar;charset=cp1252', WTF?
344
self.assertEqual(req.charset, 'cp1252')
346
def test_charset_deleter_w_parameter(self):
347
CT = 'application/xml+foobar;charset="utf8"'
348
environ = {'CONTENT_TYPE': CT,
350
req = BaseRequest(environ)
352
self.assertEqual(environ['CONTENT_TYPE'], 'application/xml+foobar')
353
self.assertEqual(req.charset, 'UTF-8')
355
def test_headers_getter_miss(self):
356
CONTENT_TYPE = 'application/xml+foobar;charset="utf8"'
357
environ = {'CONTENT_TYPE': CONTENT_TYPE,
358
'CONTENT_LENGTH': '123',
360
req = BaseRequest(environ)
361
headers = req.headers
362
self.assertEqual(headers,
363
{'Content-Type': CONTENT_TYPE,
364
'Content-Length': '123'})
365
self.assertEqual(req._headers, headers)
367
def test_headers_getter_hit(self):
368
CONTENT_TYPE = 'application/xml+foobar;charset="utf8"'
369
environ = {'CONTENT_TYPE': CONTENT_TYPE,
370
'CONTENT_LENGTH': '123',
372
req = BaseRequest(environ)
373
req._headers = {'Foo': 'Bar'}
374
self.assertEqual(req.headers,
377
def test_headers_setter(self):
378
CONTENT_TYPE = 'application/xml+foobar;charset="utf8"'
379
environ = {'CONTENT_TYPE': CONTENT_TYPE,
380
'CONTENT_LENGTH': '123',
382
req = BaseRequest(environ)
383
req._headers = {'Foo': 'Bar'}
384
req.headers = {'Qux': 'Spam'}
385
self.assertEqual(req.headers,
388
def test_no_headers_deleter(self):
389
CONTENT_TYPE = 'application/xml+foobar;charset="utf8"'
390
environ = {'CONTENT_TYPE': CONTENT_TYPE,
391
'CONTENT_LENGTH': '123',
393
req = BaseRequest(environ)
396
self.assertRaises(AttributeError, _test)
398
def test_host_url_w_http_host_and_no_port(self):
399
environ = {'wsgi.url_scheme': 'http',
400
'HTTP_HOST': 'example.com',
402
req = BaseRequest(environ)
403
self.assertEqual(req.host_url, 'http://example.com')
405
def test_host_url_w_http_host_and_standard_port(self):
406
environ = {'wsgi.url_scheme': 'http',
407
'HTTP_HOST': 'example.com:80',
409
req = BaseRequest(environ)
410
self.assertEqual(req.host_url, 'http://example.com')
412
def test_host_url_w_http_host_and_oddball_port(self):
413
environ = {'wsgi.url_scheme': 'http',
414
'HTTP_HOST': 'example.com:8888',
416
req = BaseRequest(environ)
417
self.assertEqual(req.host_url, 'http://example.com:8888')
419
def test_host_url_w_http_host_https_and_no_port(self):
420
environ = {'wsgi.url_scheme': 'https',
421
'HTTP_HOST': 'example.com',
423
req = BaseRequest(environ)
424
self.assertEqual(req.host_url, 'https://example.com')
426
def test_host_url_w_http_host_https_and_standard_port(self):
427
environ = {'wsgi.url_scheme': 'https',
428
'HTTP_HOST': 'example.com:443',
430
req = BaseRequest(environ)
431
self.assertEqual(req.host_url, 'https://example.com')
433
def test_host_url_w_http_host_https_and_oddball_port(self):
434
environ = {'wsgi.url_scheme': 'https',
435
'HTTP_HOST': 'example.com:4333',
437
req = BaseRequest(environ)
438
self.assertEqual(req.host_url, 'https://example.com:4333')
440
def test_host_url_wo_http_host(self):
441
environ = {'wsgi.url_scheme': 'https',
442
'SERVER_NAME': 'example.com',
443
'SERVER_PORT': '4333',
445
req = BaseRequest(environ)
446
self.assertEqual(req.host_url, 'https://example.com:4333')
448
def test_application_url(self):
449
environ = {'wsgi.url_scheme': 'http',
450
'SERVER_NAME': 'example.com',
452
'SCRIPT_NAME': '/script',
454
req = BaseRequest(environ)
455
self.assertEqual(req.application_url, 'http://example.com/script')
457
def test_path_url(self):
458
environ = {'wsgi.url_scheme': 'http',
459
'SERVER_NAME': 'example.com',
461
'SCRIPT_NAME': '/script',
462
'PATH_INFO': '/path/info',
464
req = BaseRequest(environ)
465
self.assertEqual(req.path_url, 'http://example.com/script/path/info')
468
environ = {'wsgi.url_scheme': 'http',
469
'SERVER_NAME': 'example.com',
471
'SCRIPT_NAME': '/script',
472
'PATH_INFO': '/path/info',
474
req = BaseRequest(environ)
475
self.assertEqual(req.path, '/script/path/info')
477
def test_path_qs_no_qs(self):
478
environ = {'wsgi.url_scheme': 'http',
479
'SERVER_NAME': 'example.com',
481
'SCRIPT_NAME': '/script',
482
'PATH_INFO': '/path/info',
484
req = BaseRequest(environ)
485
self.assertEqual(req.path_qs, '/script/path/info')
487
def test_path_qs_w_qs(self):
488
environ = {'wsgi.url_scheme': 'http',
489
'SERVER_NAME': 'example.com',
491
'SCRIPT_NAME': '/script',
492
'PATH_INFO': '/path/info',
493
'QUERY_STRING': 'foo=bar&baz=bam'
495
req = BaseRequest(environ)
496
self.assertEqual(req.path_qs, '/script/path/info?foo=bar&baz=bam')
498
def test_url_no_qs(self):
499
environ = {'wsgi.url_scheme': 'http',
500
'SERVER_NAME': 'example.com',
502
'SCRIPT_NAME': '/script',
503
'PATH_INFO': '/path/info',
505
req = BaseRequest(environ)
506
self.assertEqual(req.url, 'http://example.com/script/path/info')
508
def test_url_w_qs(self):
509
environ = {'wsgi.url_scheme': 'http',
510
'SERVER_NAME': 'example.com',
512
'SCRIPT_NAME': '/script',
513
'PATH_INFO': '/path/info',
514
'QUERY_STRING': 'foo=bar&baz=bam'
516
req = BaseRequest(environ)
517
self.assertEqual(req.url,
518
'http://example.com/script/path/info?foo=bar&baz=bam')
520
def test_relative_url_to_app_true_wo_leading_slash(self):
521
environ = {'wsgi.url_scheme': 'http',
522
'SERVER_NAME': 'example.com',
524
'SCRIPT_NAME': '/script',
525
'PATH_INFO': '/path/info',
526
'QUERY_STRING': 'foo=bar&baz=bam'
528
req = BaseRequest(environ)
529
self.assertEqual(req.relative_url('other/page', True),
530
'http://example.com/script/other/page')
532
def test_relative_url_to_app_true_w_leading_slash(self):
533
environ = {'wsgi.url_scheme': 'http',
534
'SERVER_NAME': 'example.com',
536
'SCRIPT_NAME': '/script',
537
'PATH_INFO': '/path/info',
538
'QUERY_STRING': 'foo=bar&baz=bam'
540
req = BaseRequest(environ)
541
self.assertEqual(req.relative_url('/other/page', True),
542
'http://example.com/other/page')
544
def test_relative_url_to_app_false_other_w_leading_slash(self):
545
environ = {'wsgi.url_scheme': 'http',
546
'SERVER_NAME': 'example.com',
548
'SCRIPT_NAME': '/script',
549
'PATH_INFO': '/path/info',
550
'QUERY_STRING': 'foo=bar&baz=bam'
552
req = BaseRequest(environ)
553
self.assertEqual(req.relative_url('/other/page', False),
554
'http://example.com/other/page')
556
def test_relative_url_to_app_false_other_wo_leading_slash(self):
557
environ = {'wsgi.url_scheme': 'http',
558
'SERVER_NAME': 'example.com',
560
'SCRIPT_NAME': '/script',
561
'PATH_INFO': '/path/info',
562
'QUERY_STRING': 'foo=bar&baz=bam'
564
req = BaseRequest(environ)
565
self.assertEqual(req.relative_url('other/page', False),
566
'http://example.com/script/path/other/page')
568
def test_path_info_pop_empty(self):
569
environ = {'wsgi.url_scheme': 'http',
570
'SERVER_NAME': 'example.com',
572
'SCRIPT_NAME': '/script',
575
req = BaseRequest(environ)
576
popped = req.path_info_pop()
577
self.assertEqual(popped, None)
578
self.assertEqual(environ['SCRIPT_NAME'], '/script')
580
def test_path_info_pop_just_leading_slash(self):
581
environ = {'wsgi.url_scheme': 'http',
582
'SERVER_NAME': 'example.com',
584
'SCRIPT_NAME': '/script',
587
req = BaseRequest(environ)
588
popped = req.path_info_pop()
589
self.assertEqual(popped, '')
590
self.assertEqual(environ['SCRIPT_NAME'], '/script/')
591
self.assertEqual(environ['PATH_INFO'], '')
593
def test_path_info_pop_non_empty_no_pattern(self):
594
environ = {'wsgi.url_scheme': 'http',
595
'SERVER_NAME': 'example.com',
597
'SCRIPT_NAME': '/script',
598
'PATH_INFO': '/path/info',
600
req = BaseRequest(environ)
601
popped = req.path_info_pop()
602
self.assertEqual(popped, 'path')
603
self.assertEqual(environ['SCRIPT_NAME'], '/script/path')
604
self.assertEqual(environ['PATH_INFO'], '/info')
606
def test_path_info_pop_non_empty_w_pattern_miss(self):
608
PATTERN = re.compile('miss')
609
environ = {'wsgi.url_scheme': 'http',
610
'SERVER_NAME': 'example.com',
612
'SCRIPT_NAME': '/script',
613
'PATH_INFO': '/path/info',
615
req = BaseRequest(environ)
616
popped = req.path_info_pop(PATTERN)
617
self.assertEqual(popped, None)
618
self.assertEqual(environ['SCRIPT_NAME'], '/script')
619
self.assertEqual(environ['PATH_INFO'], '/path/info')
621
def test_path_info_pop_non_empty_w_pattern_hit(self):
623
PATTERN = re.compile('path')
624
environ = {'wsgi.url_scheme': 'http',
625
'SERVER_NAME': 'example.com',
627
'SCRIPT_NAME': '/script',
628
'PATH_INFO': '/path/info',
630
req = BaseRequest(environ)
631
popped = req.path_info_pop(PATTERN)
632
self.assertEqual(popped, 'path')
633
self.assertEqual(environ['SCRIPT_NAME'], '/script/path')
634
self.assertEqual(environ['PATH_INFO'], '/info')
636
def test_path_info_pop_skips_empty_elements(self):
637
environ = {'wsgi.url_scheme': 'http',
638
'SERVER_NAME': 'example.com',
640
'SCRIPT_NAME': '/script',
641
'PATH_INFO': '//path/info',
643
req = BaseRequest(environ)
644
popped = req.path_info_pop()
645
self.assertEqual(popped, 'path')
646
self.assertEqual(environ['SCRIPT_NAME'], '/script//path')
647
self.assertEqual(environ['PATH_INFO'], '/info')
649
def test_path_info_peek_empty(self):
650
environ = {'wsgi.url_scheme': 'http',
651
'SERVER_NAME': 'example.com',
653
'SCRIPT_NAME': '/script',
656
req = BaseRequest(environ)
657
peeked = req.path_info_peek()
658
self.assertEqual(peeked, None)
659
self.assertEqual(environ['SCRIPT_NAME'], '/script')
660
self.assertEqual(environ['PATH_INFO'], '')
662
def test_path_info_peek_just_leading_slash(self):
663
environ = {'wsgi.url_scheme': 'http',
664
'SERVER_NAME': 'example.com',
666
'SCRIPT_NAME': '/script',
669
req = BaseRequest(environ)
670
peeked = req.path_info_peek()
671
self.assertEqual(peeked, '')
672
self.assertEqual(environ['SCRIPT_NAME'], '/script')
673
self.assertEqual(environ['PATH_INFO'], '/')
675
def test_path_info_peek_non_empty(self):
676
environ = {'wsgi.url_scheme': 'http',
677
'SERVER_NAME': 'example.com',
679
'SCRIPT_NAME': '/script',
680
'PATH_INFO': '/path',
682
req = BaseRequest(environ)
683
peeked = req.path_info_peek()
684
self.assertEqual(peeked, 'path')
685
self.assertEqual(environ['SCRIPT_NAME'], '/script')
686
self.assertEqual(environ['PATH_INFO'], '/path')
158
self.assertTrue(seekable is INPUT)
688
160
def test_urlvars_getter_w_paste_key(self):
689
161
environ = {'paste.urlvars': {'foo': 'bar'},
691
req = BaseRequest(environ)
163
req = self._makeOne(environ)
692
164
self.assertEqual(req.urlvars, {'foo': 'bar'})
694
166
def test_urlvars_getter_w_wsgiorg_key(self):
695
167
environ = {'wsgiorg.routing_args': ((), {'foo': 'bar'}),
697
req = BaseRequest(environ)
169
req = self._makeOne(environ)
698
170
self.assertEqual(req.urlvars, {'foo': 'bar'})
700
172
def test_urlvars_getter_wo_keys(self):
702
req = BaseRequest(environ)
174
req = self._makeOne(environ)
703
175
self.assertEqual(req.urlvars, {})
704
176
self.assertEqual(environ['wsgiorg.routing_args'], ((), {}))
706
178
def test_urlvars_setter_w_paste_key(self):
707
179
environ = {'paste.urlvars': {'foo': 'bar'},
709
req = BaseRequest(environ)
181
req = self._makeOne(environ)
710
182
req.urlvars = {'baz': 'bam'}
711
183
self.assertEqual(req.urlvars, {'baz': 'bam'})
712
184
self.assertEqual(environ['paste.urlvars'], {'baz': 'bam'})
713
self.assert_('wsgiorg.routing_args' not in environ)
185
self.assertTrue('wsgiorg.routing_args' not in environ)
715
187
def test_urlvars_setter_w_wsgiorg_key(self):
716
188
environ = {'wsgiorg.routing_args': ((), {'foo': 'bar'}),
717
189
'paste.urlvars': {'qux': 'spam'},
719
req = BaseRequest(environ)
191
req = self._makeOne(environ)
720
192
req.urlvars = {'baz': 'bam'}
721
193
self.assertEqual(req.urlvars, {'baz': 'bam'})
722
194
self.assertEqual(environ['wsgiorg.routing_args'], ((), {'baz': 'bam'}))
723
self.assert_('paste.urlvars' not in environ)
195
self.assertTrue('paste.urlvars' not in environ)
725
197
def test_urlvars_setter_wo_keys(self):
727
req = BaseRequest(environ)
199
req = self._makeOne(environ)
728
200
req.urlvars = {'baz': 'bam'}
729
201
self.assertEqual(req.urlvars, {'baz': 'bam'})
730
202
self.assertEqual(environ['wsgiorg.routing_args'], ((), {'baz': 'bam'}))
731
self.assert_('paste.urlvars' not in environ)
203
self.assertTrue('paste.urlvars' not in environ)
733
205
def test_urlvars_deleter_w_paste_key(self):
734
206
environ = {'paste.urlvars': {'foo': 'bar'},
736
req = BaseRequest(environ)
208
req = self._makeOne(environ)
738
210
self.assertEqual(req.urlvars, {})
739
self.assert_('paste.urlvars' not in environ)
211
self.assertTrue('paste.urlvars' not in environ)
740
212
self.assertEqual(environ['wsgiorg.routing_args'], ((), {}))
742
214
def test_urlvars_deleter_w_wsgiorg_key_non_empty_tuple(self):
743
215
environ = {'wsgiorg.routing_args': (('a', 'b'), {'foo': 'bar'}),
744
216
'paste.urlvars': {'qux': 'spam'},
746
req = BaseRequest(environ)
218
req = self._makeOne(environ)
748
220
self.assertEqual(req.urlvars, {})
749
221
self.assertEqual(environ['wsgiorg.routing_args'], (('a', 'b'), {}))
750
self.assert_('paste.urlvars' not in environ)
222
self.assertTrue('paste.urlvars' not in environ)
752
224
def test_urlvars_deleter_w_wsgiorg_key_empty_tuple(self):
753
225
environ = {'wsgiorg.routing_args': ((), {'foo': 'bar'}),
754
226
'paste.urlvars': {'qux': 'spam'},
756
req = BaseRequest(environ)
228
req = self._makeOne(environ)
758
230
self.assertEqual(req.urlvars, {})
759
231
self.assertEqual(environ['wsgiorg.routing_args'], ((), {}))
760
self.assert_('paste.urlvars' not in environ)
232
self.assertTrue('paste.urlvars' not in environ)
762
234
def test_urlvars_deleter_wo_keys(self):
764
req = BaseRequest(environ)
236
req = self._makeOne(environ)
766
238
self.assertEqual(req.urlvars, {})
767
239
self.assertEqual(environ['wsgiorg.routing_args'], ((), {}))
768
self.assert_('paste.urlvars' not in environ)
240
self.assertTrue('paste.urlvars' not in environ)
770
242
def test_urlargs_getter_w_paste_key(self):
771
243
environ = {'paste.urlvars': {'foo': 'bar'},
773
req = BaseRequest(environ)
245
req = self._makeOne(environ)
774
246
self.assertEqual(req.urlargs, ())
776
248
def test_urlargs_getter_w_wsgiorg_key(self):
777
249
environ = {'wsgiorg.routing_args': (('a', 'b'), {'foo': 'bar'}),
779
req = BaseRequest(environ)
251
req = self._makeOne(environ)
780
252
self.assertEqual(req.urlargs, ('a', 'b'))
782
254
def test_urlargs_getter_wo_keys(self):
784
req = BaseRequest(environ)
256
req = self._makeOne(environ)
785
257
self.assertEqual(req.urlargs, ())
786
self.assert_('wsgiorg.routing_args' not in environ)
258
self.assertTrue('wsgiorg.routing_args' not in environ)
788
260
def test_urlargs_setter_w_paste_key(self):
789
261
environ = {'paste.urlvars': {'foo': 'bar'},
791
req = BaseRequest(environ)
263
req = self._makeOne(environ)
792
264
req.urlargs = ('a', 'b')
793
265
self.assertEqual(req.urlargs, ('a', 'b'))
794
266
self.assertEqual(environ['wsgiorg.routing_args'],
795
267
(('a', 'b'), {'foo': 'bar'}))
796
self.assert_('paste.urlvars' not in environ)
268
self.assertTrue('paste.urlvars' not in environ)
798
270
def test_urlargs_setter_w_wsgiorg_key(self):
799
271
environ = {'wsgiorg.routing_args': ((), {'foo': 'bar'}),
801
req = BaseRequest(environ)
273
req = self._makeOne(environ)
802
274
req.urlargs = ('a', 'b')
803
275
self.assertEqual(req.urlargs, ('a', 'b'))
804
276
self.assertEqual(environ['wsgiorg.routing_args'],
1293
782
def test_blank__method_subtitution(self):
1294
request = BaseRequest.blank('/', environ={'REQUEST_METHOD': 'PUT'})
1295
self.assertEqual(request.method, 'PUT')
1297
request = BaseRequest.blank('/', environ={'REQUEST_METHOD': 'PUT'}, POST={})
1298
self.assertEqual(request.method, 'PUT')
1300
request = BaseRequest.blank('/', environ={'REQUEST_METHOD': 'HEAD'}, POST={})
783
request = self._blankOne('/', environ={'REQUEST_METHOD': 'PUT'})
784
self.assertEqual(request.method, 'PUT')
786
request = self._blankOne(
787
'/', environ={'REQUEST_METHOD': 'PUT'}, POST={})
788
self.assertEqual(request.method, 'PUT')
790
request = self._blankOne(
791
'/', environ={'REQUEST_METHOD': 'HEAD'}, POST={})
1301
792
self.assertEqual(request.method, 'POST')
1303
794
def test_blank__ctype_in_env(self):
1304
request = BaseRequest.blank('/', environ={'CONTENT_TYPE': 'application/json'})
795
request = self._blankOne(
796
'/', environ={'CONTENT_TYPE': 'application/json'})
1305
797
self.assertEqual(request.content_type, 'application/json')
1306
798
self.assertEqual(request.method, 'GET')
1308
request = BaseRequest.blank('/', environ={'CONTENT_TYPE': 'application/json'},
800
request = self._blankOne(
801
'/', environ={'CONTENT_TYPE': 'application/json'}, POST='')
1310
802
self.assertEqual(request.content_type, 'application/json')
1311
803
self.assertEqual(request.method, 'POST')
1313
805
def test_blank__ctype_in_headers(self):
1314
request = BaseRequest.blank('/', headers={'Content-type': 'application/json'})
806
request = self._blankOne(
807
'/', headers={'Content-type': 'application/json'})
1315
808
self.assertEqual(request.content_type, 'application/json')
1316
809
self.assertEqual(request.method, 'GET')
1318
request = BaseRequest.blank('/', headers={'Content-Type': 'application/json'},
811
request = self._blankOne(
812
'/', headers={'Content-Type': 'application/json'}, POST='')
1320
813
self.assertEqual(request.content_type, 'application/json')
1321
814
self.assertEqual(request.method, 'POST')
1323
816
def test_blank__ctype_as_kw(self):
1324
request = BaseRequest.blank('/', content_type='application/json')
817
request = self._blankOne('/', content_type='application/json')
1325
818
self.assertEqual(request.content_type, 'application/json')
1326
819
self.assertEqual(request.method, 'GET')
1328
request = BaseRequest.blank('/', content_type='application/json',
821
request = self._blankOne('/', content_type='application/json',
1330
823
self.assertEqual(request.content_type, 'application/json')
1331
824
self.assertEqual(request.method, 'POST')
1333
826
def test_blank__str_post_data_for_unsupported_ctype(self):
1334
self.assertRaises(ValueError, BaseRequest.blank, '/', content_type='application/json',
827
self.assertRaises(ValueError,
829
'/', content_type='application/json', POST={})
1337
831
def test_blank__post_urlencoded(self):
1338
request = Request.blank('/', POST={'first':1, 'second':2})
832
request = self._blankOne('/', POST={'first':1, 'second':2})
1339
833
self.assertEqual(request.method, 'POST')
1340
self.assertEqual(request.content_type, 'application/x-www-form-urlencoded')
1341
self.assertEqual(request.body, 'first=1&second=2')
834
self.assertEqual(request.content_type,
835
'application/x-www-form-urlencoded')
836
self.assertEqual(request.body, b'first=1&second=2')
1342
837
self.assertEqual(request.content_length, 16)
1344
839
def test_blank__post_multipart(self):
1345
request = Request.blank('/', POST={'first':'1', 'second':'2'},
1346
content_type='multipart/form-data; boundary=boundary')
840
request = self._blankOne(
841
'/', POST={'first':'1', 'second':'2'},
842
content_type='multipart/form-data; boundary=boundary')
1347
843
self.assertEqual(request.method, 'POST')
1348
844
self.assertEqual(request.content_type, 'multipart/form-data')
1349
self.assertEqual(request.body, '--boundary\r\n'
1350
'Content-Disposition: form-data; name="first"\r\n\r\n'
1353
'Content-Disposition: form-data; name="second"\r\n\r\n'
847
b'Content-Disposition: form-data; name="first"\r\n\r\n'
850
b'Content-Disposition: form-data; name="second"\r\n\r\n'
853
self.assertEqual(request.body, expected)
1356
854
self.assertEqual(request.content_length, 139)
1358
856
def test_blank__post_files(self):
1360
from StringIO import StringIO
1361
858
from webob.request import _get_multipart_boundary
1362
request = Request.blank('/', POST={'first':('filename1', StringIO('1')),
1363
'second':('filename2', '2'),
859
POST = {'first':('filename1', BytesIO(b'1')),
860
'second':('filename2', '2'),
862
request = self._blankOne('/', POST=POST)
1365
863
self.assertEqual(request.method, 'POST')
1366
864
self.assertEqual(request.content_type, 'multipart/form-data')
1367
boundary = _get_multipart_boundary(request.headers['content-type'])
1368
body_norm = request.body.replace(boundary, 'boundary')
1369
self.assertEqual(body_norm, '--boundary\r\n'
1370
'Content-Disposition: form-data; name="first"; filename="filename1"\r\n\r\n'
1373
'Content-Disposition: form-data; name="second"; filename="filename2"\r\n\r\n'
1376
'Content-Disposition: form-data; name="third"\r\n\r\n'
866
_get_multipart_boundary(request.headers['content-type']))
867
body_norm = request.body.replace(boundary, b'boundary')
870
b'Content-Disposition: form-data; name="first"; filename="filename1"\r\n\r\n'
873
b'Content-Disposition: form-data; name="second"; filename="filename2"\r\n\r\n'
876
b'Content-Disposition: form-data; name="third"\r\n\r\n'
880
self.assertEqual(body_norm, expected)
1379
881
self.assertEqual(request.content_length, 294)
1380
882
self.assertTrue(isinstance(request.POST['first'], cgi.FieldStorage))
1381
883
self.assertTrue(isinstance(request.POST['second'], cgi.FieldStorage))
1382
self.assertEqual(request.POST['first'].value, '1')
1383
self.assertEqual(request.POST['second'].value, '2')
884
self.assertEqual(request.POST['first'].value, b'1')
885
self.assertEqual(request.POST['second'].value, b'2')
1384
886
self.assertEqual(request.POST['third'], '3')
1386
888
def test_blank__post_file_w_wrong_ctype(self):
1387
self.assertRaises(ValueError, Request.blank, '/', POST={'first':('filename1', '1')},
1388
content_type='application/x-www-form-urlencoded')
1391
def test_from_string_extra_data(self):
1392
from webob import BaseRequest
1393
_test_req_copy = _test_req.replace('Content-Type',
1394
'Content-Length: 337\r\nContent-Type')
1395
self.assertRaises(ValueError, BaseRequest.from_string,
1396
_test_req_copy+'EXTRA!')
890
ValueError, self._blankOne, '/', POST={'first':('filename1', '1')},
891
content_type='application/x-www-form-urlencoded')
894
def test_from_bytes_extra_data(self):
895
_test_req_copy = _test_req.replace(
897
b'Content-Length: 337\r\nContent-Type')
898
cls = self._getTargetClass()
899
self.assertRaises(ValueError, cls.from_bytes,
900
_test_req_copy+b'EXTRA!')
903
def test_as_bytes_skip_body(self):
904
cls = self._getTargetClass()
905
req = cls.from_bytes(_test_req)
906
body = req.as_bytes(skip_body=True)
907
self.assertEqual(body.count(b'\r\n\r\n'), 0)
908
self.assertEqual(req.as_bytes(skip_body=337), req.as_bytes())
909
body = req.as_bytes(337-1).split(b'\r\n\r\n', 1)[1]
910
self.assertEqual(body, b'<body skipped (len=337)>')
1399
912
def test_as_string_skip_body(self):
1400
from webob import BaseRequest
1401
req = BaseRequest.from_string(_test_req)
1402
body = req.as_string(skip_body=True)
1403
self.assertEqual(body.count('\r\n\r\n'), 0)
1404
self.assertEqual(req.as_string(skip_body=337), req.as_string())
1405
body = req.as_string(337-1).split('\r\n\r\n', 1)[1]
1406
self.assertEqual(body, '<body skipped (len=337)>')
913
with warnings.catch_warnings(record=True):
914
cls = self._getTargetClass()
915
req = cls.from_string(_test_req)
916
body = req.as_string(skip_body=True)
917
self.assertEqual(body.count(b'\r\n\r\n'), 0)
918
self.assertEqual(req.as_string(skip_body=337), req.as_string())
919
body = req.as_string(337-1).split(b'\r\n\r\n', 1)[1]
920
self.assertEqual(body, b'<body skipped (len=337)>')
922
class TestBaseRequest(unittest.TestCase):
923
# tests of methods of a base request which are encoding-specific
924
def _getTargetClass(self):
925
from webob.request import BaseRequest
928
def _makeOne(self, *arg, **kw):
929
cls = self._getTargetClass()
930
return cls(*arg, **kw)
932
def _blankOne(self, *arg, **kw):
933
cls = self._getTargetClass()
934
return cls.blank(*arg, **kw)
936
def test_method(self):
937
environ = {'REQUEST_METHOD': 'OPTIONS',
939
req = self._makeOne(environ)
941
self.assertEqual(result.__class__, str)
942
self.assertEqual(result, 'OPTIONS')
944
def test_http_version(self):
945
environ = {'SERVER_PROTOCOL': '1.1',
947
req = self._makeOne(environ)
948
result = req.http_version
949
self.assertEqual(result, '1.1')
951
def test_script_name(self):
952
environ = {'SCRIPT_NAME': '/script',
954
req = self._makeOne(environ)
955
self.assertEqual(req.script_name, '/script')
957
def test_path_info(self):
958
environ = {'PATH_INFO': '/path/info',
960
req = self._makeOne(environ)
961
self.assertEqual(req.path_info, '/path/info')
963
def test_content_length_getter(self):
964
environ = {'CONTENT_LENGTH': '1234',
966
req = self._makeOne(environ)
967
self.assertEqual(req.content_length, 1234)
969
def test_content_length_setter_w_str(self):
970
environ = {'CONTENT_LENGTH': '1234',
972
req = self._makeOne(environ)
973
req.content_length = '3456'
974
self.assertEqual(req.content_length, 3456)
976
def test_remote_user(self):
977
environ = {'REMOTE_USER': 'phred',
979
req = self._makeOne(environ)
980
self.assertEqual(req.remote_user, 'phred')
982
def test_remote_addr(self):
983
environ = {'REMOTE_ADDR': '1.2.3.4',
985
req = self._makeOne(environ)
986
self.assertEqual(req.remote_addr, '1.2.3.4')
988
def test_query_string(self):
989
environ = {'QUERY_STRING': 'foo=bar&baz=bam',
991
req = self._makeOne(environ)
992
self.assertEqual(req.query_string, 'foo=bar&baz=bam')
994
def test_server_name(self):
995
environ = {'SERVER_NAME': 'somehost.tld',
997
req = self._makeOne(environ)
998
self.assertEqual(req.server_name, 'somehost.tld')
1000
def test_server_port_getter(self):
1001
environ = {'SERVER_PORT': '6666',
1003
req = self._makeOne(environ)
1004
self.assertEqual(req.server_port, 6666)
1006
def test_server_port_setter_with_string(self):
1007
environ = {'SERVER_PORT': '6666',
1009
req = self._makeOne(environ)
1010
req.server_port = '6667'
1011
self.assertEqual(req.server_port, 6667)
1013
def test_uscript_name(self):
1014
environ = {'SCRIPT_NAME': '/script',
1016
req = self._makeOne(environ)
1017
self.assertTrue(isinstance(req.uscript_name, text_type))
1018
self.assertEqual(req.uscript_name, '/script')
1020
def test_upath_info(self):
1021
environ = {'PATH_INFO': '/path/info',
1023
req = self._makeOne(environ)
1024
self.assertTrue(isinstance(req.upath_info, text_type))
1025
self.assertEqual(req.upath_info, '/path/info')
1027
def test_upath_info_set_unicode(self):
1028
environ = {'PATH_INFO': '/path/info',
1030
req = self._makeOne(environ)
1031
req.upath_info = text_('/another')
1032
self.assertTrue(isinstance(req.upath_info, text_type))
1033
self.assertEqual(req.upath_info, '/another')
1035
def test_content_type_getter_no_parameters(self):
1036
environ = {'CONTENT_TYPE': 'application/xml+foobar',
1038
req = self._makeOne(environ)
1039
self.assertEqual(req.content_type, 'application/xml+foobar')
1041
def test_content_type_getter_w_parameters(self):
1042
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
1044
req = self._makeOne(environ)
1045
self.assertEqual(req.content_type, 'application/xml+foobar')
1047
def test_content_type_setter_w_None(self):
1048
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
1050
req = self._makeOne(environ)
1051
req.content_type = None
1052
self.assertEqual(req.content_type, '')
1053
self.assertTrue('CONTENT_TYPE' not in environ)
1055
def test_content_type_setter_existing_paramter_no_new_paramter(self):
1056
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
1058
req = self._makeOne(environ)
1059
req.content_type = 'text/xml'
1060
self.assertEqual(req.content_type, 'text/xml')
1061
self.assertEqual(environ['CONTENT_TYPE'], 'text/xml;charset="utf8"')
1063
def test_content_type_deleter_clears_environ_value(self):
1064
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
1066
req = self._makeOne(environ)
1067
del req.content_type
1068
self.assertEqual(req.content_type, '')
1069
self.assertTrue('CONTENT_TYPE' not in environ)
1071
def test_content_type_deleter_no_environ_value(self):
1073
req = self._makeOne(environ)
1074
del req.content_type
1075
self.assertEqual(req.content_type, '')
1076
self.assertTrue('CONTENT_TYPE' not in environ)
1078
def test_headers_getter(self):
1079
CONTENT_TYPE = 'application/xml+foobar;charset="utf8"'
1080
environ = {'CONTENT_TYPE': CONTENT_TYPE,
1081
'CONTENT_LENGTH': '123',
1083
req = self._makeOne(environ)
1084
headers = req.headers
1085
self.assertEqual(headers,
1086
{'Content-Type': CONTENT_TYPE,
1087
'Content-Length': '123'})
1089
def test_headers_setter(self):
1090
CONTENT_TYPE = 'application/xml+foobar;charset="utf8"'
1091
environ = {'CONTENT_TYPE': CONTENT_TYPE,
1092
'CONTENT_LENGTH': '123',
1094
req = self._makeOne(environ)
1095
req.headers = {'Qux': 'Spam'}
1096
self.assertEqual(req.headers,
1098
self.assertEqual(environ, {'HTTP_QUX': 'Spam'})
1100
def test_no_headers_deleter(self):
1101
CONTENT_TYPE = 'application/xml+foobar;charset="utf8"'
1102
environ = {'CONTENT_TYPE': CONTENT_TYPE,
1103
'CONTENT_LENGTH': '123',
1105
req = self._makeOne(environ)
1108
self.assertRaises(AttributeError, _test)
1110
def test_client_addr_xff_singleval(self):
1112
'HTTP_X_FORWARDED_FOR': '192.168.1.1',
1114
req = self._makeOne(environ)
1115
self.assertEqual(req.client_addr, '192.168.1.1')
1117
def test_client_addr_xff_multival(self):
1119
'HTTP_X_FORWARDED_FOR': '192.168.1.1, 192.168.1.2',
1121
req = self._makeOne(environ)
1122
self.assertEqual(req.client_addr, '192.168.1.1')
1124
def test_client_addr_prefers_xff(self):
1125
environ = {'REMOTE_ADDR': '192.168.1.2',
1126
'HTTP_X_FORWARDED_FOR': '192.168.1.1',
1128
req = self._makeOne(environ)
1129
self.assertEqual(req.client_addr, '192.168.1.1')
1131
def test_client_addr_no_xff(self):
1132
environ = {'REMOTE_ADDR': '192.168.1.2',
1134
req = self._makeOne(environ)
1135
self.assertEqual(req.client_addr, '192.168.1.2')
1137
def test_client_addr_no_xff_no_remote_addr(self):
1139
req = self._makeOne(environ)
1140
self.assertEqual(req.client_addr, None)
1142
def test_host_port_w_http_host_and_no_port(self):
1143
environ = {'wsgi.url_scheme': 'http',
1144
'HTTP_HOST': 'example.com',
1146
req = self._makeOne(environ)
1147
self.assertEqual(req.host_port, '80')
1149
def test_host_port_w_http_host_and_standard_port(self):
1150
environ = {'wsgi.url_scheme': 'http',
1151
'HTTP_HOST': 'example.com:80',
1153
req = self._makeOne(environ)
1154
self.assertEqual(req.host_port, '80')
1156
def test_host_port_w_http_host_and_oddball_port(self):
1157
environ = {'wsgi.url_scheme': 'http',
1158
'HTTP_HOST': 'example.com:8888',
1160
req = self._makeOne(environ)
1161
self.assertEqual(req.host_port, '8888')
1163
def test_host_port_w_http_host_https_and_no_port(self):
1164
environ = {'wsgi.url_scheme': 'https',
1165
'HTTP_HOST': 'example.com',
1167
req = self._makeOne(environ)
1168
self.assertEqual(req.host_port, '443')
1170
def test_host_port_w_http_host_https_and_standard_port(self):
1171
environ = {'wsgi.url_scheme': 'https',
1172
'HTTP_HOST': 'example.com:443',
1174
req = self._makeOne(environ)
1175
self.assertEqual(req.host_port, '443')
1177
def test_host_port_w_http_host_https_and_oddball_port(self):
1178
environ = {'wsgi.url_scheme': 'https',
1179
'HTTP_HOST': 'example.com:8888',
1181
req = self._makeOne(environ)
1182
self.assertEqual(req.host_port, '8888')
1184
def test_host_port_wo_http_host(self):
1185
environ = {'wsgi.url_scheme': 'https',
1186
'SERVER_PORT': '4333',
1188
req = self._makeOne(environ)
1189
self.assertEqual(req.host_port, '4333')
1191
def test_host_url_w_http_host_and_no_port(self):
1192
environ = {'wsgi.url_scheme': 'http',
1193
'HTTP_HOST': 'example.com',
1195
req = self._makeOne(environ)
1196
self.assertEqual(req.host_url, 'http://example.com')
1198
def test_host_url_w_http_host_and_standard_port(self):
1199
environ = {'wsgi.url_scheme': 'http',
1200
'HTTP_HOST': 'example.com:80',
1202
req = self._makeOne(environ)
1203
self.assertEqual(req.host_url, 'http://example.com')
1205
def test_host_url_w_http_host_and_oddball_port(self):
1206
environ = {'wsgi.url_scheme': 'http',
1207
'HTTP_HOST': 'example.com:8888',
1209
req = self._makeOne(environ)
1210
self.assertEqual(req.host_url, 'http://example.com:8888')
1212
def test_host_url_w_http_host_https_and_no_port(self):
1213
environ = {'wsgi.url_scheme': 'https',
1214
'HTTP_HOST': 'example.com',
1216
req = self._makeOne(environ)
1217
self.assertEqual(req.host_url, 'https://example.com')
1219
def test_host_url_w_http_host_https_and_standard_port(self):
1220
environ = {'wsgi.url_scheme': 'https',
1221
'HTTP_HOST': 'example.com:443',
1223
req = self._makeOne(environ)
1224
self.assertEqual(req.host_url, 'https://example.com')
1226
def test_host_url_w_http_host_https_and_oddball_port(self):
1227
environ = {'wsgi.url_scheme': 'https',
1228
'HTTP_HOST': 'example.com:4333',
1230
req = self._makeOne(environ)
1231
self.assertEqual(req.host_url, 'https://example.com:4333')
1233
def test_host_url_wo_http_host(self):
1234
environ = {'wsgi.url_scheme': 'https',
1235
'SERVER_NAME': 'example.com',
1236
'SERVER_PORT': '4333',
1238
req = self._makeOne(environ)
1239
self.assertEqual(req.host_url, 'https://example.com:4333')
1241
def test_application_url(self):
1242
inst = self._blankOne('/%C3%AB')
1243
inst.script_name = text_(b'/\xc3\xab', 'utf-8')
1244
app_url = inst.application_url
1245
self.assertEqual(app_url.__class__, str)
1246
self.assertEqual(app_url, 'http://localhost/%C3%AB')
1248
def test_path_url(self):
1249
inst = self._blankOne('/%C3%AB')
1250
inst.script_name = text_(b'/\xc3\xab', 'utf-8')
1251
app_url = inst.path_url
1252
self.assertEqual(app_url.__class__, str)
1253
self.assertEqual(app_url, 'http://localhost/%C3%AB/%C3%AB')
1255
def test_path(self):
1256
inst = self._blankOne('/%C3%AB')
1257
inst.script_name = text_(b'/\xc3\xab', 'utf-8')
1259
self.assertEqual(app_url.__class__, str)
1260
self.assertEqual(app_url, '/%C3%AB/%C3%AB')
1262
def test_path_qs_no_qs(self):
1263
environ = {'wsgi.url_scheme': 'http',
1264
'SERVER_NAME': 'example.com',
1265
'SERVER_PORT': '80',
1266
'SCRIPT_NAME': '/script',
1267
'PATH_INFO': '/path/info',
1269
req = self._makeOne(environ)
1270
self.assertEqual(req.path_qs, '/script/path/info')
1272
def test_path_qs_w_qs(self):
1273
environ = {'wsgi.url_scheme': 'http',
1274
'SERVER_NAME': 'example.com',
1275
'SERVER_PORT': '80',
1276
'SCRIPT_NAME': '/script',
1277
'PATH_INFO': '/path/info',
1278
'QUERY_STRING': 'foo=bar&baz=bam'
1280
req = self._makeOne(environ)
1281
self.assertEqual(req.path_qs, '/script/path/info?foo=bar&baz=bam')
1283
def test_url_no_qs(self):
1284
environ = {'wsgi.url_scheme': 'http',
1285
'SERVER_NAME': 'example.com',
1286
'SERVER_PORT': '80',
1287
'SCRIPT_NAME': '/script',
1288
'PATH_INFO': '/path/info',
1290
req = self._makeOne(environ)
1291
self.assertEqual(req.url, 'http://example.com/script/path/info')
1293
def test_url_w_qs(self):
1294
environ = {'wsgi.url_scheme': 'http',
1295
'SERVER_NAME': 'example.com',
1296
'SERVER_PORT': '80',
1297
'SCRIPT_NAME': '/script',
1298
'PATH_INFO': '/path/info',
1299
'QUERY_STRING': 'foo=bar&baz=bam'
1301
req = self._makeOne(environ)
1302
self.assertEqual(req.url,
1303
'http://example.com/script/path/info?foo=bar&baz=bam')
1305
def test_relative_url_to_app_true_wo_leading_slash(self):
1306
environ = {'wsgi.url_scheme': 'http',
1307
'SERVER_NAME': 'example.com',
1308
'SERVER_PORT': '80',
1309
'SCRIPT_NAME': '/script',
1310
'PATH_INFO': '/path/info',
1311
'QUERY_STRING': 'foo=bar&baz=bam'
1313
req = self._makeOne(environ)
1314
self.assertEqual(req.relative_url('other/page', True),
1315
'http://example.com/script/other/page')
1317
def test_relative_url_to_app_true_w_leading_slash(self):
1318
environ = {'wsgi.url_scheme': 'http',
1319
'SERVER_NAME': 'example.com',
1320
'SERVER_PORT': '80',
1321
'SCRIPT_NAME': '/script',
1322
'PATH_INFO': '/path/info',
1323
'QUERY_STRING': 'foo=bar&baz=bam'
1325
req = self._makeOne(environ)
1326
self.assertEqual(req.relative_url('/other/page', True),
1327
'http://example.com/other/page')
1329
def test_relative_url_to_app_false_other_w_leading_slash(self):
1330
environ = {'wsgi.url_scheme': 'http',
1331
'SERVER_NAME': 'example.com',
1332
'SERVER_PORT': '80',
1333
'SCRIPT_NAME': '/script',
1334
'PATH_INFO': '/path/info',
1335
'QUERY_STRING': 'foo=bar&baz=bam'
1337
req = self._makeOne(environ)
1338
self.assertEqual(req.relative_url('/other/page', False),
1339
'http://example.com/other/page')
1341
def test_relative_url_to_app_false_other_wo_leading_slash(self):
1342
environ = {'wsgi.url_scheme': 'http',
1343
'SERVER_NAME': 'example.com',
1344
'SERVER_PORT': '80',
1345
'SCRIPT_NAME': '/script',
1346
'PATH_INFO': '/path/info',
1347
'QUERY_STRING': 'foo=bar&baz=bam'
1349
req = self._makeOne(environ)
1350
self.assertEqual(req.relative_url('other/page', False),
1351
'http://example.com/script/path/other/page')
1353
def test_path_info_pop_empty(self):
1354
environ = {'wsgi.url_scheme': 'http',
1355
'SERVER_NAME': 'example.com',
1356
'SERVER_PORT': '80',
1357
'SCRIPT_NAME': '/script',
1360
req = self._makeOne(environ)
1361
popped = req.path_info_pop()
1362
self.assertEqual(popped, None)
1363
self.assertEqual(environ['SCRIPT_NAME'], '/script')
1365
def test_path_info_pop_just_leading_slash(self):
1366
environ = {'wsgi.url_scheme': 'http',
1367
'SERVER_NAME': 'example.com',
1368
'SERVER_PORT': '80',
1369
'SCRIPT_NAME': '/script',
1372
req = self._makeOne(environ)
1373
popped = req.path_info_pop()
1374
self.assertEqual(popped, '')
1375
self.assertEqual(environ['SCRIPT_NAME'], '/script/')
1376
self.assertEqual(environ['PATH_INFO'], '')
1378
def test_path_info_pop_non_empty_no_pattern(self):
1379
environ = {'wsgi.url_scheme': 'http',
1380
'SERVER_NAME': 'example.com',
1381
'SERVER_PORT': '80',
1382
'SCRIPT_NAME': '/script',
1383
'PATH_INFO': '/path/info',
1385
req = self._makeOne(environ)
1386
popped = req.path_info_pop()
1387
self.assertEqual(popped, 'path')
1388
self.assertEqual(environ['SCRIPT_NAME'], '/script/path')
1389
self.assertEqual(environ['PATH_INFO'], '/info')
1391
def test_path_info_pop_non_empty_w_pattern_miss(self):
1393
PATTERN = re.compile('miss')
1394
environ = {'wsgi.url_scheme': 'http',
1395
'SERVER_NAME': 'example.com',
1396
'SERVER_PORT': '80',
1397
'SCRIPT_NAME': '/script',
1398
'PATH_INFO': '/path/info',
1400
req = self._makeOne(environ)
1401
popped = req.path_info_pop(PATTERN)
1402
self.assertEqual(popped, None)
1403
self.assertEqual(environ['SCRIPT_NAME'], '/script')
1404
self.assertEqual(environ['PATH_INFO'], '/path/info')
1406
def test_path_info_pop_non_empty_w_pattern_hit(self):
1408
PATTERN = re.compile('path')
1409
environ = {'wsgi.url_scheme': 'http',
1410
'SERVER_NAME': 'example.com',
1411
'SERVER_PORT': '80',
1412
'SCRIPT_NAME': '/script',
1413
'PATH_INFO': '/path/info',
1415
req = self._makeOne(environ)
1416
popped = req.path_info_pop(PATTERN)
1417
self.assertEqual(popped, 'path')
1418
self.assertEqual(environ['SCRIPT_NAME'], '/script/path')
1419
self.assertEqual(environ['PATH_INFO'], '/info')
1421
def test_path_info_pop_skips_empty_elements(self):
1422
environ = {'wsgi.url_scheme': 'http',
1423
'SERVER_NAME': 'example.com',
1424
'SERVER_PORT': '80',
1425
'SCRIPT_NAME': '/script',
1426
'PATH_INFO': '//path/info',
1428
req = self._makeOne(environ)
1429
popped = req.path_info_pop()
1430
self.assertEqual(popped, 'path')
1431
self.assertEqual(environ['SCRIPT_NAME'], '/script//path')
1432
self.assertEqual(environ['PATH_INFO'], '/info')
1434
def test_path_info_peek_empty(self):
1435
environ = {'wsgi.url_scheme': 'http',
1436
'SERVER_NAME': 'example.com',
1437
'SERVER_PORT': '80',
1438
'SCRIPT_NAME': '/script',
1441
req = self._makeOne(environ)
1442
peeked = req.path_info_peek()
1443
self.assertEqual(peeked, None)
1444
self.assertEqual(environ['SCRIPT_NAME'], '/script')
1445
self.assertEqual(environ['PATH_INFO'], '')
1447
def test_path_info_peek_just_leading_slash(self):
1448
environ = {'wsgi.url_scheme': 'http',
1449
'SERVER_NAME': 'example.com',
1450
'SERVER_PORT': '80',
1451
'SCRIPT_NAME': '/script',
1454
req = self._makeOne(environ)
1455
peeked = req.path_info_peek()
1456
self.assertEqual(peeked, '')
1457
self.assertEqual(environ['SCRIPT_NAME'], '/script')
1458
self.assertEqual(environ['PATH_INFO'], '/')
1460
def test_path_info_peek_non_empty(self):
1461
environ = {'wsgi.url_scheme': 'http',
1462
'SERVER_NAME': 'example.com',
1463
'SERVER_PORT': '80',
1464
'SCRIPT_NAME': '/script',
1465
'PATH_INFO': '/path',
1467
req = self._makeOne(environ)
1468
peeked = req.path_info_peek()
1469
self.assertEqual(peeked, 'path')
1470
self.assertEqual(environ['SCRIPT_NAME'], '/script')
1471
self.assertEqual(environ['PATH_INFO'], '/path')
1473
def test_is_xhr_no_header(self):
1474
req = self._makeOne({})
1475
self.assertTrue(not req.is_xhr)
1477
def test_is_xhr_header_miss(self):
1478
environ = {'HTTP_X_REQUESTED_WITH': 'notAnXMLHTTPRequest'}
1479
req = self._makeOne(environ)
1480
self.assertTrue(not req.is_xhr)
1482
def test_is_xhr_header_hit(self):
1483
environ = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
1484
req = self._makeOne(environ)
1485
self.assertTrue(req.is_xhr)
1488
def test_host_getter_w_HTTP_HOST(self):
1489
environ = {'HTTP_HOST': 'example.com:8888'}
1490
req = self._makeOne(environ)
1491
self.assertEqual(req.host, 'example.com:8888')
1493
def test_host_getter_wo_HTTP_HOST(self):
1494
environ = {'SERVER_NAME': 'example.com',
1495
'SERVER_PORT': '8888'}
1496
req = self._makeOne(environ)
1497
self.assertEqual(req.host, 'example.com:8888')
1499
def test_host_setter(self):
1501
req = self._makeOne(environ)
1502
req.host = 'example.com:8888'
1503
self.assertEqual(environ['HTTP_HOST'], 'example.com:8888')
1505
def test_host_deleter_hit(self):
1506
environ = {'HTTP_HOST': 'example.com:8888'}
1507
req = self._makeOne(environ)
1509
self.assertTrue('HTTP_HOST' not in environ)
1511
def test_host_deleter_miss(self):
1513
req = self._makeOne(environ)
1514
del req.host # doesn't raise
1516
def test_encget_raises_without_default(self):
1517
inst = self._makeOne({})
1518
self.assertRaises(KeyError, inst.encget, 'a')
1520
def test_encget_doesnt_raises_with_default(self):
1521
inst = self._makeOne({})
1522
self.assertEqual(inst.encget('a', None), None)
1524
def test_encget_with_encattr(self):
1526
val = b'\xc3\xab'.decode('latin-1')
1529
inst = self._makeOne({'a':val})
1530
self.assertEqual(inst.encget('a', encattr='url_encoding'),
1531
text_(b'\xc3\xab', 'utf-8'))
1533
def test_encget_with_encattr_latin_1(self):
1535
val = b'\xc3\xab'.decode('latin-1')
1538
inst = self._makeOne({'a':val})
1539
inst.my_encoding = 'latin-1'
1540
self.assertEqual(inst.encget('a', encattr='my_encoding'),
1541
text_(b'\xc3\xab', 'latin-1'))
1543
def test_encget_no_encattr(self):
1545
val = b'\xc3\xab'.decode('latin-1')
1548
inst = self._makeOne({'a':val})
1549
self.assertEqual(inst.encget('a'), val)
1551
def test_relative_url(self):
1552
inst = self._blankOne('/%C3%AB/c')
1553
result = inst.relative_url('a')
1554
self.assertEqual(result.__class__, str)
1555
self.assertEqual(result, 'http://localhost/%C3%AB/a')
1557
def test_header_getter(self):
1559
val = b'abc'.decode('latin-1')
1562
inst = self._makeOne({'HTTP_FLUB':val})
1563
result = inst.headers['Flub']
1564
self.assertEqual(result.__class__, str)
1565
self.assertEqual(result, 'abc')
1567
def test_json_body(self):
1568
inst = self._makeOne({})
1569
inst.body = b'{"a":"1"}'
1570
self.assertEqual(inst.json_body, {'a':'1'})
1571
inst.json_body = {'a': '2'}
1572
self.assertEqual(inst.body, b'{"a":"2"}')
1574
def test_host_get(self):
1575
inst = self._makeOne({'HTTP_HOST':'example.com'})
1577
self.assertEqual(result.__class__, str)
1578
self.assertEqual(result, 'example.com')
1580
def test_host_get_w_no_http_host(self):
1581
inst = self._makeOne({'SERVER_NAME':'example.com', 'SERVER_PORT':'80'})
1583
self.assertEqual(result.__class__, str)
1584
self.assertEqual(result, 'example.com:80')
1586
class TestLegacyRequest(unittest.TestCase):
1587
# tests of methods of a bytesrequest which deal with http environment vars
1588
def _getTargetClass(self):
1589
from webob.request import LegacyRequest
1590
return LegacyRequest
1592
def _makeOne(self, *arg, **kw):
1593
cls = self._getTargetClass()
1594
return cls(*arg, **kw)
1596
def _blankOne(self, *arg, **kw):
1597
cls = self._getTargetClass()
1598
return cls.blank(*arg, **kw)
1600
def test_method(self):
1601
environ = {'REQUEST_METHOD': 'OPTIONS',
1603
req = self._makeOne(environ)
1604
self.assertEqual(req.method, 'OPTIONS')
1606
def test_http_version(self):
1607
environ = {'SERVER_PROTOCOL': '1.1',
1609
req = self._makeOne(environ)
1610
self.assertEqual(req.http_version, '1.1')
1612
def test_script_name(self):
1613
environ = {'SCRIPT_NAME': '/script',
1615
req = self._makeOne(environ)
1616
self.assertEqual(req.script_name, '/script')
1618
def test_path_info(self):
1619
environ = {'PATH_INFO': '/path/info',
1621
req = self._makeOne(environ)
1622
self.assertEqual(req.path_info, '/path/info')
1624
def test_content_length_getter(self):
1625
environ = {'CONTENT_LENGTH': '1234',
1627
req = self._makeOne(environ)
1628
self.assertEqual(req.content_length, 1234)
1630
def test_content_length_setter_w_str(self):
1631
environ = {'CONTENT_LENGTH': '1234',
1633
req = self._makeOne(environ)
1634
req.content_length = '3456'
1635
self.assertEqual(req.content_length, 3456)
1637
def test_remote_user(self):
1638
environ = {'REMOTE_USER': 'phred',
1640
req = self._makeOne(environ)
1641
self.assertEqual(req.remote_user, 'phred')
1643
def test_remote_addr(self):
1644
environ = {'REMOTE_ADDR': '1.2.3.4',
1646
req = self._makeOne(environ)
1647
self.assertEqual(req.remote_addr, '1.2.3.4')
1649
def test_query_string(self):
1650
environ = {'QUERY_STRING': 'foo=bar&baz=bam',
1652
req = self._makeOne(environ)
1653
self.assertEqual(req.query_string, 'foo=bar&baz=bam')
1655
def test_server_name(self):
1656
environ = {'SERVER_NAME': 'somehost.tld',
1658
req = self._makeOne(environ)
1659
self.assertEqual(req.server_name, 'somehost.tld')
1661
def test_server_port_getter(self):
1662
environ = {'SERVER_PORT': '6666',
1664
req = self._makeOne(environ)
1665
self.assertEqual(req.server_port, 6666)
1667
def test_server_port_setter_with_string(self):
1668
environ = {'SERVER_PORT': '6666',
1670
req = self._makeOne(environ)
1671
req.server_port = '6667'
1672
self.assertEqual(req.server_port, 6667)
1674
def test_uscript_name(self):
1675
environ = {'SCRIPT_NAME': '/script',
1677
req = self._makeOne(environ)
1678
self.assertTrue(isinstance(req.uscript_name, text_type))
1679
result = req.uscript_name
1680
self.assertEqual(result.__class__, text_type)
1681
self.assertEqual(result, '/script')
1683
def test_upath_info(self):
1684
environ = {'PATH_INFO': '/path/info',
1686
req = self._makeOne(environ)
1687
result = req.upath_info
1688
self.assertTrue(isinstance(result, text_type))
1689
self.assertEqual(result, '/path/info')
1691
def test_upath_info_set_unicode(self):
1692
environ = {'PATH_INFO': '/path/info',
1694
req = self._makeOne(environ)
1695
req.upath_info = text_('/another')
1696
result = req.upath_info
1697
self.assertTrue(isinstance(result, text_type))
1698
self.assertEqual(result, '/another')
1700
def test_content_type_getter_no_parameters(self):
1701
environ = {'CONTENT_TYPE': 'application/xml+foobar',
1703
req = self._makeOne(environ)
1704
self.assertEqual(req.content_type, 'application/xml+foobar')
1706
def test_content_type_getter_w_parameters(self):
1707
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
1709
req = self._makeOne(environ)
1710
self.assertEqual(req.content_type, 'application/xml+foobar')
1712
def test_content_type_setter_w_None(self):
1713
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
1715
req = self._makeOne(environ)
1716
req.content_type = None
1717
self.assertEqual(req.content_type, '')
1718
self.assertTrue('CONTENT_TYPE' not in environ)
1720
def test_content_type_setter_existing_paramter_no_new_paramter(self):
1721
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
1723
req = self._makeOne(environ)
1724
req.content_type = 'text/xml'
1725
self.assertEqual(req.content_type, 'text/xml')
1726
self.assertEqual(environ['CONTENT_TYPE'], 'text/xml;charset="utf8"')
1728
def test_content_type_deleter_clears_environ_value(self):
1729
environ = {'CONTENT_TYPE': 'application/xml+foobar;charset="utf8"',
1731
req = self._makeOne(environ)
1732
del req.content_type
1733
self.assertEqual(req.content_type, '')
1734
self.assertTrue('CONTENT_TYPE' not in environ)
1736
def test_content_type_deleter_no_environ_value(self):
1738
req = self._makeOne(environ)
1739
del req.content_type
1740
self.assertEqual(req.content_type, '')
1741
self.assertTrue('CONTENT_TYPE' not in environ)
1743
def test_headers_getter(self):
1744
CONTENT_TYPE = 'application/xml+foobar;charset="utf8"'
1745
environ = {'CONTENT_TYPE': CONTENT_TYPE,
1746
'CONTENT_LENGTH': '123',
1748
req = self._makeOne(environ)
1749
headers = req.headers
1750
self.assertEqual(headers,
1751
{'Content-Type':CONTENT_TYPE,
1752
'Content-Length': '123'})
1754
def test_headers_setter(self):
1755
CONTENT_TYPE = 'application/xml+foobar;charset="utf8"'
1756
environ = {'CONTENT_TYPE': CONTENT_TYPE,
1757
'CONTENT_LENGTH': '123',
1759
req = self._makeOne(environ)
1760
req.headers = {'Qux': 'Spam'}
1761
self.assertEqual(req.headers,
1763
self.assertEqual(environ['HTTP_QUX'], native_('Spam'))
1764
self.assertEqual(environ, {'HTTP_QUX': 'Spam'})
1766
def test_no_headers_deleter(self):
1767
CONTENT_TYPE = 'application/xml+foobar;charset="utf8"'
1768
environ = {'CONTENT_TYPE': CONTENT_TYPE,
1769
'CONTENT_LENGTH': '123',
1771
req = self._makeOne(environ)
1774
self.assertRaises(AttributeError, _test)
1776
def test_client_addr_xff_singleval(self):
1778
'HTTP_X_FORWARDED_FOR': '192.168.1.1',
1780
req = self._makeOne(environ)
1781
self.assertEqual(req.client_addr, '192.168.1.1')
1783
def test_client_addr_xff_multival(self):
1785
'HTTP_X_FORWARDED_FOR': '192.168.1.1, 192.168.1.2',
1787
req = self._makeOne(environ)
1788
self.assertEqual(req.client_addr, '192.168.1.1')
1790
def test_client_addr_prefers_xff(self):
1791
environ = {'REMOTE_ADDR': '192.168.1.2',
1792
'HTTP_X_FORWARDED_FOR': '192.168.1.1',
1794
req = self._makeOne(environ)
1795
self.assertEqual(req.client_addr, '192.168.1.1')
1797
def test_client_addr_no_xff(self):
1798
environ = {'REMOTE_ADDR': '192.168.1.2',
1800
req = self._makeOne(environ)
1801
self.assertEqual(req.client_addr, '192.168.1.2')
1803
def test_client_addr_no_xff_no_remote_addr(self):
1805
req = self._makeOne(environ)
1806
self.assertEqual(req.client_addr, None)
1808
def test_host_port_w_http_host_and_no_port(self):
1809
environ = {'wsgi.url_scheme': 'http',
1810
'HTTP_HOST': 'example.com',
1812
req = self._makeOne(environ)
1813
self.assertEqual(req.host_port, '80')
1815
def test_host_port_w_http_host_and_standard_port(self):
1816
environ = {'wsgi.url_scheme': 'http',
1817
'HTTP_HOST': 'example.com:80',
1819
req = self._makeOne(environ)
1820
self.assertEqual(req.host_port, '80')
1822
def test_host_port_w_http_host_and_oddball_port(self):
1823
environ = {'wsgi.url_scheme': 'http',
1824
'HTTP_HOST': 'example.com:8888',
1826
req = self._makeOne(environ)
1827
self.assertEqual(req.host_port, '8888')
1829
def test_host_port_w_http_host_https_and_no_port(self):
1830
environ = {'wsgi.url_scheme': 'https',
1831
'HTTP_HOST': 'example.com',
1833
req = self._makeOne(environ)
1834
self.assertEqual(req.host_port, '443')
1836
def test_host_port_w_http_host_https_and_standard_port(self):
1837
environ = {'wsgi.url_scheme': 'https',
1838
'HTTP_HOST': 'example.com:443',
1840
req = self._makeOne(environ)
1841
self.assertEqual(req.host_port, '443')
1843
def test_host_port_w_http_host_https_and_oddball_port(self):
1844
environ = {'wsgi.url_scheme': 'https',
1845
'HTTP_HOST': 'example.com:8888',
1847
req = self._makeOne(environ)
1848
self.assertEqual(req.host_port, '8888')
1850
def test_host_port_wo_http_host(self):
1851
environ = {'wsgi.url_scheme': 'https',
1852
'SERVER_PORT': '4333',
1854
req = self._makeOne(environ)
1855
self.assertEqual(req.host_port, '4333')
1857
def test_host_url_w_http_host_and_no_port(self):
1858
environ = {'wsgi.url_scheme': 'http',
1859
'HTTP_HOST': 'example.com',
1861
req = self._makeOne(environ)
1862
self.assertEqual(req.host_url, 'http://example.com')
1864
def test_host_url_w_http_host_and_standard_port(self):
1865
environ = {'wsgi.url_scheme': 'http',
1866
'HTTP_HOST': 'example.com:80',
1868
req = self._makeOne(environ)
1869
self.assertEqual(req.host_url, 'http://example.com')
1871
def test_host_url_w_http_host_and_oddball_port(self):
1872
environ = {'wsgi.url_scheme': 'http',
1873
'HTTP_HOST': 'example.com:8888',
1875
req = self._makeOne(environ)
1876
self.assertEqual(req.host_url, 'http://example.com:8888')
1878
def test_host_url_w_http_host_https_and_no_port(self):
1879
environ = {'wsgi.url_scheme': 'https',
1880
'HTTP_HOST': 'example.com',
1882
req = self._makeOne(environ)
1883
self.assertEqual(req.host_url, 'https://example.com')
1885
def test_host_url_w_http_host_https_and_standard_port(self):
1886
environ = {'wsgi.url_scheme': 'https',
1887
'HTTP_HOST': 'example.com:443',
1889
req = self._makeOne(environ)
1890
self.assertEqual(req.host_url, 'https://example.com')
1892
def test_host_url_w_http_host_https_and_oddball_port(self):
1893
environ = {'wsgi.url_scheme': 'https',
1894
'HTTP_HOST': 'example.com:4333',
1896
req = self._makeOne(environ)
1897
self.assertEqual(req.host_url, 'https://example.com:4333')
1899
def test_host_url_wo_http_host(self):
1900
environ = {'wsgi.url_scheme': 'https',
1901
'SERVER_NAME': 'example.com',
1902
'SERVER_PORT': '4333',
1904
req = self._makeOne(environ)
1905
self.assertEqual(req.host_url, 'https://example.com:4333')
1907
def test_application_url(self):
1908
inst = self._blankOne('/%C3%AB')
1909
inst.script_name = b'/\xc3\xab'
1910
app_url = inst.application_url
1911
if PY3: # pragma: no cover
1912
# this result is why you should not use legacyrequest under py 3
1913
self.assertEqual(app_url, 'http://localhost/%C3%83%C2%AB')
1915
self.assertEqual(app_url, 'http://localhost/%C3%AB')
1917
def test_path_url(self):
1918
inst = self._blankOne('/%C3%AB')
1919
inst.script_name = b'/\xc3\xab'
1920
result = inst.path_url
1921
if PY3: # pragma: no cover
1922
# this result is why you should not use legacyrequest under py 3
1923
self.assertEqual(result,
1924
'http://localhost/%C3%83%C2%AB/%C3%83%C2%AB')
1926
self.assertEqual(result, 'http://localhost/%C3%AB/%C3%AB')
1928
def test_path(self):
1929
inst = self._blankOne('/%C3%AB')
1930
inst.script_name = b'/\xc3\xab'
1932
if PY3: # pragma: no cover
1933
# this result is why you should not use legacyrequest under py 3
1934
self.assertEqual(result, '/%C3%83%C2%AB/%C3%83%C2%AB')
1936
self.assertEqual(result, '/%C3%AB/%C3%AB')
1938
def test_path_qs_no_qs(self):
1939
environ = {'wsgi.url_scheme': 'http',
1940
'SERVER_NAME': 'example.com',
1941
'SERVER_PORT': '80',
1942
'SCRIPT_NAME': '/script',
1943
'PATH_INFO': '/path/info',
1945
req = self._makeOne(environ)
1946
self.assertEqual(req.path_qs, '/script/path/info')
1948
def test_path_qs_w_qs(self):
1949
environ = {'wsgi.url_scheme': 'http',
1950
'SERVER_NAME': 'example.com',
1951
'SERVER_PORT': '80',
1952
'SCRIPT_NAME': '/script',
1953
'PATH_INFO': '/path/info',
1954
'QUERY_STRING': 'foo=bar&baz=bam'
1956
req = self._makeOne(environ)
1957
self.assertEqual(req.path_qs, '/script/path/info?foo=bar&baz=bam')
1959
def test_url_no_qs(self):
1960
environ = {'wsgi.url_scheme': 'http',
1961
'SERVER_NAME': 'example.com',
1962
'SERVER_PORT': '80',
1963
'SCRIPT_NAME': '/script',
1964
'PATH_INFO': '/path/info',
1966
req = self._makeOne(environ)
1967
self.assertEqual(req.url, 'http://example.com/script/path/info')
1969
def test_url_w_qs(self):
1970
environ = {'wsgi.url_scheme': 'http',
1971
'SERVER_NAME': 'example.com',
1972
'SERVER_PORT': '80',
1973
'SCRIPT_NAME': '/script',
1974
'PATH_INFO': '/path/info',
1975
'QUERY_STRING': 'foo=bar&baz=bam'
1977
req = self._makeOne(environ)
1978
self.assertEqual(req.url,
1979
'http://example.com/script/path/info?foo=bar&baz=bam')
1981
def test_relative_url_to_app_true_wo_leading_slash(self):
1982
environ = {'wsgi.url_scheme': 'http',
1983
'SERVER_NAME': 'example.com',
1984
'SERVER_PORT': '80',
1985
'SCRIPT_NAME': '/script',
1986
'PATH_INFO': '/path/info',
1987
'QUERY_STRING': 'foo=bar&baz=bam'
1989
req = self._makeOne(environ)
1990
self.assertEqual(req.relative_url('other/page', True),
1991
'http://example.com/script/other/page')
1993
def test_relative_url_to_app_true_w_leading_slash(self):
1994
environ = {'wsgi.url_scheme': 'http',
1995
'SERVER_NAME': 'example.com',
1996
'SERVER_PORT': '80',
1997
'SCRIPT_NAME': '/script',
1998
'PATH_INFO': '/path/info',
1999
'QUERY_STRING': 'foo=bar&baz=bam'
2001
req = self._makeOne(environ)
2002
self.assertEqual(req.relative_url('/other/page', True),
2003
'http://example.com/other/page')
2005
def test_relative_url_to_app_false_other_w_leading_slash(self):
2006
environ = {'wsgi.url_scheme': 'http',
2007
'SERVER_NAME': 'example.com',
2008
'SERVER_PORT': '80',
2009
'SCRIPT_NAME': '/script',
2010
'PATH_INFO': '/path/info',
2011
'QUERY_STRING': 'foo=bar&baz=bam'
2013
req = self._makeOne(environ)
2014
self.assertEqual(req.relative_url('/other/page', False),
2015
'http://example.com/other/page')
2017
def test_relative_url_to_app_false_other_wo_leading_slash(self):
2018
environ = {'wsgi.url_scheme': 'http',
2019
'SERVER_NAME': 'example.com',
2020
'SERVER_PORT': '80',
2021
'SCRIPT_NAME': '/script',
2022
'PATH_INFO': '/path/info',
2023
'QUERY_STRING': 'foo=bar&baz=bam'
2025
req = self._makeOne(environ)
2026
self.assertEqual(req.relative_url('other/page', False),
2027
'http://example.com/script/path/other/page')
2029
def test_path_info_pop_empty(self):
2030
environ = {'wsgi.url_scheme': 'http',
2031
'SERVER_NAME': 'example.com',
2032
'SERVER_PORT': '80',
2033
'SCRIPT_NAME': '/script',
2036
req = self._makeOne(environ)
2037
popped = req.path_info_pop()
2038
self.assertEqual(popped, None)
2039
self.assertEqual(environ['SCRIPT_NAME'], '/script')
2041
def test_path_info_pop_just_leading_slash(self):
2042
environ = {'wsgi.url_scheme': 'http',
2043
'SERVER_NAME': 'example.com',
2044
'SERVER_PORT': '80',
2045
'SCRIPT_NAME': '/script',
2048
req = self._makeOne(environ)
2049
popped = req.path_info_pop()
2050
self.assertEqual(popped, '')
2051
self.assertEqual(environ['SCRIPT_NAME'], '/script/')
2052
self.assertEqual(environ['PATH_INFO'], '')
2054
def test_path_info_pop_non_empty_no_pattern(self):
2055
environ = {'wsgi.url_scheme': 'http',
2056
'SERVER_NAME': 'example.com',
2057
'SERVER_PORT': '80',
2058
'SCRIPT_NAME': '/script',
2059
'PATH_INFO': '/path/info',
2061
req = self._makeOne(environ)
2062
popped = req.path_info_pop()
2063
self.assertEqual(popped, 'path')
2064
self.assertEqual(environ['SCRIPT_NAME'], '/script/path')
2065
self.assertEqual(environ['PATH_INFO'], '/info')
2067
def test_path_info_pop_non_empty_w_pattern_miss(self):
2069
PATTERN = re.compile('miss')
2070
environ = {'wsgi.url_scheme': 'http',
2071
'SERVER_NAME': 'example.com',
2072
'SERVER_PORT': '80',
2073
'SCRIPT_NAME': '/script',
2074
'PATH_INFO': '/path/info',
2076
req = self._makeOne(environ)
2077
popped = req.path_info_pop(PATTERN)
2078
self.assertEqual(popped, None)
2079
self.assertEqual(environ['SCRIPT_NAME'], '/script')
2080
self.assertEqual(environ['PATH_INFO'], '/path/info')
2082
def test_path_info_pop_non_empty_w_pattern_hit(self):
2084
PATTERN = re.compile('path')
2085
environ = {'wsgi.url_scheme': 'http',
2086
'SERVER_NAME': 'example.com',
2087
'SERVER_PORT': '80',
2088
'SCRIPT_NAME': '/script',
2089
'PATH_INFO': '/path/info',
2091
req = self._makeOne(environ)
2092
popped = req.path_info_pop(PATTERN)
2093
self.assertEqual(popped, 'path')
2094
self.assertEqual(environ['SCRIPT_NAME'], '/script/path')
2095
self.assertEqual(environ['PATH_INFO'], '/info')
2097
def test_path_info_pop_skips_empty_elements(self):
2098
environ = {'wsgi.url_scheme': 'http',
2099
'SERVER_NAME': 'example.com',
2100
'SERVER_PORT': '80',
2101
'SCRIPT_NAME': '/script',
2102
'PATH_INFO': '//path/info',
2104
req = self._makeOne(environ)
2105
popped = req.path_info_pop()
2106
self.assertEqual(popped, 'path')
2107
self.assertEqual(environ['SCRIPT_NAME'], '/script//path')
2108
self.assertEqual(environ['PATH_INFO'], '/info')
2110
def test_path_info_peek_empty(self):
2111
environ = {'wsgi.url_scheme': 'http',
2112
'SERVER_NAME': 'example.com',
2113
'SERVER_PORT': '80',
2114
'SCRIPT_NAME': '/script',
2117
req = self._makeOne(environ)
2118
peeked = req.path_info_peek()
2119
self.assertEqual(peeked, None)
2120
self.assertEqual(environ['SCRIPT_NAME'], '/script')
2121
self.assertEqual(environ['PATH_INFO'], '')
2123
def test_path_info_peek_just_leading_slash(self):
2124
environ = {'wsgi.url_scheme': 'http',
2125
'SERVER_NAME': 'example.com',
2126
'SERVER_PORT': '80',
2127
'SCRIPT_NAME': '/script',
2130
req = self._makeOne(environ)
2131
peeked = req.path_info_peek()
2132
self.assertEqual(peeked, '')
2133
self.assertEqual(environ['SCRIPT_NAME'], '/script')
2134
self.assertEqual(environ['PATH_INFO'], '/')
2136
def test_path_info_peek_non_empty(self):
2137
environ = {'wsgi.url_scheme': 'http',
2138
'SERVER_NAME': 'example.com',
2139
'SERVER_PORT': '80',
2140
'SCRIPT_NAME': '/script',
2141
'PATH_INFO': '/path',
2143
req = self._makeOne(environ)
2144
peeked = req.path_info_peek()
2145
self.assertEqual(peeked, 'path')
2146
self.assertEqual(environ['SCRIPT_NAME'], '/script')
2147
self.assertEqual(environ['PATH_INFO'], '/path')
2149
def test_is_xhr_no_header(self):
2150
req = self._makeOne({})
2151
self.assertTrue(not req.is_xhr)
2153
def test_is_xhr_header_miss(self):
2154
environ = {'HTTP_X_REQUESTED_WITH': 'notAnXMLHTTPRequest'}
2155
req = self._makeOne(environ)
2156
self.assertTrue(not req.is_xhr)
2158
def test_is_xhr_header_hit(self):
2159
environ = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
2160
req = self._makeOne(environ)
2161
self.assertTrue(req.is_xhr)
2164
def test_host_getter_w_HTTP_HOST(self):
2165
environ = {'HTTP_HOST': 'example.com:8888'}
2166
req = self._makeOne(environ)
2167
self.assertEqual(req.host, 'example.com:8888')
2169
def test_host_getter_wo_HTTP_HOST(self):
2170
environ = {'SERVER_NAME': 'example.com',
2171
'SERVER_PORT': '8888'}
2172
req = self._makeOne(environ)
2173
self.assertEqual(req.host, 'example.com:8888')
2175
def test_host_setter(self):
2177
req = self._makeOne(environ)
2178
req.host = 'example.com:8888'
2179
self.assertEqual(environ['HTTP_HOST'], 'example.com:8888')
2181
def test_host_deleter_hit(self):
2182
environ = {'HTTP_HOST': 'example.com:8888'}
2183
req = self._makeOne(environ)
2185
self.assertTrue('HTTP_HOST' not in environ)
2187
def test_host_deleter_miss(self):
2189
req = self._makeOne(environ)
2190
del req.host # doesn't raise
2192
def test_encget_raises_without_default(self):
2193
inst = self._makeOne({})
2194
self.assertRaises(KeyError, inst.encget, 'a')
2196
def test_encget_doesnt_raises_with_default(self):
2197
inst = self._makeOne({})
2198
self.assertEqual(inst.encget('a', None), None)
2200
def test_encget_with_encattr(self):
2202
val = b'\xc3\xab'.decode('latin-1')
2205
inst = self._makeOne({'a':val})
2206
self.assertEqual(inst.encget('a', encattr='url_encoding'),
2207
native_(b'\xc3\xab', 'latin-1'))
2209
def test_encget_no_encattr(self):
2211
val = b'\xc3\xab'.decode('latin-1')
2214
inst = self._makeOne({'a':val})
2215
self.assertEqual(inst.encget('a'), native_(b'\xc3\xab', 'latin-1'))
2217
def test_relative_url(self):
2218
inst = self._blankOne('/%C3%AB/c')
2219
result = inst.relative_url('a')
2220
if PY3: # pragma: no cover
2221
# this result is why you should not use legacyrequest under py 3
2222
self.assertEqual(result, 'http://localhost/%C3%83%C2%AB/a')
2224
self.assertEqual(result, 'http://localhost/%C3%AB/a')
2226
def test_header_getter(self):
2228
val = b'abc'.decode('latin-1')
2231
inst = self._makeOne({'HTTP_FLUB':val})
2232
result = inst.headers['Flub']
2233
self.assertEqual(result, 'abc')
2235
def test_json_body(self):
2236
inst = self._makeOne({})
2237
inst.body = b'{"a":"1"}'
2238
self.assertEqual(inst.json_body, {'a':'1'})
2240
def test_host_get_w_http_host(self):
2241
inst = self._makeOne({'HTTP_HOST':'example.com'})
2243
self.assertEqual(result, 'example.com')
2245
def test_host_get_w_no_http_host(self):
2246
inst = self._makeOne({'SERVER_NAME':'example.com', 'SERVER_PORT':'80'})
2248
self.assertEqual(result, 'example.com:80')
2250
class TestRequestConstructorWarnings(unittest.TestCase):
2251
def _getTargetClass(self):
2252
from webob.request import Request
2255
def _makeOne(self, *arg, **kw):
2256
cls = self._getTargetClass()
2257
return cls(*arg, **kw)
2259
def test_ctor_w_unicode_errors(self):
2260
with warnings.catch_warnings(record=True) as w:
2261
# still emit if warning was printed previously
2262
warnings.simplefilter('always')
2263
self._makeOne({}, unicode_errors=True)
2264
self.assertEqual(len(w), 1)
2266
def test_ctor_w_decode_param_names(self):
2267
with warnings.catch_warnings(record=True) as w:
2268
# still emit if warning was printed previously
2269
warnings.simplefilter('always')
2270
self._makeOne({}, decode_param_names=True)
2271
self.assertEqual(len(w), 1)
2273
class TestRequestWithAdhocAttr(unittest.TestCase):
2274
def _blankOne(self, *arg, **kw):
2275
from webob.request import Request
2276
return Request.blank(*arg, **kw)
1408
2278
def test_adhoc_attrs_set(self):
1409
req = Request.blank('/')
2279
req = self._blankOne('/')
1411
2281
self.assertEqual(req.environ['webob.adhoc_attrs'], {'foo': 1})
1413
2283
def test_adhoc_attrs_set_nonadhoc(self):
1414
req = Request.blank('/', environ={'webob.adhoc_attrs':{}})
2284
req = self._blankOne('/', environ={'webob.adhoc_attrs':{}})
1415
2285
req.request_body_tempfile_limit = 1
1416
2286
self.assertEqual(req.environ['webob.adhoc_attrs'], {})
1418
2288
def test_adhoc_attrs_get(self):
1419
req = Request.blank('/', environ={'webob.adhoc_attrs': {'foo': 1}})
2289
req = self._blankOne('/', environ={'webob.adhoc_attrs': {'foo': 1}})
1420
2290
self.assertEqual(req.foo, 1)
1422
2292
def test_adhoc_attrs_get_missing(self):
1423
req = Request.blank('/')
2293
req = self._blankOne('/')
1424
2294
self.assertRaises(AttributeError, getattr, req, 'some_attr')
1426
2296
def test_adhoc_attrs_del(self):
1427
req = Request.blank('/', environ={'webob.adhoc_attrs': {'foo': 1}})
2297
req = self._blankOne('/', environ={'webob.adhoc_attrs': {'foo': 1}})
1429
2299
self.assertEqual(req.environ['webob.adhoc_attrs'], {})
1431
2301
def test_adhoc_attrs_del_missing(self):
1432
req = Request.blank('/')
2302
req = self._blankOne('/')
1433
2303
self.assertRaises(AttributeError, delattr, req, 'some_attr')
1435
class RequestTests_functional(unittest.TestCase):
2305
class TestRequest_functional(unittest.TestCase):
2306
# functional tests of request
2307
def _getTargetClass(self):
2308
from webob.request import Request
2311
def _makeOne(self, *arg, **kw):
2312
cls = self._getTargetClass()
2313
return cls(*arg, **kw)
2315
def _blankOne(self, *arg, **kw):
2316
cls = self._getTargetClass()
2317
return cls.blank(*arg, **kw)
1436
2319
def test_gets(self):
1437
from webtest import TestApp
1438
app = TestApp(simpleapp)
1440
self.assert_('Hello' in res)
1441
self.assert_("get is GET([])" in res)
1442
self.assert_("post is <NoVars: Not a form request>" in res)
1444
res = app.get('/?name=george')
1445
res.mustcontain("get is GET([('name', 'george')])")
1446
res.mustcontain("Val is george")
1448
def test_language_parsing(self):
1449
from webtest import TestApp
1450
app = TestApp(simpleapp)
1452
self.assert_("The languages are: ['en-US']" in res)
1455
headers={'Accept-Language': 'da, en-gb;q=0.8, en;q=0.7'})
1456
self.assert_("languages are: ['da', 'en-gb', 'en-US']" in res)
1459
headers={'Accept-Language': 'en-gb;q=0.8, da, en;q=0.7'})
1460
self.assert_("languages are: ['da', 'en-gb', 'en-US']" in res)
1462
def test_mime_parsing(self):
1463
from webtest import TestApp
1464
app = TestApp(simpleapp)
1465
res = app.get('/', headers={'Accept':'text/html'})
1466
self.assert_("accepttypes is: text/html" in res)
1468
res = app.get('/', headers={'Accept':'application/xml'})
1469
self.assert_("accepttypes is: application/xml" in res)
1471
res = app.get('/', headers={'Accept':'application/xml,*/*'})
1472
self.assert_("accepttypes is: application/xml" in res)
2320
request = self._blankOne('/')
2321
status, headerlist, app_iter = request.call_application(simpleapp)
2322
self.assertEqual(status, '200 OK')
2323
res = b''.join(app_iter)
2324
self.assertTrue(b'Hello' in res)
2325
self.assertTrue(b"MultiDict([])" in res)
2326
self.assertTrue(b"post is <NoVars: Not a form request>" in res)
2328
def test_gets_with_query_string(self):
2329
request = self._blankOne('/?name=george')
2330
status, headerlist, app_iter = request.call_application(simpleapp)
2331
res = b''.join(app_iter)
2332
self.assertTrue(b"MultiDict" in res)
2333
self.assertTrue(b"'name'" in res)
2334
self.assertTrue(b"'george'" in res)
2335
self.assertTrue(b"Val is " in res)
2337
def test_language_parsing1(self):
2338
request = self._blankOne('/')
2339
status, headerlist, app_iter = request.call_application(simpleapp)
2340
res = b''.join(app_iter)
2341
self.assertTrue(b"The languages are: []" in res)
2343
def test_language_parsing2(self):
2344
request = self._blankOne(
2345
'/', headers={'Accept-Language': 'da, en-gb;q=0.8'})
2346
status, headerlist, app_iter = request.call_application(simpleapp)
2347
res = b''.join(app_iter)
2348
self.assertTrue(b"languages are: ['da', 'en-gb']" in res)
2350
def test_language_parsing3(self):
2351
request = self._blankOne(
2353
headers={'Accept-Language': 'en-gb;q=0.8, da'})
2354
status, headerlist, app_iter = request.call_application(simpleapp)
2355
res = b''.join(app_iter)
2356
self.assertTrue(b"languages are: ['da', 'en-gb']" in res)
2358
def test_mime_parsing1(self):
2359
request = self._blankOne(
2361
headers={'Accept':'text/html'})
2362
status, headerlist, app_iter = request.call_application(simpleapp)
2363
res = b''.join(app_iter)
2364
self.assertTrue(b"accepttypes is: text/html" in res)
2366
def test_mime_parsing2(self):
2367
request = self._blankOne(
2369
headers={'Accept':'application/xml'})
2370
status, headerlist, app_iter = request.call_application(simpleapp)
2371
res = b''.join(app_iter)
2372
self.assertTrue(b"accepttypes is: application/xml" in res)
2374
def test_mime_parsing3(self):
2375
request = self._blankOne(
2377
headers={'Accept':'application/xml,*/*'})
2378
status, headerlist, app_iter = request.call_application(simpleapp)
2379
res = b''.join(app_iter)
2380
self.assertTrue(b"accepttypes is: application/xml" in res)
1474
2382
def test_accept_best_match(self):
1475
self.assert_(not Request.blank('/').accept)
1476
self.assert_(not Request.blank('/', headers={'Accept': ''}).accept)
1477
req = Request.blank('/', headers={'Accept':'text/plain'})
1478
self.assert_(req.accept)
2383
accept = self._blankOne('/').accept
2384
self.assertTrue(not accept)
2385
self.assertTrue(not self._blankOne('/', headers={'Accept': ''}).accept)
2386
req = self._blankOne('/', headers={'Accept':'text/plain'})
2387
self.assertTrue(req.accept)
1479
2388
self.assertRaises(ValueError, req.accept.best_match, ['*/*'])
1480
req = Request.blank('/', accept=['*/*','text/*'])
2389
req = self._blankOne('/', accept=['*/*','text/*'])
1481
2390
self.assertEqual(
1482
2391
req.accept.best_match(['application/x-foo', 'text/plain']),
1484
2393
self.assertEqual(
1485
2394
req.accept.best_match(['text/plain', 'application/x-foo']),
1487
req = Request.blank('/', accept=['text/plain', 'message/*'])
2396
req = self._blankOne('/', accept=['text/plain', 'message/*'])
1488
2397
self.assertEqual(
1489
2398
req.accept.best_match(['message/x-foo', 'text/plain']),