Project

General

Profile

« Previous | Next » 

Revision c19f51da

Added by David Sorber over 7 years ago

Adding command server prototype. Clean shutdown does not work properly, need to figure that out.

View differences:

software/hbkcd/server.py
#!/usr/bin/python3
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
from multiprocessing import Process
import sys
import time
# https://blog.gocept.com/2011/08/04/shutting-down-an-httpserver/
# https://docs.aws.amazon.com/polly/latest/dg/example-Python-server-code.html
class CommandServer(Process):
def __init__(self):
Process.__init__(self)
self.server_address = ('127.0.0.1', 8081)
self.httpd = HTTPServer(self.server_address, CommandHandler)
self.keep_running = True
def stop(self):
print('stop called')
self.keep_running = False
# ~ if self.httpd:
# ~ print('pre shutdown')
# ~ self.httpd.shutdown()
# ~ print('post shutdown')
self.httpd.shutdown()
self.httpd.socket.close()
# ~ self.httpd.server_close()
print('stop returning')
def run(self):
print('command server running')
# ~ while self.keep_running:
self.httpd.serve_forever()
# ~ while self.keep_running:
# ~ self.httpd.handle_request()
print('command server stopping')
# HTTPRequestHandler class
class CommandHandler(BaseHTTPRequestHandler):
# GET
def do_GET(self):
# Strip off leading and/or trailing slashes
path = self.path.strip('/')
# Defaults
response_code = 400
response_type = 'text/html'
response_data = ''
# Send response status code
if path == 'queue':
response_code = 200
response_dict = {'queue': ['alpha', 'bravo', 'charlie']}
response_data = json.dumps(response_dict).encode()
elif not path:
response_code = 200
response = 'Why hello there'
response_data = response.encode('utf-8')
# Send response and data, if any
self.send_response(response_code)
if response_data:
self.send_header('Content-type', response_type)
self.end_headers()
if response_data:
self.wfile.write(response_data)
return
def main():
print('starting server...')
# Server settings
# Choose port 8080, for port 80, which is normally used for a http server,
# you need root access
# ~ server_address = ('127.0.0.1', 8081)
# ~ httpd = HTTPServer(server_address, CommandHandler)
# ~ print('running server...')
# ~ httpd.serve_forever()
cmd_server = CommandServer()
cmd_server.start()
# Run for a while
for idx in range(20):
print(idx)
time.sleep(1)
# Simluate a clean shutdown
cmd_server.stop()
print('post stop')
cmd_server.join()
print('fin')
if __name__ == '__main__':
sys.exit(main())

Also available in: Unified diff