2018-08-15 19:08:03 -04:00
|
|
|
#!/usr/bin/env python
|
2019-01-21 14:03:30 -05:00
|
|
|
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
2018-08-15 19:08:03 -04:00
|
|
|
# Many tests expect there to be an http server on port 4545 servering the deno
|
|
|
|
# root directory.
|
|
|
|
import os
|
2018-10-16 11:54:08 -04:00
|
|
|
import sys
|
2018-08-15 19:08:03 -04:00
|
|
|
from threading import Thread
|
|
|
|
import SimpleHTTPServer
|
|
|
|
import SocketServer
|
|
|
|
from util import root_path
|
|
|
|
from time import sleep
|
|
|
|
|
|
|
|
PORT = 4545
|
2018-10-09 20:31:06 -04:00
|
|
|
REDIRECT_PORT = 4546
|
2019-04-01 21:46:40 -04:00
|
|
|
ANOTHER_REDIRECT_PORT = 4547
|
|
|
|
DOUBLE_REDIRECTS_PORT = 4548
|
2018-08-15 19:08:03 -04:00
|
|
|
|
|
|
|
|
2018-10-21 22:14:27 -04:00
|
|
|
class ContentTypeHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
2018-12-21 17:09:53 -05:00
|
|
|
def do_GET(self):
|
|
|
|
if "multipart_form_data.txt" in self.path:
|
|
|
|
self.protocol_version = 'HTTP/1.1'
|
|
|
|
self.send_response(200, 'OK')
|
|
|
|
self.send_header('Content-type',
|
|
|
|
'multipart/form-data;boundary=boundary')
|
|
|
|
self.end_headers()
|
|
|
|
self.wfile.write(
|
|
|
|
bytes('Preamble\r\n'
|
|
|
|
'--boundary\t \r\n'
|
|
|
|
'Content-Disposition: form-data; name="field_1"\r\n'
|
|
|
|
'\r\n'
|
|
|
|
'value_1 \r\n'
|
|
|
|
'\r\n--boundary\r\n'
|
|
|
|
'Content-Disposition: form-data; name="field_2"; '
|
|
|
|
'filename="file.js"\r\n'
|
|
|
|
'Content-Type: text/javascript\r\n'
|
|
|
|
'\r\n'
|
|
|
|
'console.log("Hi")'
|
|
|
|
'\r\n--boundary--\r\n'
|
|
|
|
'Epilogue'))
|
|
|
|
return
|
|
|
|
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
|
|
|
|
|
2019-01-03 06:41:20 -05:00
|
|
|
def do_POST(self):
|
|
|
|
# Simple echo server for request reflection
|
|
|
|
if "echo_server" in self.path:
|
|
|
|
self.protocol_version = 'HTTP/1.1'
|
|
|
|
self.send_response(200, 'OK')
|
|
|
|
if self.headers.has_key('content-type'):
|
|
|
|
self.send_header('content-type',
|
|
|
|
self.headers.getheader('content-type'))
|
|
|
|
self.end_headers()
|
|
|
|
data_string = self.rfile.read(int(self.headers['Content-Length']))
|
|
|
|
self.wfile.write(bytes(data_string))
|
|
|
|
return
|
|
|
|
self.protocol_version = 'HTTP/1.1'
|
|
|
|
self.send_response(501)
|
|
|
|
self.send_header('content-type', 'text/plain')
|
|
|
|
self.end_headers()
|
|
|
|
self.wfile.write(bytes('Server does not support this operation'))
|
|
|
|
|
2018-10-21 22:14:27 -04:00
|
|
|
def guess_type(self, path):
|
|
|
|
if ".t1." in path:
|
|
|
|
return "text/typescript"
|
|
|
|
if ".t2." in path:
|
|
|
|
return "video/vnd.dlna.mpeg-tts"
|
|
|
|
if ".t3." in path:
|
|
|
|
return "video/mp2t"
|
2018-10-27 20:26:42 -04:00
|
|
|
if ".t4." in path:
|
|
|
|
return "application/x-typescript"
|
2018-10-21 22:14:27 -04:00
|
|
|
if ".j1." in path:
|
|
|
|
return "text/javascript"
|
|
|
|
if ".j2." in path:
|
|
|
|
return "application/ecmascript"
|
|
|
|
if ".j3." in path:
|
|
|
|
return "text/ecmascript"
|
|
|
|
if ".j4." in path:
|
|
|
|
return "application/x-javascript"
|
2018-12-21 17:09:53 -05:00
|
|
|
if "form_urlencoded" in path:
|
|
|
|
return "application/x-www-form-urlencoded"
|
2018-12-27 15:40:06 -05:00
|
|
|
if "no_ext" in path:
|
|
|
|
return "text/typescript"
|
|
|
|
if "unknown_ext" in path:
|
|
|
|
return "text/typescript"
|
|
|
|
if "mismatch_ext" in path:
|
|
|
|
return "text/javascript"
|
2018-10-21 22:14:27 -04:00
|
|
|
return SimpleHTTPServer.SimpleHTTPRequestHandler.guess_type(self, path)
|
|
|
|
|
|
|
|
|
2018-09-25 21:39:04 -04:00
|
|
|
def server():
|
2018-08-15 19:08:03 -04:00
|
|
|
os.chdir(root_path) # Hopefully the main thread doesn't also chdir.
|
2018-10-21 22:14:27 -04:00
|
|
|
Handler = ContentTypeHandler
|
|
|
|
Handler.extensions_map.update({
|
|
|
|
".ts": "application/typescript",
|
|
|
|
".js": "application/javascript",
|
|
|
|
".json": "application/json",
|
|
|
|
})
|
2018-08-23 20:03:45 -04:00
|
|
|
SocketServer.TCPServer.allow_reuse_address = True
|
2018-09-25 21:39:04 -04:00
|
|
|
s = SocketServer.TCPServer(("", PORT), Handler)
|
2018-08-15 19:08:03 -04:00
|
|
|
print "Deno test server http://localhost:%d/" % PORT
|
2018-09-25 21:39:04 -04:00
|
|
|
return s
|
2018-08-15 19:08:03 -04:00
|
|
|
|
|
|
|
|
2019-04-01 21:46:40 -04:00
|
|
|
def base_redirect_server(host_port, target_port, extra_path_segment=""):
|
2018-10-09 20:31:06 -04:00
|
|
|
os.chdir(root_path)
|
2019-04-01 21:46:40 -04:00
|
|
|
target_host = "http://localhost:%d" % target_port
|
2018-10-09 20:31:06 -04:00
|
|
|
|
|
|
|
class RedirectHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
|
|
|
def do_GET(self):
|
|
|
|
self.send_response(301)
|
2019-04-01 21:46:40 -04:00
|
|
|
self.send_header('Location',
|
|
|
|
target_host + extra_path_segment + self.path)
|
2018-10-09 20:31:06 -04:00
|
|
|
self.end_headers()
|
|
|
|
|
|
|
|
Handler = RedirectHandler
|
|
|
|
SocketServer.TCPServer.allow_reuse_address = True
|
2019-04-01 21:46:40 -04:00
|
|
|
s = SocketServer.TCPServer(("", host_port), Handler)
|
2018-11-30 03:27:41 -05:00
|
|
|
print "redirect server http://localhost:%d/ -> http://localhost:%d/" % (
|
2019-04-01 21:46:40 -04:00
|
|
|
host_port, target_port)
|
2018-10-09 20:31:06 -04:00
|
|
|
return s
|
|
|
|
|
|
|
|
|
2019-04-01 21:46:40 -04:00
|
|
|
# redirect server
|
|
|
|
def redirect_server():
|
|
|
|
return base_redirect_server(REDIRECT_PORT, PORT)
|
|
|
|
|
|
|
|
|
|
|
|
# another redirect server pointing to the same port as the one above
|
|
|
|
# BUT with an extra subdir path
|
|
|
|
def another_redirect_server():
|
|
|
|
return base_redirect_server(
|
|
|
|
ANOTHER_REDIRECT_PORT, PORT, extra_path_segment="/tests/subdir")
|
|
|
|
|
|
|
|
|
|
|
|
# redirect server that points to another redirect server
|
|
|
|
def double_redirects_server():
|
|
|
|
return base_redirect_server(DOUBLE_REDIRECTS_PORT, REDIRECT_PORT)
|
|
|
|
|
|
|
|
|
2018-08-15 19:08:03 -04:00
|
|
|
def spawn():
|
2018-10-09 20:31:06 -04:00
|
|
|
# Main http server
|
2018-09-25 21:39:04 -04:00
|
|
|
s = server()
|
|
|
|
thread = Thread(target=s.serve_forever)
|
2018-08-15 19:08:03 -04:00
|
|
|
thread.daemon = True
|
|
|
|
thread.start()
|
2018-10-09 20:31:06 -04:00
|
|
|
# Redirect server
|
|
|
|
rs = redirect_server()
|
|
|
|
r_thread = Thread(target=rs.serve_forever)
|
|
|
|
r_thread.daemon = True
|
|
|
|
r_thread.start()
|
2019-04-01 21:46:40 -04:00
|
|
|
# Another redirect server
|
|
|
|
ars = another_redirect_server()
|
|
|
|
ar_thread = Thread(target=ars.serve_forever)
|
|
|
|
ar_thread.daemon = True
|
|
|
|
ar_thread.start()
|
|
|
|
# Double redirects server
|
|
|
|
drs = double_redirects_server()
|
|
|
|
dr_thread = Thread(target=drs.serve_forever)
|
|
|
|
dr_thread.daemon = True
|
|
|
|
dr_thread.start()
|
2018-08-15 19:08:03 -04:00
|
|
|
sleep(1) # TODO I'm too lazy to figure out how to do this properly.
|
2018-10-19 22:15:29 -04:00
|
|
|
return thread
|
2018-08-15 19:08:03 -04:00
|
|
|
|
|
|
|
|
2018-11-30 03:27:41 -05:00
|
|
|
def main():
|
2018-10-16 11:54:08 -04:00
|
|
|
try:
|
2018-10-19 22:15:29 -04:00
|
|
|
thread = spawn()
|
|
|
|
while thread.is_alive():
|
|
|
|
sleep(10)
|
2018-10-16 11:54:08 -04:00
|
|
|
except KeyboardInterrupt:
|
2018-10-19 22:15:29 -04:00
|
|
|
pass
|
|
|
|
sys.exit(1)
|
2018-11-30 03:27:41 -05:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|