Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / connection / __init__.py @ 2005b18e

History | View | Annotate | Download (5.1 kB)

1 7d691cf2 Stavros Sachtouris
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 7d691cf2 Stavros Sachtouris
#
3 7d691cf2 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 7d691cf2 Stavros Sachtouris
# without modification, are permitted provided that the following
5 7d691cf2 Stavros Sachtouris
# conditions are met:
6 7d691cf2 Stavros Sachtouris
#
7 7d691cf2 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 a2e8e549 Stavros Sachtouris
#      copyright notice, self.list of conditions and the following
9 7d691cf2 Stavros Sachtouris
#      disclaimer.
10 7d691cf2 Stavros Sachtouris
#
11 7d691cf2 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 a2e8e549 Stavros Sachtouris
#      copyright notice, self.list of conditions and the following
13 7d691cf2 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 7d691cf2 Stavros Sachtouris
#      provided with the distribution.
15 7d691cf2 Stavros Sachtouris
#
16 7d691cf2 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 7d691cf2 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 7d691cf2 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 7d691cf2 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 7d691cf2 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 7d691cf2 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 7d691cf2 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 7d691cf2 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 7d691cf2 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 7d691cf2 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 7d691cf2 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 7d691cf2 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 7d691cf2 Stavros Sachtouris
#
29 7d691cf2 Stavros Sachtouris
# The views and conclusions contained in the software and
30 7d691cf2 Stavros Sachtouris
# documentation are those of the authors and should not be
31 7d691cf2 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 a2e8e549 Stavros Sachtouris
# or implied, of GRNET S.A.
33 7d691cf2 Stavros Sachtouris
34 3dabe5d2 Stavros Sachtouris
35 5cffe0b4 Stavros Sachtouris
class HTTPResponse(object):
36 5f7882af Stavros Sachtouris
    """An abstract HTTP Response object to handle a performed HTTPRequest.
37 5f7882af Stavros Sachtouris
    Subclass implementation required
38 5f7882af Stavros Sachtouris
    """
39 118d9271 Stavros Sachtouris
40 2576d8b1 Stavros Sachtouris
    def __init__(self, request=None, prefetched=False):
41 3dabe5d2 Stavros Sachtouris
        self.request = request
42 2576d8b1 Stavros Sachtouris
        self.prefetched = prefetched
43 2576d8b1 Stavros Sachtouris
44 2576d8b1 Stavros Sachtouris
    def _get_response(self):
45 2576d8b1 Stavros Sachtouris
        """Wait for http response as late as possible: the first time needed"""
46 2576d8b1 Stavros Sachtouris
        if self.prefetched:
47 2576d8b1 Stavros Sachtouris
            return
48 2576d8b1 Stavros Sachtouris
        self = self.request.response
49 2576d8b1 Stavros Sachtouris
        self.prefetched = True
50 2576d8b1 Stavros Sachtouris
51 6ad245d5 Stavros Sachtouris
    def release(self):
52 5f7882af Stavros Sachtouris
        """Release the connection.
53 b4c8b916 Stavros Sachtouris
        """
54 6ad245d5 Stavros Sachtouris
        raise NotImplementedError
55 6ad245d5 Stavros Sachtouris
56 3dabe5d2 Stavros Sachtouris
    @property
57 2576d8b1 Stavros Sachtouris
    def prefetched(self):
58 5f7882af Stavros Sachtouris
        """flag to avoid downloading more than nessecary"""
59 2576d8b1 Stavros Sachtouris
        return self._prefetched
60 3dabe5d2 Stavros Sachtouris
61 2576d8b1 Stavros Sachtouris
    @prefetched.setter
62 2576d8b1 Stavros Sachtouris
    def prefetched(self, p):
63 2576d8b1 Stavros Sachtouris
        self._prefetched = p
64 118d9271 Stavros Sachtouris
65 3dabe5d2 Stavros Sachtouris
    @property
66 118d9271 Stavros Sachtouris
    def content(self):
67 5f7882af Stavros Sachtouris
        """(binary) request response content (data)"""
68 2576d8b1 Stavros Sachtouris
        self._get_response()
69 118d9271 Stavros Sachtouris
        return self._content
70 3dabe5d2 Stavros Sachtouris
71 3dabe5d2 Stavros Sachtouris
    @content.setter
72 118d9271 Stavros Sachtouris
    def content(self, v):
73 118d9271 Stavros Sachtouris
        self._content = v
74 2576d8b1 Stavros Sachtouris
75 3dabe5d2 Stavros Sachtouris
    @property
76 118d9271 Stavros Sachtouris
    def text(self):
77 5f7882af Stavros Sachtouris
        """(str)"""
78 2576d8b1 Stavros Sachtouris
        self._get_response()
79 118d9271 Stavros Sachtouris
        return self._text
80 3dabe5d2 Stavros Sachtouris
81 3dabe5d2 Stavros Sachtouris
    @text.setter
82 118d9271 Stavros Sachtouris
    def text(self, v):
83 118d9271 Stavros Sachtouris
        self._text = v
84 2576d8b1 Stavros Sachtouris
85 3dabe5d2 Stavros Sachtouris
    @property
86 118d9271 Stavros Sachtouris
    def json(self):
87 5f7882af Stavros Sachtouris
        """(dict)"""
88 2576d8b1 Stavros Sachtouris
        self._get_response()
89 118d9271 Stavros Sachtouris
        return self._json
90 3dabe5d2 Stavros Sachtouris
91 3dabe5d2 Stavros Sachtouris
    @json.setter
92 118d9271 Stavros Sachtouris
    def json(self, v):
93 118d9271 Stavros Sachtouris
        self._json = v
94 2576d8b1 Stavros Sachtouris
95 3dabe5d2 Stavros Sachtouris
    @property
96 118d9271 Stavros Sachtouris
    def headers(self):
97 5f7882af Stavros Sachtouris
        """(dict)"""
98 2576d8b1 Stavros Sachtouris
        self._get_response()
99 118d9271 Stavros Sachtouris
        return self._headers
100 3dabe5d2 Stavros Sachtouris
101 3dabe5d2 Stavros Sachtouris
    @headers.setter
102 118d9271 Stavros Sachtouris
    def headers(self, v):
103 118d9271 Stavros Sachtouris
        self._headers = v
104 2576d8b1 Stavros Sachtouris
105 3dabe5d2 Stavros Sachtouris
    @property
106 118d9271 Stavros Sachtouris
    def status_code(self):
107 5f7882af Stavros Sachtouris
        """(int) optional"""
108 2576d8b1 Stavros Sachtouris
        self._get_response()
109 118d9271 Stavros Sachtouris
        return self._status_code
110 3dabe5d2 Stavros Sachtouris
111 3dabe5d2 Stavros Sachtouris
    @status_code.setter
112 118d9271 Stavros Sachtouris
    def status_code(self, v):
113 118d9271 Stavros Sachtouris
        self._status_code = v
114 2576d8b1 Stavros Sachtouris
115 3dabe5d2 Stavros Sachtouris
    @property
116 118d9271 Stavros Sachtouris
    def status(self):
117 5f7882af Stavros Sachtouris
        """(str) useful in server error responses"""
118 2576d8b1 Stavros Sachtouris
        self._get_response()
119 118d9271 Stavros Sachtouris
        return self._status
120 3dabe5d2 Stavros Sachtouris
121 3dabe5d2 Stavros Sachtouris
    @status.setter
122 118d9271 Stavros Sachtouris
    def status(self, v):
123 118d9271 Stavros Sachtouris
        self._status = v
124 2576d8b1 Stavros Sachtouris
125 3dabe5d2 Stavros Sachtouris
    @property
126 118d9271 Stavros Sachtouris
    def request(self):
127 5f7882af Stavros Sachtouris
        """(HTTPConnection) the source of this response object"""
128 118d9271 Stavros Sachtouris
        return self._request
129 3dabe5d2 Stavros Sachtouris
130 3dabe5d2 Stavros Sachtouris
    @request.setter
131 118d9271 Stavros Sachtouris
    def request(self, v):
132 118d9271 Stavros Sachtouris
        self._request = v
133 2f749e6e Stavros Sachtouris
134 3dabe5d2 Stavros Sachtouris
135 5cffe0b4 Stavros Sachtouris
class HTTPConnection(object):
136 5f7882af Stavros Sachtouris
    """An abstract HTTP Connection mechanism. Subclass implementation required
137 5f7882af Stavros Sachtouris
    """
138 620edeb1 Stavros Sachtouris
139 2f749e6e Stavros Sachtouris
    def __init__(self, method=None, url=None, params={}, headers={}):
140 3dabe5d2 Stavros Sachtouris
        self.headers = headers
141 3dabe5d2 Stavros Sachtouris
        self.params = params
142 3dabe5d2 Stavros Sachtouris
        self.url = url
143 7d91734c Stavros Sachtouris
        self.path = ''
144 3dabe5d2 Stavros Sachtouris
        self.method = method
145 620edeb1 Stavros Sachtouris
146 5cffe0b4 Stavros Sachtouris
    def set_header(self, name, value):
147 3dabe5d2 Stavros Sachtouris
        self.headers[unicode(name)] = unicode(value)
148 620edeb1 Stavros Sachtouris
149 2f749e6e Stavros Sachtouris
    def remove_header(self, name):
150 3dabe5d2 Stavros Sachtouris
        try:
151 3dabe5d2 Stavros Sachtouris
            self.headers.pop(name)
152 3dabe5d2 Stavros Sachtouris
        except KeyError:
153 3dabe5d2 Stavros Sachtouris
            pass
154 2f749e6e Stavros Sachtouris
155 5cffe0b4 Stavros Sachtouris
    def replace_headers(self, new_headers):
156 3dabe5d2 Stavros Sachtouris
        self.headers = new_headers
157 620edeb1 Stavros Sachtouris
158 5cffe0b4 Stavros Sachtouris
    def reset_headers(self):
159 3dabe5d2 Stavros Sachtouris
        self.replace_headers({})
160 5cffe0b4 Stavros Sachtouris
161 5cffe0b4 Stavros Sachtouris
    def set_param(self, name, value=None):
162 3dabe5d2 Stavros Sachtouris
        self.params[name] = value
163 5cffe0b4 Stavros Sachtouris
164 2f749e6e Stavros Sachtouris
    def remove_param(self, name):
165 3dabe5d2 Stavros Sachtouris
        try:
166 3dabe5d2 Stavros Sachtouris
            self.params.pop(name)
167 3dabe5d2 Stavros Sachtouris
        except KeyError:
168 3dabe5d2 Stavros Sachtouris
            pass
169 2f749e6e Stavros Sachtouris
170 5cffe0b4 Stavros Sachtouris
    def replace_params(self, new_params):
171 3dabe5d2 Stavros Sachtouris
        self.params = new_params
172 5cffe0b4 Stavros Sachtouris
173 5cffe0b4 Stavros Sachtouris
    def reset_params(self):
174 3dabe5d2 Stavros Sachtouris
        self.replace_params({})
175 5cffe0b4 Stavros Sachtouris
176 5cffe0b4 Stavros Sachtouris
    def set_url(self, url):
177 3dabe5d2 Stavros Sachtouris
        self.url = url
178 5cffe0b4 Stavros Sachtouris
179 7d91734c Stavros Sachtouris
    def set_path(self, path):
180 7d91734c Stavros Sachtouris
        self.path = path
181 7d91734c Stavros Sachtouris
182 5cffe0b4 Stavros Sachtouris
    def set_method(self, method):
183 3dabe5d2 Stavros Sachtouris
        self.method = method
184 3dabe5d2 Stavros Sachtouris
185 24ff0a35 Stavros Sachtouris
    def perform_request(
186 2005b18e Stavros Sachtouris
            self,
187 2005b18e Stavros Sachtouris
            method=None,
188 2005b18e Stavros Sachtouris
            url=None,
189 2005b18e Stavros Sachtouris
            async_headers={},
190 2005b18e Stavros Sachtouris
            async_params={},
191 2005b18e Stavros Sachtouris
            data=None):
192 3dabe5d2 Stavros Sachtouris
        raise NotImplementedError