2017-08-08 96 views
1

我们使用泡沫来访问soap服务。用泡沫客户端重写URL

url = 'https://example.com/scr-webservices/soap/AuthenticationService?wsdl' 
client = Client(url) 
client.login() 

结果:

File ".../suds/client.py", line 112, in __init__ 
    self.wsdl = reader.open(url) 
    File ".../suds/reader.py", line 157, in open 
    d = self.fn(url, self.options) 
    File ".../suds/wsdl.py", line 159, in __init__ 
    self.build_schema() 
    File ".../suds/wsdl.py", line 220, in build_schema 
    self.schema = container.load(self.options) 
    File ".../suds/xsd/schema.py", line 93, in load 
    child.open_imports(options) 
    File ".../suds/xsd/schema.py", line 305, in open_imports 
    imported = imp.open(options) 
    File ".../suds/xsd/sxbasic.py", line 542, in open 
    result = self.download(options) 
    File ".../suds/xsd/sxbasic.py", line 560, in download 
    d = reader.open(url) 
    File ".../suds/reader.py", line 84, in open 
    d = self.download(url) 
    File ".../suds/reader.py", line 100, in download 
    fp = self.options.transport.open(Request(url)) 
    File ".../suds/transport/https.py", line 60, in open 
    return HttpTransport.open(self, request) 
    File ".../suds/transport/http.py", line 105, in open 
    fp = self.invoke(request, retfile=True) 
    File ".../suds/transport/http.py", line 153, in invoke 
    u2response = urlopener.open(u2request, timeout=tm) 
    File "/usr/lib/python2.7/urllib2.py", line 429, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.7/urllib2.py", line 447, in _open 
    '_open', req) 
    File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 1228, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/usr/lib/python2.7/urllib2.py", line 1201, in do_open 
    r = h.getresponse(buffering=True) 
    File "/usr/lib/python2.7/httplib.py", line 1136, in getresponse 
    response.begin() 
    File "/usr/lib/python2.7/httplib.py", line 453, in begin 
    version, status, reason = self._read_status() 
    File "/usr/lib/python2.7/httplib.py", line 417, in _read_status 
    raise BadStatusLine(line) 
httplib.BadStatusLine: '' 
client.service.login() 

如果我调试了进去,并认为,出现这种情况:

  1. 我在Client(url)提供得到由肥皂水客户端库中取出的URL
  2. 泡沫分析结果。它发现第一个wsdl中的其他wsdl位置suds希望通过访问在第一个wsdl中找到的URL来获取其他wsdl文件。
  3. 这些URL已损坏。它们包含错误的协议:http而不是https。
  4. 肥皂水试图说服HTTP到HTTPS服务器
  5. HTTPS服务器停止在客户端的通信
  6. 我看到:BadStatusLine

但如何解决此问题?我只能访问客户端。这就是为什么我要求“解决”不是为了解决方案:-)

回答

0

我发现了一个非常肮脏的解决方案。

我正在替换urllib2.OpenerDirector.open()方法。

这样我就可以修复我收到的wsdl中损坏的URL。我将网址从“http”更改为“https”。

更好的解决方案比欢迎:-)

第一个解决方案是提供一个可替代的传送对象的更多。但并非所有客户端服务器http连接似乎都使用此传输。

url = 'https://localhost:40443/scr-webservices/soap/AuthenticationService?wsdl' 

import ssl 

import mock 
from suds.client import Client 
from urllib2 import OpenerDirector 


def rewrite_url(url): 
    magic = 'http:' 
    if magic in url: 
     url = url.replace(magic, 'https:') 
    return url 


def my_open_director_open(original): 
    def my_open(self, request_obj, **kwargs): 
     request_obj.host = request_obj.get_host() 
     request_obj._Request__original = rewrite_url(request_obj._Request__original) 
     request_obj.type = 'https' 
     return original(self, request_obj, **kwargs) 

    return my_open 


with mock.patch('ssl._create_default_https_context', ssl._create_unverified_context): 
    opener_director_open_original = OpenerDirector.open 
    try: 
     OpenerDirector.open = my_open_director_open(opener_director_open_original) 
     client = Client(url) 
     print(client) 
     print(client.service.remote_procedure_to_call()) 
    finally: 
     OpenerDirector.open = opener_director_open_original