diff options
-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 5c6180b..d9d193a 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py @@ -162,6 +162,7 @@ class URI(object): * path_quoted (read/write) A URI quoted version of path * params (dict) (read/write) + * query (dict) (read/write) * relative (bool) (read only) True if this is a "relative URI", (e.g. file:foo.diff) @@ -201,6 +202,7 @@ class URI(object): self.port = None self._path = '' self.params = {} + self.query = {} self.relative = False if not uri: @@ -253,36 +255,42 @@ class URI(object): self.path = urllib.unquote(path) if param_str: - self.params = self._param_dict(param_str) + self.params = self._param_str_split(param_str, ";") + if urlp.query: + self.query = self._param_str_split(urlp.query, "&") def __str__(self): userinfo = self.userinfo if userinfo: userinfo += '@' - return "%s:%s%s%s%s%s" % ( + return "%s:%s%s%s%s%s%s" % ( self.scheme, '' if self.relative else '//', userinfo, self.hostport, self.path_quoted, - self._param_str) + self._query_str(), + self._param_str()) - @property def _param_str(self): - ret = '' - for key, val in self.params.items(): - ret += ";%s=%s" % (key, val) + return ( + ''.join([';', self._param_str_join(self.params, ";")]) + if self.params else '') + + def _query_str(self): + return ( + ''.join(['?', self._param_str_join(self.query, "&")]) + if self.query else '') + + def _param_str_split(self, string, elmdelim, kvdelim="="): + ret = {} + for k, v in [x.split(kvdelim, 1) for x in string.split(elmdelim)]: + ret[k] = v return ret - def _param_dict(self, param_str): - parm = {} - - for keyval in param_str.split(";"): - key, val = keyval.split("=", 1) - parm[key] = val - - return parm + def _param_str_join(self, dict_, elmdelim, kvdelim="="): + return elmdelim.join([kvdelim.join([k, v]) for k, v in dict_.items()]) @property def hostport(self): diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py index f93a636..15fe0ab 100644 --- a/bitbake/lib/bb/tests/fetch.py +++ b/bitbake/lib/bb/tests/fetch.py @@ -39,6 +39,7 @@ class URITest(unittest.TestCase): 'username': '', 'password': '', 'params': {}, + 'query': {}, 'relative': False }, "http://www.google.com/index.html;param1=value1" : { @@ -54,6 +55,23 @@ class URITest(unittest.TestCase): 'params': { 'param1': 'value1' }, + 'query': {}, + 'relative': False + }, + "http://www.example.org/index.html?param1=value1" : { + 'uri': 'http://www.example.org/index.html?param1=value1', + 'scheme': 'http', + 'hostname': 'www.example.org', + 'port': None, + 'hostport': 'www.example.org', + 'path': '/index.html', + 'userinfo': '', + 'username': '', + 'password': '', + 'params': {}, + 'query': { + 'param1': 'value1' + }, 'relative': False }, "http://www.example.com:8080/index.html" : { @@ -67,6 +85,7 @@ class URITest(unittest.TestCase): 'username': '', 'password': '', 'params': {}, + 'query': {}, 'relative': False }, "cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg" : { @@ -82,6 +101,7 @@ class URITest(unittest.TestCase): 'params': { 'module': 'familiar/dist/ipkg' }, + 'query': {}, 'relative': False }, "cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg": { @@ -98,6 +118,7 @@ class URITest(unittest.TestCase): 'tag': 'V0-99-81', 'module': 'familiar/dist/ipkg' }, + 'query': {}, 'relative': False }, "file://example.diff": { # NOTE: Not RFC compliant! @@ -111,6 +132,7 @@ class URITest(unittest.TestCase): 'username': '', 'password': '', 'params': {}, + 'query': {}, 'relative': True }, "file:example.diff": { # NOTE: RFC compliant version of the former @@ -125,6 +147,7 @@ class URITest(unittest.TestCase): 'username': '', 'password': '', 'params': {}, + 'query': {}, 'relative': True }, "file:///tmp/example.diff": { @@ -139,6 +162,7 @@ class URITest(unittest.TestCase): 'username': '', 'password': '', 'params': {}, + 'query': {}, 'relative': False }, "git:///path/example.git": { @@ -153,6 +177,7 @@ class URITest(unittest.TestCase): 'username': '', 'password': '', 'params': {}, + 'query': {}, 'relative': False }, "git:path/example.git": { @@ -167,6 +192,7 @@ class URITest(unittest.TestCase): 'username': '', 'password': '', 'params': {}, + 'query': {}, 'relative': True }, "git://example.net/path/example.git": { @@ -181,6 +207,7 @@ class URITest(unittest.TestCase): 'username': '', 'password': '', 'params': {}, + 'query': {}, 'relative': False } } @@ -243,6 +270,9 @@ class URITest(unittest.TestCase): uri.params = test['params'] self.assertEqual(uri.params, test['params']) + uri.query = test['query'] + self.assertEqual(uri.query, test['query']) + self.assertEqual(str(uri), test['uri']) uri.params = {} |