python-pycurl/test-bottle-flask.patch

231 lines
7.6 KiB
Diff
Raw Permalink Normal View History

Index: pycurl-7.45.3/README.rst
===================================================================
--- pycurl-7.45.3.orig/README.rst
+++ pycurl-7.45.3/README.rst
@@ -89,7 +89,7 @@ PycURL comes with an automated test suit
make test
-The suite depends on packages `pytest`_ and `bottle`_, as well as `vsftpd`_.
+The suite depends on packages `pytest`_ and `flask`_, as well as `vsftpd`_.
Some tests use vsftpd configured to accept anonymous uploads. These tests
are not run by default. As configured, vsftpd will allow reads and writes to
@@ -103,7 +103,7 @@ vsftpd tests you must explicitly set PYC
export PYCURL_VSFTPD_PATH=/usr/local/libexec/vsftpd
.. _pytest: https://pytest.org/
-.. _bottle: http://bottlepy.org/
+.. _flask: https://flask.palletsprojects.com/
.. _vsftpd: http://vsftpd.beasts.org/
Index: pycurl-7.45.3/requirements-dev.txt
===================================================================
--- pycurl-7.45.3.orig/requirements-dev.txt
+++ pycurl-7.45.3/requirements-dev.txt
@@ -1,7 +1,5 @@
-# bottle 0.12.17 changed behavior
-# https://github.com/pycurl/pycurl/issues/573
-bottle
flaky
+flask
pyflakes
pytest>=5
sphinx
Index: pycurl-7.45.3/tests/app.py
===================================================================
--- pycurl-7.45.3.orig/tests/app.py
+++ pycurl-7.45.3/tests/app.py
@@ -2,7 +2,7 @@
# vi:ts=4:et
import time as _time, sys
-import bottle
+import flask
try:
import json
except ImportError:
@@ -10,7 +10,7 @@ except ImportError:
py3 = sys.version_info[0] == 3
-app = bottle.Bottle()
+app = flask.Flask(__name__)
app.debug = True
@app.route('/success')
@@ -24,62 +24,47 @@ def short_wait():
@app.route('/status/403')
def forbidden():
- return bottle.HTTPResponse('forbidden', 403)
+ return flask.Response('forbidden', 403)
@app.route('/status/404')
def not_found():
- return bottle.HTTPResponse('not found', 404)
+ return flask.Response('not found', 404)
-@app.route('/postfields', method='get')
-@app.route('/postfields', method='post')
+@app.route('/postfields', methods=['GET', 'POST'])
def postfields():
- return json.dumps(dict(bottle.request.forms))
+ return json.dumps(dict(flask.request.form))
-@app.route('/raw_utf8', method='post')
+@app.route('/raw_utf8', methods=['POST'])
def raw_utf8():
- data = bottle.request.body.getvalue().decode('utf8')
+ data = flask.request.data.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,
+ 'filename': file.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(),
- }
+def convert_file(key, file):
+ return {
+ 'name': file.name,
+ 'filename': file.filename,
+ 'data': file.read().decode(),
+ }
-@app.route('/files', method='post')
+@app.route('/files', methods=['POST'])
def files():
- files = [convert_file(key, bottle.request.files[key]) for key in bottle.request.files]
+ files = [convert_file(key, flask.request.files[key]) for key in flask.request.files]
return json.dumps(files)
@app.route('/header')
def header():
- return bottle.request.headers.get(bottle.request.query['h'], '')
+ return flask.request.headers.get(flask.request.args['h'], '')
# This is a hacky endpoint to test non-ascii text being given to libcurl
# via headers.
@@ -89,7 +74,7 @@ def header():
# 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'')
+ header_value = flask.request.headers.get(flask.request.args['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')
@@ -98,13 +83,9 @@ def header_utf8():
header_value = header_value.decode('utf8')
return header_value
-@app.route('/param_utf8_hack', method='post')
+@app.route('/param_utf8_hack', methods=['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')
+ param = flask.request.form['p']
return param
def pause_writer(interval):
@@ -127,19 +108,25 @@ def utf8_body():
@app.route('/invalid_utf8_body')
def invalid_utf8_body():
- # bottle encodes the body
- raise bottle.HTTPResponse(b'\xb3\xd2\xda\xcd\xd7', 200)
+ return flask.Response(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'
+ response = flask.Response('cookie set')
+ # WARNING: The original bottle test passed '\xb3\xd2\xda\xcd\xd7...' as string
+ # Presumably bottle encoded that as utf-8 in the response.
+ # Flask on the other hand encodes such strings as latin-1 (chars in == bytes out).
+ # In order to make the test pass I replicate the original bottle behavior by utf-8->latin1 roundtrip.
+ response.headers['Set-Cookie'] = '\xb3\xd2\xda\xcd\xd7=%96%A6g%9Ay%B0%A5g%A7tm%7C%95%9A'.encode('utf-8').decode('latin-1')
+ return response
@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'
+ response = flask.Response('content type set')
+ # See the WARNING in set_cookie_invalid_utf8
+ response.headers['Content-Type'] = '\xb3\xd2\xda\xcd\xd7'.encode('utf-8').decode('latin-1')
+ return response
@app.route('/status_invalid_utf8')
def status_invalid_utf8():
- raise bottle.HTTPResponse('status set', '555 \xb3\xd2\xda\xcd\xd7')
+ raise flask.Response('status set', b'555 \xb3\xd2\xda\xcd\xd7')
Index: pycurl-7.45.3/tests/runwsgi.py
===================================================================
--- pycurl-7.45.3.orig/tests/runwsgi.py
+++ pycurl-7.45.3/tests/runwsgi.py
@@ -1,6 +1,5 @@
# Run a WSGI application in a daemon thread
-import bottle
import threading
import os.path
@@ -8,7 +7,14 @@ from . import util
global_stop = False
-class Server(bottle.WSGIRefServer):
+class Server:
+ quiet = False
+
+ def __init__(self, host, port, **options):
+ self.options = options
+ self.host = host
+ self.port = int(port)
+
def run(self, handler): # pragma: no cover
self.srv = self.make_server(handler)
self.serve()
@@ -66,7 +72,7 @@ class ServerThread(threading.Thread):
self.server = server(host='127.0.0.1', port=self.port, **self.server_kwargs)
def run(self):
- bottle.run(self.app, server=self.server, quiet=True)
+ self.server.run(self.app)
started_servers = {}