diff options
| author | Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com> | 2025-02-07 13:46:53 +0100 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2025-02-11 21:18:39 +0000 |
| commit | 2935d76bb468e576ab6219fa352968f2835f4ab8 (patch) | |
| tree | 0c529b6c91186be3c35de8a3156c6db7762d2c66 /bitbake/lib/bb/fetch2 | |
| parent | 851b24cf818e1786efe15f4ca3f3d7e0718c0004 (diff) | |
| download | poky-2935d76bb468e576ab6219fa352968f2835f4ab8.tar.gz | |
bitbake: fetch2: remove duplicated code in url decode and encode
Use the URI class to decode and encode an URL. Remove duplicate code and
unify the behavior.
(Bitbake rev: a5d569c94700f04b8193c6bccae5af619931b00f)
Signed-off-by: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/fetch2')
| -rw-r--r-- | bitbake/lib/bb/fetch2/__init__.py | 66 |
1 files changed, 14 insertions, 52 deletions
diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py index ab992b7ea7..2a60e94ed0 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py | |||
| @@ -353,49 +353,9 @@ def decodeurl(url): | |||
| 353 | user, password, parameters). | 353 | user, password, parameters). |
| 354 | """ | 354 | """ |
| 355 | 355 | ||
| 356 | m = re.compile('(?P<type>[^:]*)://((?P<user>[^/;]+)@)?(?P<location>[^;]+)(;(?P<parm>.*))?').match(url) | 356 | uri = URI(url) |
| 357 | if not m: | 357 | path = uri.path if uri.path else "/" |
| 358 | raise MalformedUrl(url) | 358 | return uri.scheme, uri.hostport, path, uri.username, uri.password, uri.params |
| 359 | |||
| 360 | type = m.group('type') | ||
| 361 | location = m.group('location') | ||
| 362 | if not location: | ||
| 363 | raise MalformedUrl(url) | ||
| 364 | user = m.group('user') | ||
| 365 | parm = m.group('parm') | ||
| 366 | |||
| 367 | locidx = location.find('/') | ||
| 368 | if locidx != -1 and type.lower() != 'file': | ||
| 369 | host = location[:locidx] | ||
| 370 | path = location[locidx:] | ||
| 371 | elif type.lower() == 'file': | ||
| 372 | host = "" | ||
| 373 | path = location | ||
| 374 | if user: | ||
| 375 | path = user + '@' + path | ||
| 376 | user = "" | ||
| 377 | else: | ||
| 378 | host = location | ||
| 379 | path = "/" | ||
| 380 | if user: | ||
| 381 | m = re.compile('(?P<user>[^:]+)(:?(?P<pswd>.*))').match(user) | ||
| 382 | if m: | ||
| 383 | user = m.group('user') | ||
| 384 | pswd = m.group('pswd') | ||
| 385 | else: | ||
| 386 | user = '' | ||
| 387 | pswd = '' | ||
| 388 | |||
| 389 | p = collections.OrderedDict() | ||
| 390 | if parm: | ||
| 391 | for s in parm.split(';'): | ||
| 392 | if s: | ||
| 393 | if not '=' in s: | ||
| 394 | raise MalformedUrl(url, "The URL: '%s' is invalid: parameter %s does not specify a value (missing '=')" % (url, s)) | ||
| 395 | s1, s2 = s.split('=', 1) | ||
| 396 | p[s1] = s2 | ||
| 397 | |||
| 398 | return type, host, urllib.parse.unquote(path), user, pswd, p | ||
| 399 | 359 | ||
| 400 | def encodeurl(decoded): | 360 | def encodeurl(decoded): |
| 401 | """Encodes a URL from tokens (scheme, network location, path, | 361 | """Encodes a URL from tokens (scheme, network location, path, |
| @@ -406,24 +366,26 @@ def encodeurl(decoded): | |||
| 406 | 366 | ||
| 407 | if not type: | 367 | if not type: |
| 408 | raise MissingParameterError('type', "encoded from the data %s" % str(decoded)) | 368 | raise MissingParameterError('type', "encoded from the data %s" % str(decoded)) |
| 409 | url = ['%s://' % type] | 369 | uri = URI() |
| 370 | uri.scheme = type | ||
| 410 | if user and type != "file": | 371 | if user and type != "file": |
| 411 | url.append("%s" % user) | 372 | uri.username = user |
| 412 | if pswd: | 373 | if pswd: |
| 413 | url.append(":%s" % pswd) | 374 | uri.password = pswd |
| 414 | url.append("@") | ||
| 415 | if host and type != "file": | 375 | if host and type != "file": |
| 416 | url.append("%s" % host) | 376 | uri.hostname = host |
| 417 | if path: | 377 | if path: |
| 418 | # Standardise path to ensure comparisons work | 378 | # Standardise path to ensure comparisons work |
| 419 | while '//' in path: | 379 | while '//' in path: |
| 420 | path = path.replace("//", "/") | 380 | path = path.replace("//", "/") |
| 421 | url.append("%s" % urllib.parse.quote(path)) | 381 | uri.path = path |
| 382 | if type == "file": | ||
| 383 | # Use old not IETF compliant style | ||
| 384 | uri.relative = False | ||
| 422 | if p: | 385 | if p: |
| 423 | for parm in p: | 386 | uri.params = p |
| 424 | url.append(";%s=%s" % (parm, p[parm])) | ||
| 425 | 387 | ||
| 426 | return "".join(url) | 388 | return str(uri) |
| 427 | 389 | ||
| 428 | def uri_replace(ud, uri_find, uri_replace, replacements, d, mirrortarball=None): | 390 | def uri_replace(ud, uri_find, uri_replace, replacements, d, mirrortarball=None): |
| 429 | if not ud.url or not uri_find or not uri_replace: | 391 | if not ud.url or not uri_find or not uri_replace: |
