2017-08-08 9 views
1

soapを使用してsoapサービスにアクセスします。sudsで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. sudsは結果を解析します。最初のwsdl内の他のwsdlの場所を発見します
  3. sudsは最初のwsdlにあるURLにアクセスして他のwsdlファイルを取得したいと考えています。
  4. これらのURLは壊れています。それらは間違ったプロトコルを含んでいます:httpsの代わりにhttp。
  5. 泡HTTPSサーバがクライアント側で通信
  6. を停止し、HTTPSサーバ
  7. にHTTPを話ししようとすると、私は次を参照してください。BadStatusLine

しかし、どのようにこの問題を回避するには?私はクライアントにしかアクセスできません。だからこそ私は解決策ではなく「回避策」を求めています:-)

答えて

0

非常に汚い解決策が見つかりました。

urllib2.OpenerDirector.open()メソッドを一時的に置き換えています。

このようにして、私が受け取ったwsdlにある壊れたURLを修正できます。 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