2012-01-19 71 views
7

我在Linux上的Slackware 13.0運行肥皂水0.4與Python 2.6.2。當我打電話使用此代碼SOAP方法:空使用cookiejar肥皂水

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" 

與一些小的修改設置cookie首部。

和肥皂水,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在驗證時不會執行任何查找該域名。

因此該解決方案將是一個:

  • 確保客戶端和服務器使用相同的域(無論是域名或IP)
    在我必須設置既localhost.local的例子,使其工作(可取決於hosts文件...)
  • 從發送的cookie刪除域,然後cookieib使用請求域自動
  • 實現使用DNS查找

哦cookiejar,以及最後但並非最不重要的:它爲什麼沒有理由在OP的問題中工作:
該端口不屬於該域,因此,一個與Domain=10.242.69.4:8088的cookie將始終被拒絕。