+def _humanize_bytes(b):
+ b = int(b)
+ i = 0
+ table = " kMGTPEZYRQ"
+ while b > 1024:
+ i += 1
+ b /= 1024.0
+ if i == 0:
+ return "%dB" % (b)
+ else:
+ return "%.2f%siB" % (b, table[i])
+
+def _do_request(url, try_aia=False):
+ """Returns the HTTPResponse object, or a string on error"""
+ request = urllib2.Request(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'})
+ if try_aia:
+ opener = urllib2.build_opener(urllib2.HTTPSHandler(context=aia_session.ssl_context_from_url(url)), SmartRedirectHandler())
+ else:
+ opener = urllib2.build_opener(SmartRedirectHandler())
+
+ # Send request and handle errors
+ try:
+ response = opener.open(request, timeout=2)
+ except urllib2.HTTPError as e:
+ return 'Request error: %s %s' % (e.code, e.reason)
+ except urllib2.URLError as e:
+ if "certificate verify failed: unable to get local issuer certificate" in str(e.reason):
+ if aia: # Retry with AIA enabled
+ return _do_request(url, True)
+ else:
+ lib.parent.log('urls', '?', 'If the site is not serving the certificate chain, installing the aia library might make this request work: pip install aia')
+ return 'Request error: site may have broken TLS configuration (%s)' % (e.reason)
+ else:
+ return 'Request error: %s' % (e.reason)
+ except TimeoutError as e:
+ return 'Request error: request timed out'
+ except Exception as e:
+ return 'Unknown error: %s %r' % (type(e).__name__, e.args)
+
+ return response
+
+