Newer
Older
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
import http.server
import socketserver
import urllib.parse as urlparse
from urllib.parse import parse_qs
from importlib.metadata import version
import json
import sys
import traceback
import argparse
import coords
class CoordsHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
try:
if self.path == '/':
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
# Open HTML page and replace placeholders
content = open('index.html', 'r').read()
location_name = coords.get_location_name(location_id)
content = content.replace('#LOCATION_NAME#', location_name)
content = content.replace('#LIB_VERSION#', version('coordslib'))
self.wfile.write(bytes(content, 'utf8'))
return
elif self.path.startswith('/coords'):
# extract 'object' query parameter from URL
parsed = urlparse.urlparse(self.path)
object_name = parse_qs(parsed.query)['object'][0]
# call coords library
result = coords.get_coords(object_name, location_id)
self.send_response(200)
self.send_json_response(result)
return
except Exception as ex:
print(traceback.format_exc(), file=sys.stderr)
# send error response
self.send_response(500)
self.send_json_response({'error': str(ex)})
return
# default server GET implementation (returns file or 404)
return http.server.SimpleHTTPRequestHandler.do_GET(self)
def send_json_response(self, data):
self.send_header('Content-type', 'application/json')
self.end_headers()
# write JSON data in HTTP response body
self.wfile.write(bytes(json.dumps(data) + '\n', 'utf8'))
parser = argparse.ArgumentParser(description='Simple HTTP server that displays a form '
'to get astronomical coordinates for a given location')
parser.add_argument('port', type=int, nargs=1, help='server port')
parser.add_argument('location_id', type=str, nargs=1, help='astropy observatory/site identifier')
args = parser.parse_args()
port = args.port[0]
location_id = args.location_id[0]
# Create an object of the above class
handler_object = CoordsHttpRequestHandler
# Avoid 'address already in use' error on server restart
socketserver.TCPServer.allow_reuse_address = True
coords_server = socketserver.TCPServer(("", port), handler_object)
# Start the server
coords_server.serve_forever()