From e247fa7c2c254ec25e1cac390217f06f5f5c51f4 Mon Sep 17 00:00:00 2001 From: Jasmin Bom Date: Mon, 10 Sep 2018 21:08:05 +0200 Subject: [PATCH] Fix uploading files with unicode filenames (#1214) * Patch urllib3RequestField to make it *not* support RFC2231 * Add new required test data file * Fix on py2 * Remove weird legacy code from inputfile Not needed anymore, and also makes it not work... so that was not great --- telegram/files/inputfile.py | 5 ----- telegram/utils/request.py | 15 +++++++++++++++ tests/data/测试.png | Bin 0 -> 40993 bytes tests/test_photo.py | 17 ++++++++++++++++- 4 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 tests/data/测试.png diff --git a/telegram/files/inputfile.py b/telegram/files/inputfile.py index a328ad8cf..0d614db34 100644 --- a/telegram/files/inputfile.py +++ b/telegram/files/inputfile.py @@ -22,7 +22,6 @@ import imghdr import mimetypes import os -import sys from uuid import uuid4 from telegram import TelegramError @@ -74,10 +73,6 @@ class InputFile(object): if not self.filename or '.' not in self.filename: self.filename = self.mimetype.replace('/', '.') - if sys.version_info < (3,): - if isinstance(self.filename, unicode): # flake8: noqa pylint: disable=E0602 - self.filename = self.filename.encode('utf-8', 'replace') - @property def field_tuple(self): return self.filename, self.input_file_content, self.mimetype diff --git a/telegram/utils/request.py b/telegram/utils/request.py index dc306f1b0..9c297a3b7 100644 --- a/telegram/utils/request.py +++ b/telegram/utils/request.py @@ -36,6 +36,7 @@ try: import telegram.vendor.ptb_urllib3.urllib3.contrib.appengine as appengine from telegram.vendor.ptb_urllib3.urllib3.connection import HTTPConnection from telegram.vendor.ptb_urllib3.urllib3.util.timeout import Timeout + from telegram.vendor.ptb_urllib3.urllib3.fields import RequestField except ImportError: # pragma: no cover warnings.warn("python-telegram-bot wasn't properly installed. Please refer to README.rst on " "how to properly install.") @@ -45,6 +46,20 @@ from telegram import (InputFile, TelegramError, InputMedia) from telegram.error import (Unauthorized, NetworkError, TimedOut, BadRequest, ChatMigrated, RetryAfter, InvalidToken) + +def _render_part(self, name, value): + """ + Monkey patch urllib3.urllib3.fields.RequestField to make it *not* support RFC2231 compliant + Content-Disposition headers since telegram servers don't understand it. Instead just escape + \ and " and replace any \n and \r with a space. + """ + value = value.replace(u'\\', u'\\\\').replace(u'"', u'\\"') + value = value.replace(u'\r', u' ').replace(u'\n', u' ') + return u'%s="%s"' % (name, value) + + +RequestField._render_part = _render_part + logging.getLogger('urllib3').setLevel(logging.WARNING) USER_AGENT = 'Python Telegram Bot (https://github.com/python-telegram-bot/python-telegram-bot)' diff --git a/tests/data/测试.png b/tests/data/测试.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0dd30897f4c01784fb12eeea7fb9562c551718 GIT binary patch literal 40993 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�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 literal 0 HcmV?d00001 diff --git a/tests/test_photo.py b/tests/test_photo.py index b3f71d22e..521d2cd8e 100644 --- a/tests/test_photo.py +++ b/tests/test_photo.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# +# -*- coding: utf-8 -*- # A library that provides a Python interface to the Telegram Bot API # Copyright (C) 2015-2018 # Leandro Toledo de Souza @@ -195,6 +195,21 @@ class TestPhoto(object): assert isinstance(photo.file_id, str) assert photo.file_id != '' + @flaky(3, 1) + @pytest.mark.timeout(10) + def test_send_file_unicode_filename(self, bot, chat_id): + """ + Regression test for https://github.com/python-telegram-bot/python-telegram-bot/issues/1202 + """ + with open(u'tests/data/测试.png', 'rb') as f: + message = bot.send_photo(photo=f, chat_id=chat_id) + + photo = message.photo[-1] + + assert isinstance(photo, PhotoSize) + assert isinstance(photo.file_id, str) + assert photo.file_id != '' + @flaky(3, 1) @pytest.mark.timeout(10) def test_send_bytesio_jpg_file(self, bot, chat_id):