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__ от родительского класса продолжает вызываться?
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 15 comments