Recognizes non-ASCII filenames in RFC 2231, and suport filename length is zero for multipart/form-data. (#1497)
* suport filename length is 0 * 1. suport filename length is zero for multipart/form-data. 2. Now recognizes non-ASCII filenames in RFC 2231, "filename*" format 3. Add some test cases in tests/test_requests.py::test_request_multipart_files. * reformat sanic/request.py
This commit is contained in:
@@ -432,21 +432,41 @@ def test_request_string_representation(app):
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"payload",
|
||||
"payload,filename",
|
||||
[
|
||||
"------sanic\r\n"
|
||||
'Content-Disposition: form-data; filename="filename"; name="test"\r\n'
|
||||
"\r\n"
|
||||
"OK\r\n"
|
||||
"------sanic--\r\n",
|
||||
"------sanic\r\n"
|
||||
'content-disposition: form-data; filename="filename"; name="test"\r\n'
|
||||
"\r\n"
|
||||
'content-type: application/json; {"field": "value"}\r\n'
|
||||
"------sanic--\r\n",
|
||||
("------sanic\r\n"
|
||||
'Content-Disposition: form-data; filename="filename"; name="test"\r\n'
|
||||
"\r\n"
|
||||
"OK\r\n"
|
||||
"------sanic--\r\n", "filename"),
|
||||
("------sanic\r\n"
|
||||
'content-disposition: form-data; filename="filename"; name="test"\r\n'
|
||||
"\r\n"
|
||||
'content-type: application/json; {"field": "value"}\r\n'
|
||||
"------sanic--\r\n", "filename"),
|
||||
("------sanic\r\n"
|
||||
'Content-Disposition: form-data; filename=""; name="test"\r\n'
|
||||
"\r\n"
|
||||
"OK\r\n"
|
||||
"------sanic--\r\n", ""),
|
||||
("------sanic\r\n"
|
||||
'content-disposition: form-data; filename=""; name="test"\r\n'
|
||||
"\r\n"
|
||||
'content-type: application/json; {"field": "value"}\r\n'
|
||||
"------sanic--\r\n", ""),
|
||||
("------sanic\r\n"
|
||||
'Content-Disposition: form-data; filename*="utf-8\'\'filename_%C2%A0_test"; name="test"\r\n'
|
||||
"\r\n"
|
||||
"OK\r\n"
|
||||
"------sanic--\r\n", "filename_\u00A0_test"),
|
||||
("------sanic\r\n"
|
||||
'content-disposition: form-data; filename*="utf-8\'\'filename_%C2%A0_test"; name="test"\r\n'
|
||||
"\r\n"
|
||||
'content-type: application/json; {"field": "value"}\r\n'
|
||||
"------sanic--\r\n", "filename_\u00A0_test"),
|
||||
],
|
||||
)
|
||||
def test_request_multipart_files(app, payload):
|
||||
def test_request_multipart_files(app, payload, filename):
|
||||
@app.route("/", methods=["POST"])
|
||||
async def post(request):
|
||||
return text("OK")
|
||||
@@ -454,7 +474,7 @@ def test_request_multipart_files(app, payload):
|
||||
headers = {"content-type": "multipart/form-data; boundary=----sanic"}
|
||||
|
||||
request, _ = app.test_client.post(data=payload, headers=headers)
|
||||
assert request.files.get("test").name == "filename"
|
||||
assert request.files.get("test").name == filename
|
||||
|
||||
|
||||
def test_request_multipart_file_with_json_content_type(app):
|
||||
|
||||
Reference in New Issue
Block a user