понедельник, 16 августа 2010 г.

Передача Cookie при использовании xmlrpclib

Система 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()