You never can tell with bees (dil) wrote in ru_python,
You never can tell with bees
dil
ru_python

Грабли SSLные, или Как подменить класс в модуле

Вкратце: старая машинка со старым питоном (2.4.3). Скрипт не может прицепиться к HTTPS-серверу, потому что питоновый _ssl по умолчанию использует прибитый гвоздиками SSLv23, поменять в этой версии питона нельзя, а сервер эти протоколы не поддерживает, ему нужен TLSv1. Подробности, если кому интересно, тут: http://ru-root.livejournal.com/2777369.html

Нагуглил, что можно написать собственную реализацию класса HTTPSConnection и на ходу подменить в модуле соответствующий класс:
import httplib
class HTTPSConnection(httplib.HTTPConnection):
...
httplib.HTTPSConnection = HTTPSConnection


Написал с использованием модуля OpenSSL. Соединение теперь устанавливается. Но скрипт вылетает с сообщением
  File "/usr/lib64/python2.4/httplib.py", line 275, in __init__
    self.fp = sock.makefile('rb', 0)
NotImplementedError: Cannot make file object of SSL.Connection

Это в HTTPResponse __init__() ломается при вызове self.fp = sock.makefile('rb', 0).

Написал аналогично свой HTTPSResponse, унаследованный от httplib.HTTPResponse, со своим __init__'ом, который делает makefile по-другому, а __init__ от родительского класса вообще не вызывает. Точно так же воткнул свой класс на ходу в модуль: httplib.HTTPResponse = HTTPSResponse.

Авотфиг, скрипт продолжает вылетать с той же ошибкой в 275 строке /usr/lib64/python2.4/httplib.py

Вопрос: что я делаю не так? Почему класс не подменился? Или он подменился, но тогда почему __init__ от родительского класса продолжает вызываться?
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 15 comments