Система YourDocs предоставляет свои функции по протоколу XML-RPC. Идентификация пользователя выполняется по адресу сессии, который должен быть передан системе в виде кукиса с именем SESADDR. Проблема заключает в том, что библиотека xmlrpclib "из коробки" не умеет отсылать кукисы вовсе (по крайней мере мне стандартный способ решения этой задачи неизвестен).
Натолкнувшись на вариант, описанный здесь, создал свой класс транспорта, в котором был переопределен всего один метод - send_request:
class YourDocsSimpleCookieTransport(xmlrpclib.Transport):
VERBOSE = False
def __init__(self, server):
xmlrpclib.Transport.__init__(self)
self.server = server
self.verbose = self.VERBOSE
self._cookie = None
def setSessionAddress(self, session_address):
self._cookie = Cookie.SimpleCookie()
self._cookie['SESADDR'] = session_address
def send_request(self, connection, handler, request_body):
connection.putrequest("POST", '%s' % (handler))
if self._cookie:
connection.putheader ('Set-Cookie',
str(self._cookie)[len('Set-Cookie: '):])
Схема использования транспорта следующая:
# Создаем транспорт
transport = YourDocsSimpleCookieTransport()
# Создаем Proxy-объект с использованием этого транспорта
server = xmlrpclib.ServerProxy("http://newdocs/RPC2", transport=transport)
# Входим в систему, получая адрес сессии
session_address = server.Login.login('yourdocs:test', 'password',
{'passwd':'ValidPassword'})
# Устанавливаем текущий адрес сессии
transport.setSessionAddress(session_address)
# Работаем с функциями системы
print server.Session.whoami()
# Закрываем сессию
server.Session.close()