Skip to content

Instantly share code, notes, and snippets.

@robcarrington
Created December 25, 2018 06:46
Show Gist options
  • Select an option

  • Save robcarrington/bce8a532fd55a7f00decd3813b944a06 to your computer and use it in GitHub Desktop.

Select an option

Save robcarrington/bce8a532fd55a7f00decd3813b944a06 to your computer and use it in GitHub Desktop.
Simple Python 3 HTTP server that can store one key-value pair per request, as given in query string.
#!/usr/bin/python3
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs
import json
HOST_NAME = ""
HOST_PORT = 4000
WRITE_SUCCESS_TEMPLATE = "Key '{}' now storing value '{}'"
WRITE_FAILURE_TEMPLATE = "Unable to store key '{}' and value '{}'"
FETCH_SUCCESS_TEMPLATE = "Successfully fetched value for key '{}'"
FETCH_FAILURE_TEMPLATE = "Unable to find key '{}'"
UNKNOWN_METHOD_TEMPLATE = "Unknown method: '{}'"
key_value_store = {}
class SimpleServer(BaseHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def write_key(self, key, value):
try:
key_value_store[key] = value
message = WRITE_SUCCESS_TEMPLATE.format(key, value)
except KeyError:
message = WRITE_FAILURE_TEMPLATE.format(key, value)
return message
def fetch_key(self, key):
try:
result = key_value_store[key]
message = FETCH_SUCCESS_TEMPLATE.format(key)
except KeyError:
result = None
message = FETCH_FAILURE_TEMPLATE.format(key)
return message, result
def return_simple_json(self, message, result=None):
response = {
"data": {
"message": message,
"result": result
}
}
response_bytes = bytes(json.dumps(response), "utf-8")
self.send_response(200)
self.send_header('Content-type', 'text/json')
self.end_headers()
self.wfile.write(response_bytes)
def do_GET(self):
request = urlparse(self.path)
query_string_data = parse_qs(request.query)
result = None
if query_string_data:
name, value = query_string_data.popitem()
if request.path == "/set/":
message = self.write_key(name, value[0])
elif request.path == "/get/":
message, result = self.fetch_key(value[0])
else:
message = UNKNOWN_METHOD_TEMPLATE.format(request.path)
response = self.return_simple_json(message, result)
if __name__ == '__main__':
my_server = HTTPServer((HOST_NAME, HOST_PORT), SimpleServer)
try:
print("server started")
my_server.serve_forever()
except KeyboardInterrupt:
print("unable to start server")
my_server.server_close()
print("server terminated")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment