1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
# -*- coding: utf-8 -*-
# (c) 2007 Philip Jenvey; written for Paste (http://pythonpaste.org)
# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
import cgi
from paste.fixture import TestApp
from paste.wsgiwrappers import WSGIRequest, WSGIResponse
import six
class AssertApp(object):
def __init__(self, assertfunc):
self.assertfunc = assertfunc
def __call__(self, environ, start_response):
start_response('200 OK', [('Content-type','text/plain')])
self.assertfunc(environ)
return [b'Passed']
no_encoding = object()
def valid_name(name, encoding=no_encoding, post=False):
def assert_valid_name(environ):
if encoding is not no_encoding:
WSGIRequest.defaults._push_object(dict(content_type='text/html',
charset=encoding))
try:
request = WSGIRequest(environ)
if post:
params = request.POST
else:
params = request.GET
assert params['name'] == name
assert request.params['name'] == name
finally:
if encoding is not no_encoding:
WSGIRequest.defaults._pop_object()
return assert_valid_name
def test_wsgirequest_charset():
# Jose, 'José'
app = TestApp(AssertApp(assertfunc=valid_name(u'José', encoding='UTF-8')))
res = app.get('/?name=Jos%C3%A9')
# Tanaka, '田中'
app = TestApp(AssertApp(assertfunc=valid_name(u'田中', encoding='UTF-8')))
res = app.get('/?name=%E7%94%B0%E4%B8%AD')
# Nippon (Japan), '日本'
app = TestApp(AssertApp(assertfunc=valid_name(u'日本', encoding='UTF-8',
post=True)))
res = app.post('/', params=dict(name='日本'))
# WSGIRequest will determine the charset from the Content-Type header when
# unicode is expected.
# No encoding specified: not expecting unicode
app = TestApp(AssertApp(assertfunc=valid_name('日本', post=True)))
content_type = 'application/x-www-form-urlencoded; charset=%s'
res = app.post('/', params=dict(name='日本'),
headers={'content-type': content_type % 'UTF-8'})
# Encoding specified: expect unicode. Shiftjis is the default encoding, but
# params become UTF-8 because the browser specified so
app = TestApp(AssertApp(assertfunc=valid_name(u'日本', post=True,
encoding='shiftjis')))
res = app.post('/', params=dict(name='日本'),
headers={'content-type': content_type % 'UTF-8'})
# Browser did not specify: parse params as the fallback shiftjis
app = TestApp(AssertApp(assertfunc=valid_name(u'日本', post=True,
encoding='shiftjis')))
res = app.post('/', params=dict(name=u'日本'.encode('shiftjis')))
def test_wsgirequest_charset_fileupload():
def handle_fileupload(environ, start_response):
start_response('200 OK', [('Content-type','text/plain')])
request = WSGIRequest(environ)
assert len(request.POST) == 1
assert isinstance(request.POST.keys()[0], str)
fs = request.POST['thefile']
assert isinstance(fs, cgi.FieldStorage)
assert isinstance(fs.filename, str)
assert fs.filename == '寿司.txt'
assert fs.value == b'Sushi'
request.charset = 'UTF-8'
assert len(request.POST) == 1
assert isinstance(request.POST.keys()[0], str)
fs = request.POST['thefile']
assert isinstance(fs, cgi.FieldStorage)
assert isinstance(fs.filename, six.text_type)
assert fs.filename == u'寿司.txt'
assert fs.value == b'Sushi'
request.charset = None
assert fs.value == b'Sushi'
return []
app = TestApp(handle_fileupload)
res = app.post('/', upload_files=[('thefile', '寿司.txt', b'Sushi')])
def test_wsgiresponse_charset():
response = WSGIResponse(mimetype='text/html; charset=UTF-8')
assert response.content_type == 'text/html'
assert response.charset == 'UTF-8'
response.write(u'test')
response.write(u'test2')
response.write('test3')
status, headers, content = response.wsgi_response()
for data in content:
assert isinstance(data, six.binary_type)
WSGIResponse.defaults._push_object(dict(content_type='text/html',
charset='iso-8859-1'))
try:
response = WSGIResponse()
response.write(u'test')
response.write(u'test2')
response.write('test3')
status, headers, content = response.wsgi_response()
for data in content:
assert isinstance(data, six.binary_type)
finally:
WSGIResponse.defaults._pop_object()
# WSGIResponse will allow unicode to pass through when no charset is
# set
WSGIResponse.defaults._push_object(dict(content_type='text/html',
charset=None))
try:
response = WSGIResponse(u'test')
response.write(u'test1')
status, headers, content = response.wsgi_response()
for data in content:
assert isinstance(data, six.text_type)
finally:
WSGIResponse.defaults._pop_object()
WSGIResponse.defaults._push_object(dict(content_type='text/html',
charset=''))
try:
response = WSGIResponse(u'test')
response.write(u'test1')
status, headers, content = response.wsgi_response()
for data in content:
assert isinstance(data, six.text_type)
finally:
WSGIResponse.defaults._pop_object()
|