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
|
# -*- coding: utf-8 -*-
# vi:ts=4:et
import time as _time, sys
import bottle
try:
import json
except ImportError:
import simplejson as json
py3 = sys.version_info[0] == 3
app = bottle.Bottle()
app.debug = True
@app.route('/success')
def ok():
return 'success'
@app.route('/short_wait')
def short_wait():
_time.sleep(0.1)
return 'success'
@app.route('/status/403')
def forbidden():
return bottle.HTTPResponse('forbidden', 403)
@app.route('/status/404')
def not_found():
return bottle.HTTPResponse('not found', 404)
@app.route('/postfields', method='get')
@app.route('/postfields', method='post')
def postfields():
return json.dumps(dict(bottle.request.forms))
@app.route('/raw_utf8', method='post')
def raw_utf8():
data = bottle.request.body.getvalue().decode('utf8')
return json.dumps(data)
# XXX file is not a bottle FileUpload instance, but FieldStorage?
def xconvert_file(key, file):
return {
'key': key,
'name': file.name,
'raw_filename': file.raw_filename,
'headers': file.headers,
'content_type': file.content_type,
'content_length': file.content_length,
'data': file.read(),
}
if hasattr(bottle, 'FileUpload'):
# bottle 0.12
def convert_file(key, file):
return {
'name': file.name,
# file.filename lowercases the file name
# https://github.com/defnull/bottle/issues/582
# raw_filenames is a string on python 3
'filename': file.raw_filename,
'data': file.file.read().decode(),
}
else:
# bottle 0.11
def convert_file(key, file):
return {
'name': file.name,
'filename': file.filename,
'data': file.file.read().decode(),
}
@app.route('/files', method='post')
def files():
files = [convert_file(key, bottle.request.files[key]) for key in bottle.request.files]
return json.dumps(files)
@app.route('/header')
def header():
return bottle.request.headers.get(bottle.request.query['h'], '')
# This is a hacky endpoint to test non-ascii text being given to libcurl
# via headers.
# HTTP RFC requires headers to be latin1-encoded.
# Any string can be decoded as latin1; here we encode the header value
# back into latin1 to obtain original bytestring, then decode it in utf-8.
# Thanks to bdarnell for the idea: https://github.com/pycurl/pycurl/issues/124
@app.route('/header_utf8')
def header_utf8():
header_value = bottle.request.headers.get(bottle.request.query['h'], '' if py3 else b'')
if py3:
# header_value is a string, headers are decoded in latin1
header_value = header_value.encode('latin1').decode('utf8')
else:
# header_value is a binary string, decode in utf-8 directly
header_value = header_value.decode('utf8')
return header_value
@app.route('/param_utf8_hack', method='post')
def param_utf8_hack():
param = bottle.request.forms['p']
if py3:
# python 3 decodes bytes as latin1 perhaps?
# apply the latin1-utf8 hack
param = param.encode('latin').decode('utf8')
return param
def pause_writer(interval):
yield 'part1'
_time.sleep(interval)
yield 'part2'
@app.route('/pause')
def pause():
return pause_writer(0.5)
@app.route('/long_pause')
def long_pause():
return pause_writer(1)
@app.route('/utf8_body')
def utf8_body():
# bottle encodes the body
return 'Дружба народов'
@app.route('/invalid_utf8_body')
def invalid_utf8_body():
# bottle encodes the body
raise bottle.HTTPResponse(b'\xb3\xd2\xda\xcd\xd7', 200)
@app.route('/set_cookie_invalid_utf8')
def set_cookie_invalid_utf8():
bottle.response.set_header('Set-Cookie', '\xb3\xd2\xda\xcd\xd7=%96%A6g%9Ay%B0%A5g%A7tm%7C%95%9A')
return 'cookie set'
@app.route('/content_type_invalid_utf8')
def content_type_invalid_utf8():
bottle.response.set_header('Content-Type', '\xb3\xd2\xda\xcd\xd7')
return 'content type set'
@app.route('/status_invalid_utf8')
def status_invalid_utf8():
raise bottle.HTTPResponse('status set', '555 \xb3\xd2\xda\xcd\xd7')
|