2012-01-19 26 views
7

Tôi đang chạy SUDS 0.4 trên Linux Slackware 13.0 với python 2.6.2. Khi tôi gọi phương thức SOAP sử dụng mã này:Cookiejar trống bằng 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') 

tôi nhận được sau phản ứng:

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'} 

nhưng

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

cho thấy rằng không có cookie có sẵn. Điều gì có thể là một lý do cho điều đó? Tôi không thể sử dụng SOAP API vì tôi cần phải vượt qua các thông tin đăng nhập được gửi trong cookie phản hồi.

Hãy giúp tôi về điều này.

BR

rjan

Trả lời

6

Ok, tôi đã chơi xung quanh một chút với nó.

đầu tiên, một máy chủ ít thử nghiệm (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" 

với một số thay đổi nhỏ để thiết lập một tiêu đề cookie.

và bọt-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 

chạy này sản xuất:

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

nên nó seams để làm việc. nhưng nếu bạn thay đổi địa chỉ yêu cầu để http://localhost:7789/?wsdl bạn sẽ nhận được:

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

bật một số khai thác gỗ cho cookielib tại client ...

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

... và nó cho thấy tiết lộ lý do tại sao:

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[]> 

giải thích đơn giản là: tên miền cookie không khớp với miền máy chủ của yêu cầu và dường như cookielib không thực hiện bất kỳ tra cứu nào khi verifyi ng miền.

vì vậy giải pháp sẽ là một trong số:

  • đảm bảo client và server sử dụng cùng một tên miền (hoặc domainname hoặc IP)
    trong ví dụ tôi phải đặt cả để localhost.local để làm cho nó làm việc (có thể phụ thuộc vào tệp hosts ...)
  • loại bỏ tên miền từ các tập tin cookie được gửi đi, sau đó cookieib sử dụng lĩnh vực yêu cầu tự động
  • thực hiện một cookiejar sử dụng tra cứu DNS

Oh, và cuối cùng nhưng không kém phần quan: lý do tại sao nó không làm việc trong câu hỏi OPs:
cổng không phải là một phần của miền, do đó một cookie với Domain=10.242.69.4:8088 sẽ luôn bị từ chối.

Các vấn đề liên quan