From a44f719fefdcd60afaa2bc91ebfcbac7ab98d97b Mon Sep 17 00:00:00 2001 From: brettlangdon Date: Sun, 26 Oct 2014 14:51:03 -0400 Subject: [PATCH] prototype of greenrpc wsgi server --- greenrpc/server.py | 56 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/greenrpc/server.py b/greenrpc/server.py index 27908c4..e81b1f7 100644 --- a/greenrpc/server.py +++ b/greenrpc/server.py @@ -1,7 +1,10 @@ import contextlib +import json +import urlparse -from gevent.pywsgi import WSGIServer +from gevent import pywsgi from gevent.server import StreamServer +import msgpack from greenrpc import TCP_SERVER_DEFAULT_PORT, HTTP_SERVER_DEFAULT_PORT from greenrpc.base import BaseServer @@ -21,11 +24,54 @@ class TCPServer(StreamServer, BaseServer): fp.flush() -class WSGIServer(WSGIServer, BaseServer): +class WSGIServer(pywsgi.WSGIServer, BaseServer): def __init__(self, services, bind=("127.0.0.1", HTTP_SERVER_DEFAULT_PORT)): - WSGIServer.__init__(self, bind) + pywsgi.WSGIServer.__init__(self, bind) BaseServer.__init__(self, services) + def decode(self, decoder, data): + decoder = decoder.lower() + if decoder == "json": + return json.loads(data) + elif decoder == "msgpack": + return msgpack.unpackb(data) + + def encode(self, encoder, data): + encoder = encoder.lower() + if encoder == "json": + return json.dumps(data) + elif encoder == "msgpack": + return msgpack.packb(data) + + def content_type(self, encoder): + encoder = encoder.lower() + mime = "text/plain" + if encoder == "json": + mime = "application/json" + elif encoder == "msgpack": + mime = "application/x-msgpack" + return ("Content-Type", mime) + def application(self, environ, start_response): - start_response("200 OK", [("Content-Type", "text/plain")]) - return ["Hello, Worlds"] + content_length = int(environ.get("CONTENT_LENGTH", 0)) + uri = environ["PATH_INFO"] + uri = uri.strip("/") + encoder, _, method = uri.partition("/") + + qs = urlparse.parse_qs(environ["QUERY_STRING"]) + request = { + "id": qs.get("id", [None])[0], + "args": qs.get("arg", []), + "method": method, + } + + if environ["REQUEST_METHOD"] == "POST": + data = environ["wsgi.input"].read(content_length) + data = self.decode(encoder, data) + request["method"] = data.get("method", request["method"]) + request["args"] = data.get("args", request["args"]) + request["id"] = data.get("id", request["id"]) + + result = self.handle_request(request) + start_response("200 OK", [self.content_type(encoder)]) + return [self.encode(encoder, result)]