Last active
November 14, 2016 21:47
-
-
Save juan-fdz-hawa/fd8f59f7dc6ccfbc081cebdd5750aa06 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from wsgiref.simple_server import make_server | |
from urllib.parse import parse_qs | |
DATA_STORE = {} | |
def setter(qs, start_response, headers): | |
# Some questions/observations: | |
# - What to do with empty values? (Here I'm just ignoring them) | |
# - I just assumed it was OK to store vectors instead of scalars because | |
# well...YAGNI, meaning this is valid: | |
# .../set?somekey1=someval1&somekey1=someval2 | |
# The DATA_STORE will look like this afterwards: | |
# {'somekey1': ['someval1', 'someval2']} | |
# - I'm allowing the client to set values for different keys on the same | |
# requests, after: | |
# .../set?somekey1=someva1l&somekey2=someval2 | |
# The DATA_STORE will look like this: | |
# {'somekey1': ['someval1'], 'somekey2': ['someval2']} | |
r = {k: [v for v in qs[k] if v != ''] | |
for k in qs.keys() | |
if k and all(v != '' for v in qs[k])} | |
if r: | |
DATA_STORE.update(r) | |
start_response('200 OK', list(headers.items())) | |
return 'OK'.encode('utf-8') | |
else: | |
start_response('400 Bad Request', list(headers.items())) | |
err = 'Bad client! You provided an invalid key=value combination' | |
return err.encode('utf-8') | |
print(DATA_STORE) | |
def getter(qs, start_response, headers): | |
# Some questions/observations: | |
# - I'm allowing the client to query multiple keys on the same request: | |
# key=somekey1&key=someval2 | |
# Will return: | |
# DATA_STORE['somekey1'] + '\r\n' | |
# DATA_STORE['somekey2'] + '\r\n' | |
if 'key' in qs: | |
r = [DATA_STORE[val] for val in qs['key'] if val in DATA_STORE] | |
if r: | |
print(r) | |
start_response('200 OK', list(headers.items())) | |
return '\r\n'.join(repr(l) for l in r).encode('utf-8') | |
else: | |
start_response('400 Bad Request', list(headers.items())) | |
err = 'Keywords are not on the data store!' | |
return err.encode('utf-8') | |
else: | |
start_response('400 Bad Request', list(headers.items())) | |
err = 'Bad client! Invalid request' | |
return err.encode('utf-8') | |
def app(env, start_response): | |
headers = {'Content-Type': 'text/plain; charset=utf-8'} | |
handlers = {'/set': setter, '/get': getter} | |
action = env['PATH_INFO'] | |
qs = parse_qs(env['QUERY_STRING']) | |
if action not in handlers: | |
start_response('404 Not Found', list(headers.items())) | |
err = 'Sorry dude, I can only understand: {}'.format( | |
list(handlers.keys())) | |
yield err.encode('utf-8') | |
else: | |
yield handlers[action](qs, start_response, headers) | |
if __name__ == '__main__': | |
httpd = make_server('', 4000, app) | |
httpd.serve_forever() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment