Initial Dever 0.0.1
This commit is contained in:
commit
81233d098c
1479 files changed
+163782
No files matched your search
@@ -0,0 +1,61 @@
|
||||
"""仅为安装验收控制下载边界;工具链内容仍来自官方源。"""
|
||||
|
||||
from functools import partial
|
||||
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
|
||||
from pathlib import Path
|
||||
import threading
|
||||
import time
|
||||
|
||||
|
||||
WORK = Path('/work')
|
||||
lock = threading.Lock()
|
||||
active = 0
|
||||
|
||||
|
||||
class Handler(SimpleHTTPRequestHandler):
|
||||
def do_GET(self):
|
||||
global active
|
||||
environment = self.path.startswith(('/dist/', '/dever-native-'))
|
||||
if environment and (WORK / 'reject-environment').exists():
|
||||
self.send_error(404, 'intentional preparation failure')
|
||||
return
|
||||
archive = environment and self.path.endswith('.tar.xz')
|
||||
if archive:
|
||||
with lock:
|
||||
active += 1
|
||||
if active >= 2:
|
||||
(WORK / 'parallel-downloads').touch()
|
||||
try:
|
||||
while (WORK / 'hold-environment').exists():
|
||||
time.sleep(0.1)
|
||||
self.download()
|
||||
finally:
|
||||
with lock:
|
||||
active -= 1
|
||||
else:
|
||||
self.download()
|
||||
|
||||
def download(self):
|
||||
if self.path.startswith('/dist/'):
|
||||
self.send_response(302)
|
||||
self.send_header('Location', 'https://static.rust-lang.org' + self.path)
|
||||
self.end_headers()
|
||||
return
|
||||
resume = self.headers.get('Range')
|
||||
if resume and self.path.startswith('/dever-native-'):
|
||||
offset = int(resume.removeprefix('bytes=').removesuffix('-'))
|
||||
path = Path(self.translate_path(self.path))
|
||||
size = path.stat().st_size
|
||||
(WORK / 'resumed-offset').write_text(str(offset))
|
||||
self.send_response(206)
|
||||
self.send_header('Content-Range', f'bytes {offset}-{size - 1}/{size}')
|
||||
self.send_header('Content-Length', str(size - offset))
|
||||
self.end_headers()
|
||||
with path.open('rb') as source:
|
||||
source.seek(offset)
|
||||
self.copyfile(source, self.wfile)
|
||||
return
|
||||
super().do_GET()
|
||||
|
||||
|
||||
ThreadingHTTPServer(('127.0.0.1', 18080), partial(Handler, directory='/work/assets')).serve_forever()
|
||||
Reference in new issue
Block a user