2012-01-19 3 views
7

Я запускаю SUDS 0.4 на Linux Slackware 13.0 с python 2.6.2. Когда я вызываю метод SOAP, используя этот код:Пустой cookiejar с использованием SUDS

from suds.client import Client 

client = Client(url='file:acctWeb.wsdl', 
       location='http://10.242.69.4:8088/pfmaccess') 

res = client.service.login(login='user',password='passwd') 

Я получаю следующий ответ:

DEBUG:suds.transport.http:received: 
CODE: 200 
HEADERS: {'set-cookie': 'OSP_Ref=0000000573800052;Domain=10.242.69.4:8088;Path=/pfmaccess', 'content-length': '26541', 'content-type': 'text/xml; charset=utf-8', 'connection': 'close', 'server': 'Alcatel-Lucent OSP 2.4'} 

но

>>> client.options.transport.cookiejar 
<cookielib.CookieJar[]> 

показывает, что нет доступного печенья. Что может быть причиной для этого? Я не могу использовать SOAP API, потому что мне нужно передать учетные данные, отправленные в файле cookie ответа.

Пожалуйста, помогите мне в этом.

BR

rjan

ответ

6

Хорошо, я играл немного с ним.

первый, маленький тестовый сервер (courtesy of soaplib):

import soaplib 
from soaplib.core.service import rpc, DefinitionBase, soap 
from soaplib.core.model.primitive import String, Integer 
from soaplib.core.server import wsgi 
from soaplib.core.model.clazz import Array 
import sys, pprint 

class HelloWorldService(DefinitionBase): 
    @soap(String,Integer,_returns=Array(String)) 
    def say_hello(self,name,times): 
     results = [] 
     for i in range(0,times): 
      results.append('Hello, %s'%name) 
     return results 

class WsgiApp(wsgi.Application): 

    def on_wsgi_return(self, env, headers, return_str): 
     headers['Set-Cookie'] = 'spam=eggs;domain=127.0.0.1;path=/' 
     print >>sys.stderr, headers 

if __name__=='__main__': 
    try: 
     from wsgiref.simple_server import make_server 
     soap_application = soaplib.core.Application([HelloWorldService], 'tns') 
     wsgi_application = WsgiApp(soap_application) 
     server = make_server('localhost', 7789, wsgi_application) 
     server.serve_forever() 
    except ImportError: 
     print "Error: example server code requires Python >= 2.5" 

с некоторыми незначительными изменениями, чтобы установить заголовок печенья.

и пенообразование-testclient:

from suds import client, transport 

c = client.Client("http://127.0.0.1:7789/?wsdl") 
print c.service.say_hello("spam", 1) 
print c.options.transport.cookiejar 

работает это производит:

(stringArray){ 
    string[] = 
     "Hello, spam", 
} 
<cookielib.CookieJar[<Cookie spam=eggs for .127.0.0.1/>]> 

поэтому швы на работу. но если вы измените URL запроса на http://localhost:7789/?wsdl вы получите:

(stringArray){ 
    string[] = 
     "Hello, spam", 
} 
<cookielib.CookieJar[]> 

поворота на некоторых протоколирования для cookielib на клиенте ...

import logging 
import cookielib 
logging.basicConfig() 
logging.getLogger('cookielib').setLevel(logging.DEBUG) 
cookielib.debug = True 

... и это показывает, показывает, почему:

DEBUG:cookielib:add_cookie_header 
DEBUG:cookielib:extract_cookies: Date: Thu, 17 May 2012 15:56:01 GMT 
Server: WSGIServer/0.1 Python/2.7.3 
Set-Cookie: spam=eggs;domain=127.0.0.1;path=/ 
Content-Length: 822 
Content-Type: text/xml 

DEBUG:cookielib: - checking cookie spam=eggs 
DEBUG:cookielib: effective request-host localhost.local (even with added initial 
        dot) does not end with .127.0.0.1 
(stringArray){ 
    string[] = 
     "Hello, spam", 
} 
<cookielib.CookieJar[]> 

Простым объяснением является то, что домен cookie не совпадает с доменом сервера запроса, и, как кажется cookielib не выполняет поиск, когда verifyi в домене.

поэтому решение будет один из:

  • убедитесь, клиент и сервер используют один и тот же домен (или имя домена или IP)
    в примере я установить как для localhost.local, чтобы сделать его работу (может зависит от файла hosts ...)
  • удалить домен из присланного печенья, то cookieib использует домен запроса автоматически
  • реализовать cookiejar, который использует поиск DNS

О, и последнее, но не в последнюю очередь: причина, почему он не сделал работа в вопросе OPs:
порт не является частью домена, поэтому cookie с Domain=10.242.69.4:8088 всегда будет отклонен.

Смежные вопросы