source: orange-bioinformatics/obiKEGG2/service.py @ 1553:c0221fcbf175

Revision 1553:c0221fcbf175, 3.0 KB checked in by ales_erjavec, 2 years ago (diff)

Added comment to requests use of keep-alive.

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