forked from pygame-web/pygbag
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathweb.py
109 lines (85 loc) · 2.7 KB
/
web.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import os
import os.path
import urllib
import urllib.request
import time
from pathlib import Path
try:
import ssl
except:
class ssl:
SSLCertVerificationError = urllib.error.URLError
import sys
import ssl
# https://stackoverflow.com/questions/42098126/mac-osx-python-ssl-sslerror-ssl-certificate-verify-failed-certificate-verify
def fixcert():
wd = os.getcwd()
import stat
import subprocess
STAT_0o775 = (
stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH
)
openssl_dir, openssl_cafile = os.path.split(ssl.get_default_verify_paths().openssl_cafile)
try:
import certifi
except:
print("running : pip install --user --upgrade certifi")
subprocess.check_call(
[
sys.executable,
"-E",
"-s",
"-m",
"pip",
"install",
"--user",
"--upgrade",
"certifi",
]
)
import certifi
# change working directory to the default SSL directory
os.chdir(openssl_dir)
relpath_to_certifi_cafile = os.path.relpath(certifi.where())
print(" -- removing any existing file or link")
try:
os.remove(openssl_cafile)
except FileNotFoundError:
pass
print(" -- creating symlink to certifi certificate bundle")
os.symlink(relpath_to_certifi_cafile, openssl_cafile)
print(" -- setting permissions")
os.chmod(openssl_cafile, STAT_0o775)
os.chdir(wd)
print(" -- update complete")
def get(url, path):
error = None
data_file = None
try:
print(f'urllib.request.urlretrieve("{url}", "{path}")')
while data_file is None:
try:
data_file, header = urllib.request.urlretrieve(url, path)
except urllib.error.HTTPError as e:
error = e
except urllib.error.URLError as e:
error = e
except ssl.SSLCertVerificationError:
print("Trying to fix certificate error")
fixcert()
continue
if data_file is not None:
break
if error:
print(f"WARNING: web.get({url}) : {error}")
time.sleep(5)
print("retrying in 5 seconds")
finally:
if data_file is not None:
return Path(data_file), header
# this is normal in dev mode for favicon and templates because
# proxy is not yet started.
print(f"NO DATA RECEIVED FOR {url}")
raise Exception(f"cannot cache {url} to {path}")
if __name__ == "__main__":
fixcert()