|
|
|
@ -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)] |