comparison jb2_webserver.py @ 48:460d5b6c5d98 draft

planemo upload for repository https://github.com/usegalaxy-eu/temporary-tools/tree/master/jbrowse2 commit 3a43e9e0ffce0966101203102e769d1ced28618a-dirty
author fubar
date Wed, 06 Mar 2024 10:37:49 +0000
parents 4181e97c70a7
children f350467f9433
comparison
equal deleted inserted replaced
47:3e53204c2419 48:460d5b6c5d98
36 import argparse 36 import argparse
37 import functools 37 import functools
38 import os 38 import os
39 import re 39 import re
40 import socketserver 40 import socketserver
41 import ssl
41 import webbrowser 42 import webbrowser
42 from http.server import SimpleHTTPRequestHandler 43 from http.server import SimpleHTTPRequestHandler
43 44
44 45
45 DEFAULT_PORT = 8081 46 DEFAULT_PORT = 8443
46 47
47 48
48 def copy_byte_range(infile, outfile, start=None, stop=None, bufsize=16 * 1024): 49 def copy_byte_range(infile, outfile, start=None, stop=None, bufsize=16 * 1024):
49 """Like shutil.copyfileobj, but only copy a range of the streams. 50 """Like shutil.copyfileobj, but only copy a range of the streams.
50 51
151 152
152 153
153 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): 154 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
154 allow_reuse_address = True 155 allow_reuse_address = True
155 156
157 def server_bind(self):
158 ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
159 ctx.load_cert_chain('cert.pem', 'key.pem')
160 socketserver.TCPServer.server_bind(self)
161 self.socket = ctx.wrap_socket( self.socket, server_hostname = "127.0.0.1", server_side=False,)
162
163
164 def get_request(self):
165 (socket, addr) = socketserver.TCPServer.get_request(self)
166 socket.do_handshake()
167 return (socket, addr)
156 168
157 if __name__ == "__main__": 169 if __name__ == "__main__":
158 parser = argparse.ArgumentParser( 170 parser = argparse.ArgumentParser(
159 description="Tiny Python Web Server supporting range requests, for local viewing of unzipped Galaxy JBrowse2 configurations" 171 description="Tiny Python Web Server supporting range requests, for local viewing of unzipped Galaxy JBrowse2 configurations"
160 ) 172 )
169 default=DEFAULT_PORT, 181 default=DEFAULT_PORT,
170 help=f"Port to listen on (default: {DEFAULT_PORT})", 182 help=f"Port to listen on (default: {DEFAULT_PORT})",
171 ) 183 )
172 parser.add_argument( 184 parser.add_argument(
173 "--bind", 185 "--bind",
174 default="0.0.0.0", 186 default="127.0.0.1",
175 help="IP address to bind to (default: 0.0.0.0)", 187 help="IP address to bind to (default: 127.0.0.1)",
176 ) 188 )
177 args = parser.parse_args() 189 args = parser.parse_args()
178 190
179 handler = functools.partial(RangeRequestHandler, directory=args.root) 191 handler = functools.partial(RangeRequestHandler, directory=args.root)
180 192
181 webbrowser.open(f"http://{args.bind}:{args.port}") 193 webbrowser.open(f"https://{args.bind}:{args.port}")
182 194
183 with ThreadedTCPServer((args.bind, args.port), handler) as httpd: 195 with ThreadedTCPServer((args.bind, args.port), handler) as httpd:
184 print( 196 print(
185 f"Serving HTTP on {args.bind} port {args.port} (http://{args.bind}:{args.port}/)" 197 f"Serving HTTPS on {args.bind} port {args.port} (https://{args.bind}:{args.port}/)"
186 ) 198 )
187 httpd.serve_forever() 199 httpd.serve_forever()