-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.py
71 lines (57 loc) · 2.49 KB
/
server.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
#!/usr/bin/env python3
# Demo of bottle + gevent.
# Based on https://bottlepy.org/docs/dev/async.html
import os, sys, uuid, logging
logging.basicConfig(level=logging.DEBUG)
from gevent import monkey; monkey.patch_all()
from bottle import route, request, run, static_file, HTTPError
# The following functions serve the parts of the experiment:
# The @route part specified the path in the URL used in the browser.
# The subsequent functions locates and loads the data from the hard
# drive.
@route('/')
def experiment():
return static_file("experiment.html", root='')
@route('/<filename:re:.+\.(js|tsv|png|css|html)>')
def send_assets(filename):
return static_file(filename, root=os.getcwd())
# The function below stores the collected data in directory `data`
# with a random filename following the pattern `results_XYZ.csv`.
# Accept no more than max_data bytes in POST requests:
max_data = 1024 * 5000
@route('/store', method="POST")
def store():
b = request.body
filedata = b.read(max_data).decode()
# If we can read more, they payload was too large:
if len(b.read(1)) != 0:
raise HTTPError(413, "Too much data. Please contact the person conducting the experiment.")
if os.path.exists("data"):
if not os.path.isdir("data"):
raise HTTPError(500, "A file named 'data' exists where a directory with that name is expected. Please contact the person conducting the experiment.")
else:
os.mkdir("data")
filename = f"data/results_{uuid.uuid4()}.csv"
try:
with open(filename, "w") as f:
f.write(filedata)
except Exception as e:
logging.error(str(e))
raise HTTPError(500, "Could not store data. Please contact the person conducting the experiment.")
else:
logging.info(" Wrote file " + filename)
return "Your data has been recorded.</br>You may now close the browser window."
try:
if os.path.exists("cert.pem") and os.path.exists("key.pem"):
print("Starting encrypted server on port 433 ...")
run(host='0.0.0.0', port=443, server='gevent', certfile='cert.pem', keyfile='key.pem')
else:
print("Starting unencrypted server on port 80 ...")
run(host='0.0.0.0', port=80, server='gevent')
except OSError as err:
if err.args[0] == 98:
print("ERROR: The IP address is already in use. Another experiment may already be running. End other process and try again.", file=sys.stderr)
else:
print(err, file=sys.stderr)
os.remove("nohup.pid")
sys.exit(-1)