File size: 1,947 Bytes
8dd0d51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Serve the demo locally, supporting byte ranges used by model metadata probes."""
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path
import os
import re

os.chdir(Path(__file__).resolve().parent.parent)


class Handler(SimpleHTTPRequestHandler):
    def send_head(self):
        self.byte_range=None
        path=Path(self.translate_path(self.path))
        match=re.fullmatch(r'bytes=(\d+)-(\d*)',self.headers.get('Range',''))
        if match and path.is_file():
            size=path.stat().st_size
            start=int(match[1]);end=min(int(match[2]) if match[2] else size-1,size-1)
            if start>=size or end<start:
                self.send_response(416);self.send_header('Content-Range',f'bytes */{size}');self.end_headers();return None
            f=path.open('rb');f.seek(start);self.byte_range=end-start+1
            self.send_response(206)
            self.send_header('Content-Type',self.guess_type(str(path)))
            self.send_header('Content-Range',f'bytes {start}-{end}/{size}')
            self.send_header('Content-Length',str(end-start+1));self.end_headers();return f
        return super().send_head()

    def end_headers(self):
        self.send_header('Accept-Ranges','bytes')
        super().end_headers()

    def copyfile(self,source,outputfile):
        try:
            remaining=self.byte_range
            if remaining is None:return super().copyfile(source,outputfile)
            while remaining:
                data=source.read(min(1024*1024,remaining))
                if not data:break
                outputfile.write(data);remaining-=len(data)
        except (BrokenPipeError,ConnectionResetError):pass

    def log_message(self,format,*args):
        if args and str(args[1]) not in ('200','206'):super().log_message(format,*args)


print('Open http://127.0.0.1:8765/web/',flush=True)
ThreadingHTTPServer(('127.0.0.1',8765),Handler).serve_forever()