Projet

Général

Profil

0001-add-a-common-soap-module-based-on-suds-and-requests-.patch

Benjamin Dauvergne, 02 décembre 2015 16:45

Télécharger (5,41 ko)

Voir les différences:

Subject: [PATCH 1/5] add a common soap module based on suds and requests
 (#9163)

The Soap class contains all initialization behaviours needed to create suds
Client objects initialized through a service model or through parameters.
 passerelle/soap.py | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 119 insertions(+)
 create mode 100644 passerelle/soap.py
passerelle/soap.py
1
import os.path
2
import StringIO
3
import urlparse
4

  
5
import requests
6
from suds.client import Client
7
from suds.transport.http import HttpAuthenticated
8
from suds.transport import Reply
9

  
10

  
11
class Transport(HttpAuthenticated):
12
    def __init__(self, username=None, password=None, certificate=None, private_key=None,
13
                 verify=True, domains=None, **kwargs):
14
        assert not (bool(certificate) ^ bool(private_key)), ('a private key is mandatory with a '
15
                                                             'certificate')
16
        assert username is not None or not password, 'a username is mandatory with a password'
17
        self.username = username
18
        self.password = password
19
        self.certificate = certificate
20
        self.private_key = private_key
21
        self.verify = verify
22
        self.domains = domains
23
        HttpAuthenticated.__init__(self, **kwargs)
24

  
25
    def get_requests_kwargs(self, request):
26
        kwargs = {}
27
        parsed = urlparse.urlparse(request.url)
28
        domain = '%s://%s' % (parsed.scheme, parsed.netloc)
29
        if not self.domains or domain in self.domains:
30
            if self.username is not None:
31
                kwargs['auth'] = (self.username, self.password)
32
            if self.certificate is not None:
33
                kwargs['cert'] = (self.certificate, self.private_key)
34
            kwargs['verify'] = self.verify
35
        return kwargs
36

  
37
    def open(self, request):
38
        # only use our custom handler to fetch service resources, not schemas
39
        # from other namespaces
40
        print self.get_requests_kwargs(request)
41
        resp = requests.get(request.url, headers=request.headers,
42
                            **self.get_requests_kwargs(request))
43
        return StringIO.StringIO(resp.content)
44

  
45
    def send(self, request):
46
        resp = requests.post(request.url, data=request.message, headers=request.headers,
47
                             **self.get_requests_kwargs(request))
48
        return Reply(resp.status_code, resp.headers, resp.content)
49

  
50

  
51
class Soap(object):
52
    url = None
53
    path = None
54
    username = None
55
    password = None
56
    certificate = None
57
    private_key = None
58
    domains = None
59
    plugins = None
60
    cache = None
61

  
62
    def __init__(self, url=None, path=None, username=None, password=None, certificate=None,
63
                 private_key=None, verify=None, instance=None, plugins=None, cache=None):
64
        assert not (bool(certificate) ^ bool(private_key)), ('a private key is mandatory with a '
65
                                                             'certificate')
66
        assert username is not None or not password, 'a username is mandatory with a password'
67
        self.domains = set(self.domains) if self.domains else set()
68
        self.plugins = self.plugins or []
69
        if url is not None:
70
            self.url = url
71
        if path is not None:
72
            self.path = None
73
        if username is not None:
74
            self.username = username
75
            self.password = password
76
        if certificate is not None:
77
            self.certificate = certificate
78
            self.private_key = private_key
79
        if verify is not None:
80
            self.verify = verify
81
        if instance is not None:
82
            self.init_from_instance(instance)
83
        if plugins is not None:
84
            self.plugins.extend(plugins)
85
        if cache is not None:
86
            self.cache = cache
87
        self.update_domains()
88

  
89
    def update_domains(self):
90
        if self.url is not None:
91
            parsed_url = urlparse.urlparse(self.url)
92
            self.domains.add('%s://%s' % (parsed_url.scheme, parsed_url.netloc))
93

  
94
    def init_from_instance(self, instance):
95
        if hasattr(instance, 'wsdl_url'):
96
            self.url = instance.wsdl_url
97
        if hasattr(instance, 'username'):
98
            self.username = instance.username
99
            self.password = instance.password
100
        if hasattr(instance, 'keystore'):
101
            self.certificate = instance.keystore.path
102
            self.private_key = self.certificate
103
        if hasattr(instance, 'verify_cert'):
104
            self.verify = instance.verify_cert
105

  
106
    def get_client(self):
107
        url = self.url
108
        if self.path:
109
            url = 'file://' + os.path.abspath(self.path)
110
        return Client(url,
111
                      transport=Transport(
112
                          username=self.username,
113
                          password=self.password,
114
                          certificate=self.certificate,
115
                          private_key=self.private_key,
116
                          verify=self.verify,
117
                          domains=self.domains),
118
                      plugins=self.plugins,
119
                      cache=self.cache)
0
-