diff --git a/bin/greenrpc-client b/bin/greenrpc-client index f009d6a..be1e9a3 100755 --- a/bin/greenrpc-client +++ b/bin/greenrpc-client @@ -1,8 +1,8 @@ #!/usr/bin/env python import argparse -from greenrpc import TCP_SERVER_DEFAULT_PORT -from greenrpc.client import TCPClient +from greenrpc import DEFAULT_PORT +from greenrpc.client import TCPClient, HTTPClient if __name__ == "__main__": parser = argparse.ArgumentParser(description="Start a new GreenRPC TCP Server") @@ -11,15 +11,22 @@ if __name__ == "__main__": parser.add_argument("args", metavar="", nargs="*", type=str, help="Arguments to send for the remote method call") - default_connect = "127.0.0.1:%s" % (TCP_SERVER_DEFAULT_PORT, ) + default_connect = "127.0.0.1:%s" % (DEFAULT_PORT, ) parser.add_argument("--connect", dest="connect", type=str, default=default_connect, help="
: of the server to connect to(default: %s)" % (default_connect, )) parser.add_argument("--debug", dest="debug", action="store_true", default=False, - help="Whether or not to show the full result") + help="whether or not to show the full result") + + parser.add_argument("--http", dest="http", action="store_true", default=False, + help="whether the server is http or tcp") args = parser.parse_args() address, _, port = args.connect.partition(":") - client = TCPClient(connect=(address, int(port))) + connect = (address, int(port)) + if args.http: + client = HTTPClient(connect=connect) + else: + client = TCPClient(connect=connect) result = client.call(args.method, args.args, debug=args.debug) print result diff --git a/bin/greenrpc-server b/bin/greenrpc-server index e5c6713..9840727 100755 --- a/bin/greenrpc-server +++ b/bin/greenrpc-server @@ -1,22 +1,28 @@ #!/usr/bin/env python import argparse -from greenrpc import TCP_SERVER_DEFAULT_PORT -from greenrpc.server import TCPServer +from greenrpc import DEFAULT_PORT +from greenrpc.server import TCPServer, WSGIServer if __name__ == "__main__": parser = argparse.ArgumentParser(description="Start a new GreenRPC TCP Server") parser.add_argument("module", metavar="", type=str, help="Python module to expose for the RPC Server") - default_bind = "127.0.0.1:%s" % (TCP_SERVER_DEFAULT_PORT, ) + default_bind = "127.0.0.1:%s" % (DEFAULT_PORT, ) parser.add_argument("--bind", dest="bind", type=str, default=default_bind, help="
: to bind the server to (default: %s)" % (default_bind, )) parser.add_argument("--spawn", dest="spawn", type=int, default=4, help="number of greenlets to spawn (default: 4)") + parser.add_argument("--http", dest="http", action="store_true", default=False, + help="whether to start an http server instead of tcp (default: False)") args = parser.parse_args() address, _, port = args.bind.partition(":") - server = TCPServer(args.module, bind=(address, int(port)), spawn=args.spawn) + bind = (address, int(port)) + if args.http: + server = WSGIServer(args.module, bind=bind, spawn=args.spawn) + else: + server = TCPServer(args.module, bind=bind, spawn=args.spawn) try: server.serve_forever() except KeyboardInterrupt: diff --git a/greenrpc/__init__.py b/greenrpc/__init__.py index 343a9f2..f98999f 100644 --- a/greenrpc/__init__.py +++ b/greenrpc/__init__.py @@ -1,4 +1,3 @@ __version__ = "0.1.0" -TCP_SERVER_DEFAULT_PORT = 3434 -HTTP_SERVER_DEFAULT_PORT = 3435 +DEFAULT_PORT = 3434 diff --git a/greenrpc/client.py b/greenrpc/client.py index 3b455f7..c7121fb 100644 --- a/greenrpc/client.py +++ b/greenrpc/client.py @@ -1,12 +1,14 @@ from gevent.socket import socket +import msgpack +import requests -from greenrpc import TCP_SERVER_DEFAULT_PORT +from greenrpc import DEFAULT_PORT from greenrpc.base import BaseClient from greenrpc.error import RPCException class TCPClient(BaseClient): - def __init__(self, connect=("127.0.0.1", TCP_SERVER_DEFAULT_PORT)): + def __init__(self, connect=("127.0.0.1", DEFAULT_PORT)): super(TCPClient, self).__init__() self.connection = socket() self.connection.connect(connect) @@ -26,4 +28,17 @@ class TCPClient(BaseClient): class HTTPClient(BaseClient): - pass + def __init__(self, connect=("127.0.0.1", DEFAULT_PORT)): + super(HTTPClient, self).__init__() + self.base_url = "http://%s:%s/msgpack" % connect + + def call(self, method, args=[], debug=False): + self.id += 1 + request = self.pack_request(self.id, method, args) + result = requests.post(self.base_url, request) + data = msgpack.unpackb(result.content) + if debug: + return data + if data.get("error"): + raise RPCException(data["error"]) + return data.get("results") diff --git a/greenrpc/server.py b/greenrpc/server.py index e81b1f7..f60fd0a 100644 --- a/greenrpc/server.py +++ b/greenrpc/server.py @@ -6,12 +6,12 @@ from gevent import pywsgi from gevent.server import StreamServer import msgpack -from greenrpc import TCP_SERVER_DEFAULT_PORT, HTTP_SERVER_DEFAULT_PORT +from greenrpc import DEFAULT_PORT from greenrpc.base import BaseServer class TCPServer(StreamServer, BaseServer): - def __init__(self, services, bind=("127.0.0.1", TCP_SERVER_DEFAULT_PORT), spawn=1): + def __init__(self, services, bind=("127.0.0.1", DEFAULT_PORT), spawn=1): StreamServer.__init__(self, bind, spawn=spawn) BaseServer.__init__(self, services) @@ -25,8 +25,8 @@ class TCPServer(StreamServer, BaseServer): class WSGIServer(pywsgi.WSGIServer, BaseServer): - def __init__(self, services, bind=("127.0.0.1", HTTP_SERVER_DEFAULT_PORT)): - pywsgi.WSGIServer.__init__(self, bind) + def __init__(self, services, bind=("127.0.0.1", DEFAULT_PORT), spawn=1): + pywsgi.WSGIServer.__init__(self, bind, spawn=spawn) BaseServer.__init__(self, services) def decode(self, decoder, data):