Solves an issue with clients encoding filenames in multipart headers in ISO-8859-1, causing an HTTP 500 response code. This change makes ISO-8859-1 encoded headers work, sends a 400 Bad Request instead of 500 Internal Server Error if the request multipart headers cannot be decoded as either UTF-8 or ISO-8859-1, defines UTF-8 content type for multipart text fields in rebuilt body and also adds support for RFC 5987 for the multipart file upload "filename" header component.
90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
# coding=utf-8
|
|
"""
|
|
Unit tests for ``octoprint.server.util.tornado``.
|
|
"""
|
|
|
|
from __future__ import absolute_import
|
|
|
|
__author__ = "Gina Häußge <osd@foosel.net>"
|
|
__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
|
|
__copyright__ = "Copyright (C) 2016 The OctoPrint Project - Released under terms of the AGPLv3 License"
|
|
|
|
|
|
import unittest
|
|
import mock
|
|
from ddt import ddt, data, unpack
|
|
|
|
|
|
##~~ _parse_header
|
|
|
|
@ddt
|
|
class ParseHeaderTest(unittest.TestCase):
|
|
|
|
@data(
|
|
("form-data; filename=test.gco", "form-data", dict(filename="test.gco")),
|
|
("form-data; filename=\"test.gco\"", "form-data", dict(filename="test.gco")),
|
|
("form-data; filename=test\\\\.gco", "form-data", dict(filename="test\\\\.gco")),
|
|
("form-data; filename=\"test\\\\.gco\"", "form-data", dict(filename="test\\.gco"))
|
|
)
|
|
@unpack
|
|
def test_parse_header_strip_quotes(self, value, expected_key, expected_dict):
|
|
from octoprint.server.util.tornado import _parse_header
|
|
actual_key, actual_dict = _parse_header(value)
|
|
|
|
self.assertEqual(expected_key, actual_key)
|
|
self.assertDictEqual(expected_dict, actual_dict)
|
|
|
|
@data(
|
|
("form-data; filename=test.gco", "form-data", dict(filename="test.gco")),
|
|
("form-data; filename=\"test.gco\"", "form-data", dict(filename="\"test.gco\"")),
|
|
("form-data; filename=test\\\\.gco", "form-data", dict(filename="test\\\\.gco")),
|
|
("form-data; filename=\"test\\\\.gco\"", "form-data", dict(filename="\"test\\\\.gco\"")),
|
|
("form-data; filename=iso-8859-1'en'test.gco", "form-data", dict(filename="iso-8859-1'en'test.gco"))
|
|
)
|
|
@unpack
|
|
def test_parse_header_leave_quotes(self, value, expected_key, expected_dict):
|
|
from octoprint.server.util.tornado import _parse_header
|
|
actual_key, actual_dict = _parse_header(value, strip_quotes=False)
|
|
|
|
self.assertEqual(expected_key, actual_key)
|
|
self.assertDictEqual(expected_dict, actual_dict)
|
|
|
|
|
|
##~~ _strip_value_quotes
|
|
|
|
@ddt
|
|
class StripValueQuotesTest(unittest.TestCase):
|
|
|
|
@data(
|
|
("", ""),
|
|
(None, None),
|
|
('"test.gco"', "test.gco"),
|
|
('"test".gco', '"test".gco'),
|
|
("test\\\\.gco", "test\\\\.gco"),
|
|
('"test\\\\.gco"', "test\\.gco")
|
|
)
|
|
@unpack
|
|
def test_strip_value_quotes(self, value, expected):
|
|
from octoprint.server.util.tornado import _strip_value_quotes
|
|
actual = _strip_value_quotes(value)
|
|
|
|
self.assertEqual(expected, actual)
|
|
|
|
##~~ _extended_header_value
|
|
|
|
@ddt
|
|
class ExtendedHeaderValueTest(unittest.TestCase):
|
|
|
|
@data(
|
|
("", u""),
|
|
(None, None),
|
|
('"quoted-string"', u"quoted-string"),
|
|
("iso-8859-1'en'%A3%20rates", u"£ rates"),
|
|
("UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", u"£ and € rates")
|
|
)
|
|
@unpack
|
|
def test_extended_header_value(self, value, expected):
|
|
from octoprint.server.util.tornado import _extended_header_value
|
|
actual = _extended_header_value(value)
|
|
|
|
self.assertEqual(expected, actual)
|