source: orange-bioinformatics/obiKEGG2/service.py @ 1541:efd40e75bc7d

Revision 1541:efd40e75bc7d, 2.9 KB checked in by ales_erjavec, 2 years ago (diff)

Added optional suds.transport.Transport subclass using requests package.

Line 
1"""
2SOAP service client. Needs suds library.
3 
4"""
5from __future__ import absolute_import
6
7KEGG_WDSL = "http://soap.genome.jp/KEGG.wsdl"
8
9import urllib2
10def suds_service():
11    """ Return an suds service object with kegg api service methods.
12   
13    >>> service = web_service()
14    >>> service.list_databases()
15    [(Definition){...
16
17    """
18    from suds.client import Client
19    # TODO: extend suds.transport HttpTransport
20    # to support keep-alive
21    client = Client(KEGG_WDSL)
22    return client.service
23
24def suds_service_with_requests():
25    from suds.client import Client
26    from suds.transport import Transport, TransportError
27    from suds.properties import Unskin
28   
29    import requests
30
31    class RequestsResponse(object):
32        pass
33
34    class RequestsTransport(Transport):
35        def __init__(self, **kwargs):
36            Transport.__init__(self)
37            Unskin(self.options).update(kwargs)
38            self.cookies = {}
39           
40        def send(self, request):
41            result = None
42            url = request.url
43#            print "URL", url
44            message = request.message
45            headers = request.headers
46            headers["Connection"] = "Keep-Alive"
47            try:
48                response = requests.post(url, data=message, 
49                                         headers=headers,
50                                         cookies=self.cookies)
51                   
52                self.proxy = self.options.proxy
53                response.raise_for_status()
54               
55                self.cookies.update(response.cookies)
56                result = RequestsResponse()
57                result.message = response.raw.read()
58                result.headers = response.headers
59                result.code = response.status_code
60                return result
61               
62            except urllib2.HTTPError, e:
63                if e.code in [202, 204]:
64                    return None
65                else:
66                    raise TransportError(str(e), e.code, e.fp)
67               
68        def open(self, request):
69            url = request.url
70            message = request.message
71            try:
72                respose = requests.get(url)
73                self.proxy = self.options.proxy
74               
75                respose.raise_for_status()
76                return response.raw
77            except urllib2.HTTPError, e:
78                raise TransportError(str(e), e.code, e.fp)
79           
80    transport = RequestsTransport()
81    client = Client(KEGG_WDSL, transport=transport)
82    return client.service
83   
84def SOAPy_service():
85    import SOAPy
86
87from . import conf
88
89default_service = suds_service
90web_service = suds_service
91
92if conf.params["service.transport"] == "requests":
93    try:
94        import requests   
95        web_service = suds_service_with_requests
96    except ImportError:
97        import warnings
98        warnings.warn("requests package not installed.")
99elif conf.params["service.transport"] == "urllib2":
100    pass
101
102
Note: See TracBrowser for help on using the repository browser.