Browse Source

finish prototype of http server

master
Brett Langdon 11 years ago
parent
commit
a1b8c5bdc4
5 changed files with 45 additions and 18 deletions
  1. +12
    -5
      bin/greenrpc-client
  2. +10
    -4
      bin/greenrpc-server
  3. +1
    -2
      greenrpc/__init__.py
  4. +18
    -3
      greenrpc/client.py
  5. +4
    -4
      greenrpc/server.py

+ 12
- 5
bin/greenrpc-client View File

@ -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="<arg>", 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="<address>:<port> 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

+ 10
- 4
bin/greenrpc-server View File

@ -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="<module>", 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="<address>:<port> 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:


+ 1
- 2
greenrpc/__init__.py View File

@ -1,4 +1,3 @@
__version__ = "0.1.0"
TCP_SERVER_DEFAULT_PORT = 3434
HTTP_SERVER_DEFAULT_PORT = 3435
DEFAULT_PORT = 3434

+ 18
- 3
greenrpc/client.py View File

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

+ 4
- 4
greenrpc/server.py View File

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


Loading…
Cancel
Save