werwolfby / monitorrent

Automatic torrents downloader
Do What The F*ck You Want To Public License
509 stars 71 forks source link

Ошибка #214

Closed skaa closed 4 years ago

skaa commented 7 years ago

При открытии http://localhost:6687/ в консоли ошибки:

UnicodeEncodeError('latin-1', 'Натали-ПК', 0, 6, 'ordinal not in range(256)')
Traceback (most recent call last):
  File "C:\Program Files (x86)\Monitorrent\env\lib\site-packages\cheroot\server.py", line 966, in communicate
    req.respond()
  File "C:\Program Files (x86)\Monitorrent\env\lib\site-packages\cheroot\server.py", line 796, in respond
    self.send_headers()
  File "C:\Program Files (x86)\Monitorrent\env\lib\site-packages\cheroot\server.py", line 910, in send_headers
    self.server.server_name.encode('ISO-8859-1'),
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-5: ordinal not in range(256)

видимо дело в том, что компьютер с виндой имеет сетевое имя Натали-ПК. Кстати этот текст повторяется несколько раз, хотя запрос из браузера выполнялся только один.

byg0n3 commented 7 years ago

Классика проблем с кодировкой и виндовая реализация cp1251. По факту - проблема в сторонней либе (и, кстати, так и не понятно, зачем они насильно пытаются это делать, если браузеры нынче могут в нормальный диапазон символов).

В качестве локального решения может помочь изменение hostname на что-нибудь в латинском исполнении (Natali-PC).

По коду - https://github.com/werwolfby/monitorrent/blob/develop/server.py#L188 и падает на https://github.com/cherrypy/cheroot/blob/master/cheroot/server.py#L884

werwolfby commented 7 years ago

Из rfc:

By default, message header field parameters in Hypertext Transfer Protocol (HTTP) messages cannot carry characters outside the ISO- 8859-1 character set. RFC 2231 defines an encoding mechanism for use

Так что похоже что логично :(. Надо наверное будет захардкодать имя сервера.

byg0n3 commented 7 years ago

Это стандартная рекомендация для совместимости с RFC 2231. Раздел 3.2 особенно подчеркивает, что это не является обязательным требованием:

However, RFC 2231 does not specify a mandatory-to-implement character set, making it hard for senders to decide which character set to use. Thus, recipients implementing this specification MUST support the character sets "ISO-8859-1" [ISO-8859-1] and "UTF-8" [RFC3629].

В придачу, w3 также не настаивает на использовании "ISO-8859-1".

Я бы завел тикет в cheroot для начала и спросил о возможности использования дефолтного utf-8. За спрос не бьют, как говорится.

werwolfby commented 7 years ago

Согласен, спасибо

webknjaz commented 7 years ago

@werwolfby I've raised this question @ https://github.com/cherrypy/cheroot/issues/27

werwolfby commented 7 years ago

@webknjaz thanks a lot!

webknjaz commented 7 years ago

@werwolfby while I'm not sure about the way we'd fix this in cheroot, I suggest you specifying the server name explicitly in this call as a workaround.

It would look smth like:

server = wsgi.Server(server_start_params, app, server_name='Monitorrent Server/v100500')
webknjaz commented 7 years ago

@werwolfby otherwise upgrade cheroot to v5.7.0, It's got normal string set by default now.

werwolfby commented 7 years ago

Cool, will do it.

werwolfby commented 4 years ago

@webknjaz cause we've already updated to 6+ version of cheroot, I close the issue