source: orange-bioinformatics/obiKEGG2/service.py @ 1542:850adb56ad5a

Revision 1542:850adb56ad5a, 3.0 KB checked in by ales_erjavec, 2 years ago (diff)

Fixed open method (must return a fp like object).

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    import StringIO
26   
27    from suds.client import Client
28    from suds.transport import Transport, TransportError
29    from suds.properties import Unskin
30   
31    import requests
32
33    class RequestsResponse(object):
34        pass
35
36    class RequestsTransport(Transport):
37        def __init__(self, **kwargs):
38            Transport.__init__(self)
39            Unskin(self.options).update(kwargs)
40            self.cookies = {}
41           
42        def send(self, request):
43            result = None
44            url = request.url
45            message = request.message
46            headers = request.headers
47            headers["Connection"] = "Keep-Alive"
48            try:
49                response = requests.post(url, data=message, 
50                                         headers=headers,
51                                         cookies=self.cookies)
52                   
53                self.proxy = self.options.proxy
54                response.raise_for_status()
55               
56                self.cookies.update(response.cookies)
57                result = RequestsResponse()
58                result.code = response.status_code
59                result.headers = response.headers
60                result.message = response.raw.read()
61                return result
62               
63            except urllib2.HTTPError, e:
64                if e.code in [202, 204]:
65                    return None
66                else:
67                    raise TransportError(str(e), e.code, e.fp)
68               
69        def open(self, request):
70            url = request.url
71            message = request.message
72            try:
73                response = requests.get(url)
74                self.proxy = self.options.proxy
75               
76                response.raise_for_status()
77                return StringIO.StringIO(response.raw.read())
78            except urllib2.HTTPError, e:
79                raise TransportError(str(e), e.code, e.fp)
80           
81    transport = RequestsTransport()
82    client = Client(KEGG_WDSL, transport=transport)
83    return client.service
84   
85def SOAPy_service():
86    import SOAPy
87
88from . import conf
89
90default_service = suds_service
91web_service = suds_service
92
93if conf.params["service.transport"] == "requests":
94    try:
95        import requests   
96        web_service = suds_service_with_requests
97    except ImportError:
98        import warnings
99        warnings.warn("requests package not installed.")
100       
101elif conf.params["service.transport"] == "urllib2":
102    pass
103
104
Note: See TracBrowser for help on using the repository browser.