import httplib, base64, urllib def tU(x): return unicode(x) def fH(x): return x.decode('hex') def tH(x): return x.encode('hex') def fU8(x): return x.decode('u8') def tU8(x): return x.encode('u8') def fB64(x): return x.decode('base64') def tB64(x): return x.encode('base64') def YaDiskPropfind(method,url,body,headers): conn = httplib.HTTPSConnection("webdav.yandex.ru", port=443) conn.request(method=method,url=url,body=body,headers=headers) resp = conn.getresponse() print '%s - %s'%(str(resp.status),str(resp.reason)) r=resp.read() return r # Метод соединения _method = 'PROPFIND / HTTP/1.1' # Директория на сервере _url = None # Тело запроса _body = """<D:propfind xmlns:D="DAV:"> <D:prop> <D:quota-available-bytes/> <D:quota-used-bytes/> </D:prop> </D:propfind>""" # Заголовки с параметрами запроса _headers = { "User-Agent": "Yandex Disk S60", "Content-Type": "text/xml", "Content-Length": str(len(_body)), "Host": "webdav.yandex.ru", "Accept": "*/*", "Depth": "0", "Authorization": "Basic %s"%tB64("<ИМЯ_АККАУНТА>:<ПАРОЛЬ>")[:-1] } print tU(YaDiskPropfind(_method,_url,_body,_headers))
Этот код отлично работает у меня на Python Runtime (1.9.6), но на 1.4.5 он никак не может прочитать ответ от сервера, выдавая вот такую ошибку:
Traceback (most recent call last): File "E:\private\2000b1a5\default.py", line 81, in menu_action f() File "E:\private\2000b1a5\default.py", line 65, in query_and_exec execfile(script_list[index][1].encode('utf-8'), script_namespace.namespace) File "c:\python\FreeSpace.py", line 41, in ? print tU(YaDiskPropfind(_method,_url,_body,_headers)) File "c:\python\FreeSpace.py", line 16, in YaDiskPropfind r=resp.read() File "E:\HTTPLIB.PY", line 239, in read s = self.fp.read() File "E:\HTTPLIB.PY", line 810, in read assert not self._line_consumed and self._line_left AssertionError
Поковырявшись в исходниках некоторых модулей и на разных форумах, я узнал, что в 1.4.5 отсутствует модуль ssl, необходимый для HTTPS соединений м поэтому модуль HTTPLIB пытается обходиться без него и в результате чего вылетает такая ошибка. Третий день уже ничего с этим поделать не могу. Писать программу на PyS60 Runtime я не хочу, потому что в нём отсутствуют многие нужные мне модули.
Вопрос: Как в питоне 1.4.5 проделывать такие операции с HTTPS запросами безо всяких ошибок. Куда жать, чтобы работало всё? :)