File: json_rpc.py

package info (click to toggle)
trac-xmlrpc 1.0.6%2Bsvn6598-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 308 kB
  • ctags: 427
  • sloc: python: 2,413; cs: 100; makefile: 4
file content (52 lines) | stat: -rw-r--r-- 1,815 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from trac.core import *
from trac.web.api import HTTPNotFound
from trac.web.main import IRequestHandler
from trac.web.chrome import ITemplateProvider, add_stylesheet
from tracrpc.api import IXMLRPCHandler, XMLRPCSystem
from trac.wiki.formatter import wiki_to_oneliner
from trac.perm import IPermissionRequestor
from fnmatch import fnmatch
from tracrpc.api import XMLRPCSystem
import simplejson


class JSONRPCWeb(Component):
    """Handle JSON-RPC calls from clients."""

    implements(IRequestHandler, IPermissionRequestor)

    # IPermissionRequestor methods
    def get_permission_actions(self):
        yield 'JSON_RPC'

    # IRequestHandler methods
    def match_request(self, req):
        return req.path_info in '/jsonrpc'

    def process_request(self, req):
        req.perm.assert_permission('JSON_RPC')
        self.env.log.debug(req.args)
        callback = req.args.get('jsonp', req.args.get('callback'))
        method = req.args.get('method', '')
        params = req.args.get('params', '')
        args = []
        kwargs = {}
        if params:
            params = simplejson.loads(req.args.get('params', ''))
        id = req.args.get('id')
        result, = XMLRPCSystem(self.env).get_method(method)(req, params)
        result = simplejson.dumps({'id': id, 'result': result, 'error': None})
        self.env.log.debug(type(result))
        if callback:
            self._send_response(req, '%s(%s)' % (callback, result))
        else:
            self.env.log.debug(result)
            self._send_response(req, result)

    # Internal methods
    def _send_response(self, req, response):
        req.send_response(200)
        req.send_header('Content-Type', 'application/json')
        req.send_header('Content-Length', len(response))
        req.end_headers()
        req.write(response)