diff options
author | Olof Johansson <olof.johansson@axis.com> | 2014-01-20 12:03:22 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-03-24 17:54:46 +0000 |
commit | aca2d14e9350fde58aaaa95cdeff5b051c1d38d3 (patch) | |
tree | 503fbfed656119128b0632b59fdbfc66fb7095d9 | |
parent | 64fdd3abbbe9ab99c3bc5083d4172ea7bc17bae3 (diff) | |
download | poky-aca2d14e9350fde58aaaa95cdeff5b051c1d38d3.tar.gz |
bitbake: fetch2.URI: add support for query parameters
This change introduces the .query property of the URI class. It is a
read/write dict of the parameters supplied in the query string of the
URI. E.g.:
http://example.com/?foo=bar => .query = {'foo': 'bar'}
(Bitbake rev: 1cb2b3c458c8c5521591d2c8f2e0058143fc77bb)
Signed-off-by: Olof Johansson <olof.johansson@axis.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | bitbake/lib/bb/fetch2/__init__.py | 38 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/fetch.py | 30 |
2 files changed, 53 insertions, 15 deletions
diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py index 5c6180bbb7..d9d193ab12 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py | |||
@@ -162,6 +162,7 @@ class URI(object): | |||
162 | * path_quoted (read/write) | 162 | * path_quoted (read/write) |
163 | A URI quoted version of path | 163 | A URI quoted version of path |
164 | * params (dict) (read/write) | 164 | * params (dict) (read/write) |
165 | * query (dict) (read/write) | ||
165 | * relative (bool) (read only) | 166 | * relative (bool) (read only) |
166 | True if this is a "relative URI", (e.g. file:foo.diff) | 167 | True if this is a "relative URI", (e.g. file:foo.diff) |
167 | 168 | ||
@@ -201,6 +202,7 @@ class URI(object): | |||
201 | self.port = None | 202 | self.port = None |
202 | self._path = '' | 203 | self._path = '' |
203 | self.params = {} | 204 | self.params = {} |
205 | self.query = {} | ||
204 | self.relative = False | 206 | self.relative = False |
205 | 207 | ||
206 | if not uri: | 208 | if not uri: |
@@ -253,36 +255,42 @@ class URI(object): | |||
253 | self.path = urllib.unquote(path) | 255 | self.path = urllib.unquote(path) |
254 | 256 | ||
255 | if param_str: | 257 | if param_str: |
256 | self.params = self._param_dict(param_str) | 258 | self.params = self._param_str_split(param_str, ";") |
259 | if urlp.query: | ||
260 | self.query = self._param_str_split(urlp.query, "&") | ||
257 | 261 | ||
258 | def __str__(self): | 262 | def __str__(self): |
259 | userinfo = self.userinfo | 263 | userinfo = self.userinfo |
260 | if userinfo: | 264 | if userinfo: |
261 | userinfo += '@' | 265 | userinfo += '@' |
262 | 266 | ||
263 | return "%s:%s%s%s%s%s" % ( | 267 | return "%s:%s%s%s%s%s%s" % ( |
264 | self.scheme, | 268 | self.scheme, |
265 | '' if self.relative else '//', | 269 | '' if self.relative else '//', |
266 | userinfo, | 270 | userinfo, |
267 | self.hostport, | 271 | self.hostport, |
268 | self.path_quoted, | 272 | self.path_quoted, |
269 | self._param_str) | 273 | self._query_str(), |
274 | self._param_str()) | ||
270 | 275 | ||
271 | @property | ||
272 | def _param_str(self): | 276 | def _param_str(self): |
273 | ret = '' | 277 | return ( |
274 | for key, val in self.params.items(): | 278 | ''.join([';', self._param_str_join(self.params, ";")]) |
275 | ret += ";%s=%s" % (key, val) | 279 | if self.params else '') |
280 | |||
281 | def _query_str(self): | ||
282 | return ( | ||
283 | ''.join(['?', self._param_str_join(self.query, "&")]) | ||
284 | if self.query else '') | ||
285 | |||
286 | def _param_str_split(self, string, elmdelim, kvdelim="="): | ||
287 | ret = {} | ||
288 | for k, v in [x.split(kvdelim, 1) for x in string.split(elmdelim)]: | ||
289 | ret[k] = v | ||
276 | return ret | 290 | return ret |
277 | 291 | ||
278 | def _param_dict(self, param_str): | 292 | def _param_str_join(self, dict_, elmdelim, kvdelim="="): |
279 | parm = {} | 293 | return elmdelim.join([kvdelim.join([k, v]) for k, v in dict_.items()]) |
280 | |||
281 | for keyval in param_str.split(";"): | ||
282 | key, val = keyval.split("=", 1) | ||
283 | parm[key] = val | ||
284 | |||
285 | return parm | ||
286 | 294 | ||
287 | @property | 295 | @property |
288 | def hostport(self): | 296 | def hostport(self): |
diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py index f93a636586..15fe0ab2f2 100644 --- a/bitbake/lib/bb/tests/fetch.py +++ b/bitbake/lib/bb/tests/fetch.py | |||
@@ -39,6 +39,7 @@ class URITest(unittest.TestCase): | |||
39 | 'username': '', | 39 | 'username': '', |
40 | 'password': '', | 40 | 'password': '', |
41 | 'params': {}, | 41 | 'params': {}, |
42 | 'query': {}, | ||
42 | 'relative': False | 43 | 'relative': False |
43 | }, | 44 | }, |
44 | "http://www.google.com/index.html;param1=value1" : { | 45 | "http://www.google.com/index.html;param1=value1" : { |
@@ -54,6 +55,23 @@ class URITest(unittest.TestCase): | |||
54 | 'params': { | 55 | 'params': { |
55 | 'param1': 'value1' | 56 | 'param1': 'value1' |
56 | }, | 57 | }, |
58 | 'query': {}, | ||
59 | 'relative': False | ||
60 | }, | ||
61 | "http://www.example.org/index.html?param1=value1" : { | ||
62 | 'uri': 'http://www.example.org/index.html?param1=value1', | ||
63 | 'scheme': 'http', | ||
64 | 'hostname': 'www.example.org', | ||
65 | 'port': None, | ||
66 | 'hostport': 'www.example.org', | ||
67 | 'path': '/index.html', | ||
68 | 'userinfo': '', | ||
69 | 'username': '', | ||
70 | 'password': '', | ||
71 | 'params': {}, | ||
72 | 'query': { | ||
73 | 'param1': 'value1' | ||
74 | }, | ||
57 | 'relative': False | 75 | 'relative': False |
58 | }, | 76 | }, |
59 | "http://www.example.com:8080/index.html" : { | 77 | "http://www.example.com:8080/index.html" : { |
@@ -67,6 +85,7 @@ class URITest(unittest.TestCase): | |||
67 | 'username': '', | 85 | 'username': '', |
68 | 'password': '', | 86 | 'password': '', |
69 | 'params': {}, | 87 | 'params': {}, |
88 | 'query': {}, | ||
70 | 'relative': False | 89 | 'relative': False |
71 | }, | 90 | }, |
72 | "cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg" : { | 91 | "cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg" : { |
@@ -82,6 +101,7 @@ class URITest(unittest.TestCase): | |||
82 | 'params': { | 101 | 'params': { |
83 | 'module': 'familiar/dist/ipkg' | 102 | 'module': 'familiar/dist/ipkg' |
84 | }, | 103 | }, |
104 | 'query': {}, | ||
85 | 'relative': False | 105 | 'relative': False |
86 | }, | 106 | }, |
87 | "cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg": { | 107 | "cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg": { |
@@ -98,6 +118,7 @@ class URITest(unittest.TestCase): | |||
98 | 'tag': 'V0-99-81', | 118 | 'tag': 'V0-99-81', |
99 | 'module': 'familiar/dist/ipkg' | 119 | 'module': 'familiar/dist/ipkg' |
100 | }, | 120 | }, |
121 | 'query': {}, | ||
101 | 'relative': False | 122 | 'relative': False |
102 | }, | 123 | }, |
103 | "file://example.diff": { # NOTE: Not RFC compliant! | 124 | "file://example.diff": { # NOTE: Not RFC compliant! |
@@ -111,6 +132,7 @@ class URITest(unittest.TestCase): | |||
111 | 'username': '', | 132 | 'username': '', |
112 | 'password': '', | 133 | 'password': '', |
113 | 'params': {}, | 134 | 'params': {}, |
135 | 'query': {}, | ||
114 | 'relative': True | 136 | 'relative': True |
115 | }, | 137 | }, |
116 | "file:example.diff": { # NOTE: RFC compliant version of the former | 138 | "file:example.diff": { # NOTE: RFC compliant version of the former |
@@ -125,6 +147,7 @@ class URITest(unittest.TestCase): | |||
125 | 'username': '', | 147 | 'username': '', |
126 | 'password': '', | 148 | 'password': '', |
127 | 'params': {}, | 149 | 'params': {}, |
150 | 'query': {}, | ||
128 | 'relative': True | 151 | 'relative': True |
129 | }, | 152 | }, |
130 | "file:///tmp/example.diff": { | 153 | "file:///tmp/example.diff": { |
@@ -139,6 +162,7 @@ class URITest(unittest.TestCase): | |||
139 | 'username': '', | 162 | 'username': '', |
140 | 'password': '', | 163 | 'password': '', |
141 | 'params': {}, | 164 | 'params': {}, |
165 | 'query': {}, | ||
142 | 'relative': False | 166 | 'relative': False |
143 | }, | 167 | }, |
144 | "git:///path/example.git": { | 168 | "git:///path/example.git": { |
@@ -153,6 +177,7 @@ class URITest(unittest.TestCase): | |||
153 | 'username': '', | 177 | 'username': '', |
154 | 'password': '', | 178 | 'password': '', |
155 | 'params': {}, | 179 | 'params': {}, |
180 | 'query': {}, | ||
156 | 'relative': False | 181 | 'relative': False |
157 | }, | 182 | }, |
158 | "git:path/example.git": { | 183 | "git:path/example.git": { |
@@ -167,6 +192,7 @@ class URITest(unittest.TestCase): | |||
167 | 'username': '', | 192 | 'username': '', |
168 | 'password': '', | 193 | 'password': '', |
169 | 'params': {}, | 194 | 'params': {}, |
195 | 'query': {}, | ||
170 | 'relative': True | 196 | 'relative': True |
171 | }, | 197 | }, |
172 | "git://example.net/path/example.git": { | 198 | "git://example.net/path/example.git": { |
@@ -181,6 +207,7 @@ class URITest(unittest.TestCase): | |||
181 | 'username': '', | 207 | 'username': '', |
182 | 'password': '', | 208 | 'password': '', |
183 | 'params': {}, | 209 | 'params': {}, |
210 | 'query': {}, | ||
184 | 'relative': False | 211 | 'relative': False |
185 | } | 212 | } |
186 | } | 213 | } |
@@ -243,6 +270,9 @@ class URITest(unittest.TestCase): | |||
243 | uri.params = test['params'] | 270 | uri.params = test['params'] |
244 | self.assertEqual(uri.params, test['params']) | 271 | self.assertEqual(uri.params, test['params']) |
245 | 272 | ||
273 | uri.query = test['query'] | ||
274 | self.assertEqual(uri.query, test['query']) | ||
275 | |||
246 | self.assertEqual(str(uri), test['uri']) | 276 | self.assertEqual(str(uri), test['uri']) |
247 | 277 | ||
248 | uri.params = {} | 278 | uri.params = {} |