Пример #1
0
    def test_file_upload_multiline(self, StreamingFormDataParserDelegateMock):
        delegate = StreamingFormDataParserDelegateMock()
        headers = HTTPHeaders()
        headers.add("Content-Type", "multipart/form-data; boundary=1234")
        parser = StreamingFormDataParser(delegate, headers)
        data = b"""\
--1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo
Bar
--1234--
        """.replace(b"\n", b"\r\n")

        parser.data_received(data)

        self.assertTrue(delegate.start_file.called)
        self.assertTrue(delegate.finish_file.called)
        self.assertTrue(delegate.file_data_received.called)
        expected_headers = HTTPHeaders()
        expected_headers.add("Content-Disposition",
                             'form-data; name="files"; filename="ab.txt"')
        delegate.start_file.assert_called_with(expected_headers, {
            "name": "files",
            "filename": "ab.txt"
        })
        delegate.file_data_received.assert_called_with(b"Foo\r\nBar")
Пример #2
0
    def test_file_upload_special_filenames(
            self, StreamingFormDataParserDelegateMock):
        filenames = [
            'a;b.txt',
            'a"b.txt',
            'a";b.txt',
            'a;"b.txt',
            'a";";.txt',
            'a\\"b.txt',
            'a\\b.txt',
        ]
        headers = HTTPHeaders()
        headers.add("Content-Type", "multipart/form-data; boundary=1234")

        for filename in filenames:
            delegate = StreamingFormDataParserDelegateMock()
            parser = StreamingFormDataParser(delegate, headers)
            data = """\
--1234
Content-Disposition: form-data; name="files"; filename="%s"

Foo
--1234--
""" % filename.replace('\\', '\\\\').replace('"', '\\"')
            data = data.replace("\n", "\r\n").encode()

            parser.data_received(data)

            self.assertTrue(delegate.start_file.called)
            self.assertTrue(delegate.finish_file.called)
            self.assertTrue(delegate.file_data_received.called)
            expected_headers = HTTPHeaders()
            expected_headers.add(
                "Content-Disposition",
                'form-data; name="files"; filename="%s"' %
                filename.replace('\\', '\\\\').replace('"', '\\"'))
            delegate.start_file.assert_has_calls([
                mock.call(expected_headers, {
                    "name": "files",
                    "filename": filename
                })
            ])
            delegate.file_data_received.assert_called_with(b"Foo")
            delegate.reset_mock()
            StreamingFormDataParserDelegateMock.reset_mock()
Пример #3
0
    def test_file_upload_full_multiple_files(
            self, StreamingFormDataParserDelegateMock):
        delegate = StreamingFormDataParserDelegateMock()
        headers = HTTPHeaders()
        headers.add("Content-Type", "multipart/form-data; boundary=1234")
        parser = StreamingFormDataParser(delegate, headers)
        data = b"""\
--1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo
--1234
Content-Disposition: form-data; name="files2"; filename="abc.txt"

Foo2
--1234--
        """.replace(b"\n", b"\r\n")

        parser.data_received(data)

        self.assertTrue(delegate.start_file.called)
        self.assertTrue(delegate.finish_file.called)
        self.assertTrue(delegate.file_data_received.called)
        expected_headers_first_file = HTTPHeaders()
        expected_headers_first_file.add(
            "Content-Disposition",
            'form-data; name="files"; filename="ab.txt"')
        expected_headers_second_file = HTTPHeaders()
        expected_headers_second_file.add(
            "Content-Disposition",
            'form-data; name="files2"; filename="abc.txt"')
        delegate.file_data_received.assert_has_calls(
            [mock.call(b"Foo"), mock.call(b"Foo2")])
        delegate.start_file.assert_has_calls([
            mock.call(expected_headers_first_file, {
                "name": "files",
                "filename": "ab.txt"
            }),
            mock.call(expected_headers_second_file, {
                "name": "files2",
                "filename": "abc.txt"
            })
        ])
Пример #4
0
    def test_line_does_not_end_with_correct_line_break(
            self, StreamingFormDataParserDelegateMock):
        delegate = StreamingFormDataParserDelegateMock()
        headers = HTTPHeaders()
        headers.add("Content-Type", 'multipart/form-data; boundary=1234')
        parser = StreamingFormDataParser(delegate, headers)
        data = b"""\
--1234
Content-Disposition: form-data; name="files"; filename="ab.txt"


Foo--1234--
        """.replace(b"\n", b"\r\n")

        parser.data_received(data)

        self.assertTrue(delegate.start_file.called)
        self.assertFalse(delegate.finish_file.called)
        self.assertTrue(delegate.file_data_received.called)
Пример #5
0
    def test_missing_headers(self, StreamingFormDataParserDelegateMock):
        delegate = StreamingFormDataParserDelegateMock()
        headers = HTTPHeaders()
        headers.add("Content-Type", 'multipart/form-data; boundary=1234')
        parser = StreamingFormDataParser(delegate, headers)
        data = b"""\
--1234


Foo
--1234--
        """.replace(b"\n", b"\r\n")

        with ExpectLog(gen_log, "multipart/form-data missing headers"):
            parser.data_received(data)

        self.assertFalse(delegate.start_file.called)
        self.assertFalse(delegate.finish_file.called)
        self.assertFalse(delegate.file_data_received.called)
Пример #6
0
    def test_invalid_content_disposition(self,
                                         StreamingFormDataParserDelegateMock):
        delegate = StreamingFormDataParserDelegateMock()
        headers = HTTPHeaders()
        headers.add("Content-Type", 'multipart/form-data; boundary=1234')
        parser = StreamingFormDataParser(delegate, headers)
        data = b"""\
--1234
Content-Disposition: invalid; name="files"; filename="ab.txt"


Foo
--1234--
        """.replace(b"\n", b"\r\n")

        with ExpectLog(gen_log, "Invalid multipart/form-data"):
            parser.data_received(data)

        self.assertFalse(delegate.start_file.called)
        self.assertFalse(delegate.finish_file.called)
        self.assertFalse(delegate.file_data_received.called)
Пример #7
0
    def test_file_upload_parted_boundary_and_body(
            self, StreamingFormDataParserDelegateMock):
        delegate = StreamingFormDataParserDelegateMock()
        headers = HTTPHeaders()
        headers.add("Content-Type", "multipart/form-data; boundary=1234")
        parser = StreamingFormDataParser(delegate, headers)
        data1 = b"""\
--1234
Content-Disposition: form-d\
""".replace(b"\n", b"\r\n")

        data2 = b"""\
ata; name="files"; filename="ab.txt"

Fo\
""".replace(b"\n", b"\r\n")

        data3 = b"""\
o
--1234--
""".replace(b"\n", b"\r\n")

        parser.data_received(data1)
        parser.data_received(data2)
        parser.data_received(data3)

        self.assertTrue(delegate.start_file.called)
        self.assertTrue(delegate.finish_file.called)
        self.assertTrue(delegate.file_data_received.called)
        expected_headers = HTTPHeaders()
        expected_headers.add("Content-Disposition",
                             'form-data; name="files"; filename="ab.txt"')
        delegate.start_file.assert_called_with(expected_headers, {
            "name": "files",
            "filename": "ab.txt"
        })
        delegate.file_data_received.assert_has_calls(
            [mock.call(b"Fo"), mock.call(b"o")])