Skip to content

Instantly share code, notes, and snippets.

@matteobertozzi
Created February 11, 2012 12:09
Show Gist options
  • Select an option

  • Save matteobertozzi/1799024 to your computer and use it in GitHub Desktop.

Select an option

Save matteobertozzi/1799024 to your computer and use it in GitHub Desktop.
StreamRequestHandler that allows you to handle json requests
from SocketServer import TCPServer, StreamRequestHandler
class JSonService(StreamRequestHandler):
"""
Simple StreamRequestHandler that allows you to handle json requests
Example:
telnet localhost 8080
> {"action": [1, 2, 3]}
> ["do this", "do that"]
"""
def __init__(self, *args, **kwargs):
self._jtracker = None
StreamRequestHandler.__init__(self, *args, **kwargs)
def handle(self):
while True:
c = self.rfile.read(1)
if not c:
break
if self._jtracker is None:
if c in (' ', '\t', '\n', '\r'):
continue
block_map = {'{': '}', '[': ']'}
if not c in block_map:
self.send_error("request must be a valid json.")
break
self._jtracker = _JSonBlockTracker(c, block_map[c])
if self._jtracker.read(c):
if self.handle_request(self._jtracker.data):
break
self._jtracker = None
def handle_request(self, request):
print 'NotImplemented: JSonService.handle_request()', request
def send_error(self, message):
self.wfile.write('{"error", "%s"}\r\n' % message)
class _JSonBlockTracker(object):
def __init__(self, start_chr, end_chr):
self.start_chr = start_chr
self.end_chr = end_chr
self.in_string = False
self.in_escape = False
self.data = bytearray()
self.count = 0
def read(self, c):
self.data += c
if self.in_escape:
self.in_escape = False
elif c == '\\':
self.in_escape = True
elif not self.in_string:
if c == self.start_chr:
self.count += 1
elif c == self.end_chr:
self.count -= 1
if self.count == 0:
return True
elif c in ('\'', '"'):
self.in_string = True
elif c in ('\'', '"'):
self.in_string = False
return False
if __name__ == '__main__':
server = TCPServer(('', 8080), JSonService)
try:
server.serve_forever()
except:
server.shutdown()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment