From f31a96bd37ec88f3377dd3a5fa9d52e050bb6f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 17 Jan 2012 13:49:50 +0100 Subject: [PATCH] Return tryton URL for similar GET queries on jsonrpc interface review208004 --- trytond/protocols/jsonrpc.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/trytond/protocols/jsonrpc.py b/trytond/protocols/jsonrpc.py index 3516d227da..3d198bb7ca 100644 --- a/trytond/protocols/jsonrpc.py +++ b/trytond/protocols/jsonrpc.py @@ -26,6 +26,8 @@ try: except ImportError: import json import base64 +import encodings + def object_hook(dct): if '__class__' in dct: @@ -166,6 +168,18 @@ class SimpleJSONRPCRequestHandler(GZipRequestHandlerMixin, SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.send_header(self, keyword, value) + def do_GET(self): + if self.is_tryton_url(self.path): + self.send_tryton_url(self.path) + return + SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) + + def do_HEAD(self): + if self.is_tryton_url(self.path): + self.send_tryton_url(self.path) + return + SimpleHTTPServer.SimpleHTTPRequestHandler.do_HEAD(self) + def translate_path(self, path): """Translate a /-separated PATH to the local filename syntax. @@ -188,6 +202,21 @@ class SimpleJSONRPCRequestHandler(GZipRequestHandlerMixin, path = os.path.join(path, word) return path + def is_tryton_url(self, path): + words = path.split('/') + try: + return words[2] in ('model', 'wizard', 'report') + except IndexError: + return False + + def send_tryton_url(self, path): + self.send_response(301) + hostname = CONFIG['hostname'] or unicode(socket.getfqdn(), 'utf8') + hostname = '.'.join(encodings.idna.ToASCII(part) for part in + hostname.split('.')) + self.send_header('Location', 'tryton://%s%s' % (hostname, path)) + self.end_headers() + class SecureJSONRPCRequestHandler(SimpleJSONRPCRequestHandler):