diff options
| author | Enrico Scholz <enrico.scholz@sigma-chemnitz.de> | 2021-08-18 19:16:22 +0200 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-08-23 08:30:54 +0100 |
| commit | e8182a794da04212e8815c1cb6d01f4f7744424f (patch) | |
| tree | 3745f556537c8c6f77cdf5b0d29503075acc54e6 | |
| parent | f113446f417711e652a01907ba14fc513861131e (diff) | |
| download | poky-e8182a794da04212e8815c1cb6d01f4f7744424f.tar.gz | |
bitbake: fetch2/wget: fix 'no_proxy' handling
The urllib.request.ProxyHandler constructor only reads the $http_proxy
+ $https_proxy environment variables.
$no_proxy is evaluated later when the url is opened.
It is therefore not sufficient to just construct the proxy handler in
the
| with bb.utils.environment(**newenv):
context, but the 'opener.open(r)' call must also be made there.
(Bitbake rev: 076baf4fbd328d247508fd399866a397eb34f67e)
Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
| -rw-r--r-- | bitbake/lib/bb/fetch2/wget.py | 87 |
1 files changed, 44 insertions, 43 deletions
diff --git a/bitbake/lib/bb/fetch2/wget.py b/bitbake/lib/bb/fetch2/wget.py index 29fcfbb3d1..9a49e64a00 100644 --- a/bitbake/lib/bb/fetch2/wget.py +++ b/bitbake/lib/bb/fetch2/wget.py | |||
| @@ -330,50 +330,51 @@ class Wget(FetchMethod): | |||
| 330 | urllib.request.HTTPSHandler(context=context)] | 330 | urllib.request.HTTPSHandler(context=context)] |
| 331 | opener = urllib.request.build_opener(*handlers) | 331 | opener = urllib.request.build_opener(*handlers) |
| 332 | 332 | ||
| 333 | try: | ||
| 334 | uri = ud.url.split(";")[0] | ||
| 335 | r = urllib.request.Request(uri) | ||
| 336 | r.get_method = lambda: "HEAD" | ||
| 337 | # Some servers (FusionForge, as used on Alioth) require that the | ||
| 338 | # optional Accept header is set. | ||
| 339 | r.add_header("Accept", "*/*") | ||
| 340 | r.add_header("User-Agent", self.user_agent) | ||
| 341 | def add_basic_auth(login_str, request): | ||
| 342 | '''Adds Basic auth to http request, pass in login:password as string''' | ||
| 343 | import base64 | ||
| 344 | encodeuser = base64.b64encode(login_str.encode('utf-8')).decode("utf-8") | ||
| 345 | authheader = "Basic %s" % encodeuser | ||
| 346 | r.add_header("Authorization", authheader) | ||
| 347 | |||
| 348 | if ud.user and ud.pswd: | ||
| 349 | add_basic_auth(ud.user + ':' + ud.pswd, r) | ||
| 350 | |||
| 351 | try: | 333 | try: |
| 352 | import netrc | 334 | uri = ud.url.split(";")[0] |
| 353 | n = netrc.netrc() | 335 | r = urllib.request.Request(uri) |
| 354 | login, unused, password = n.authenticators(urllib.parse.urlparse(uri).hostname) | 336 | r.get_method = lambda: "HEAD" |
| 355 | add_basic_auth("%s:%s" % (login, password), r) | 337 | # Some servers (FusionForge, as used on Alioth) require that the |
| 356 | except (TypeError, ImportError, IOError, netrc.NetrcParseError): | 338 | # optional Accept header is set. |
| 357 | pass | 339 | r.add_header("Accept", "*/*") |
| 358 | 340 | r.add_header("User-Agent", self.user_agent) | |
| 359 | with opener.open(r) as response: | 341 | def add_basic_auth(login_str, request): |
| 360 | pass | 342 | '''Adds Basic auth to http request, pass in login:password as string''' |
| 361 | except urllib.error.URLError as e: | 343 | import base64 |
| 362 | if try_again: | 344 | encodeuser = base64.b64encode(login_str.encode('utf-8')).decode("utf-8") |
| 363 | logger.debug2("checkstatus: trying again") | 345 | authheader = "Basic %s" % encodeuser |
| 364 | return self.checkstatus(fetch, ud, d, False) | 346 | r.add_header("Authorization", authheader) |
| 365 | else: | 347 | |
| 366 | # debug for now to avoid spamming the logs in e.g. remote sstate searches | 348 | if ud.user and ud.pswd: |
| 367 | logger.debug2("checkstatus() urlopen failed: %s" % e) | 349 | add_basic_auth(ud.user + ':' + ud.pswd, r) |
| 368 | return False | 350 | |
| 369 | except ConnectionResetError as e: | 351 | try: |
| 370 | if try_again: | 352 | import netrc |
| 371 | logger.debug2("checkstatus: trying again") | 353 | n = netrc.netrc() |
| 372 | return self.checkstatus(fetch, ud, d, False) | 354 | login, unused, password = n.authenticators(urllib.parse.urlparse(uri).hostname) |
| 373 | else: | 355 | add_basic_auth("%s:%s" % (login, password), r) |
| 374 | # debug for now to avoid spamming the logs in e.g. remote sstate searches | 356 | except (TypeError, ImportError, IOError, netrc.NetrcParseError): |
| 375 | logger.debug2("checkstatus() urlopen failed: %s" % e) | 357 | pass |
| 376 | return False | 358 | |
| 359 | with opener.open(r) as response: | ||
| 360 | pass | ||
| 361 | except urllib.error.URLError as e: | ||
| 362 | if try_again: | ||
| 363 | logger.debug2("checkstatus: trying again") | ||
| 364 | return self.checkstatus(fetch, ud, d, False) | ||
| 365 | else: | ||
| 366 | # debug for now to avoid spamming the logs in e.g. remote sstate searches | ||
| 367 | logger.debug2("checkstatus() urlopen failed: %s" % e) | ||
| 368 | return False | ||
| 369 | except ConnectionResetError as e: | ||
| 370 | if try_again: | ||
| 371 | logger.debug2("checkstatus: trying again") | ||
| 372 | return self.checkstatus(fetch, ud, d, False) | ||
| 373 | else: | ||
| 374 | # debug for now to avoid spamming the logs in e.g. remote sstate searches | ||
| 375 | logger.debug2("checkstatus() urlopen failed: %s" % e) | ||
| 376 | return False | ||
| 377 | |||
| 377 | return True | 378 | return True |
| 378 | 379 | ||
| 379 | def _parse_path(self, regex, s): | 380 | def _parse_path(self, regex, s): |
