Skip to content

Instantly share code, notes, and snippets.

@juan-fdz-hawa
Last active November 14, 2016 21:47
Show Gist options
  • Save juan-fdz-hawa/fd8f59f7dc6ccfbc081cebdd5750aa06 to your computer and use it in GitHub Desktop.
Save juan-fdz-hawa/fd8f59f7dc6ccfbc081cebdd5750aa06 to your computer and use it in GitHub Desktop.
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