示例#1
0
  def dispatch(self, request, method='', json_encoder=None):
    from django.http import HttpResponse
    json_encoder = json_encoder or self.json_encoder

    try:
      # in case we do something json doesn't like, we always get back valid json-rpc response
      response = self.empty_response()
      if request.method.lower() == 'get':
        valid, D = self.validate_get(request, method)
        if not valid:
          raise InvalidRequestError('The method you are trying to access is '
                                    'not availble by GET requests')
      elif not request.method.lower() == 'post':
        raise RequestPostError
      else:
        try:
          D = loads(request.raw_post_data)
        except:
          raise InvalidRequestError
      
      if type(D) is list:
        response = [self.response_dict(request, d, is_batch=True, json_encoder=json_encoder)[0] for d in D]
        status = 200
      else:
        response, status = self.response_dict(request, D, json_encoder=json_encoder)
        if response is None and (not u'id' in D or D[u'id'] is None): # a notification
          return HttpResponse('', status=status)
      
      json_rpc = dumps(response, cls=json_encoder)
    except Error, e:
      signals.got_request_exception.send(sender=self.__class__, request=request)
      response['error'] = e.json_rpc_format
      status = e.status
      json_rpc = dumps(response, cls=json_encoder)
示例#2
0
 def test_20_batch(self):
   req = [{
     u'jsonrpc': u'2.0',
     u'method': u'jsonrpc.test',
     u'params': [u'this is a string'],
     u'id': u'id-'+unicode(i)
   } for i in range(5)]
   resp = loads(urllib.urlopen(self.host, dumps(req)).read())
   self.assertEquals(len(resp), len(req))
   for i, D in enumerate(resp):
     self.assertEquals(D[u'result'], req[i][u'params'][0])
     self.assertEquals(D[u'id'], req[i][u'id'])
示例#3
0
 def test_11_GET_mixed_args(self):
   params = {u'1': u'this is a string', u'2': u'this is omg', 
             u'wtf': u'pants', u'nowai': 'nopants'}
   url = "%s%s?%s" % (
     self.host, 'jsonrpc.strangeSafeEcho',
     (''.join(['%s=%s&' % (k, urllib.quote(v)) for k, v in params.iteritems()])).rstrip('&')
   )
   resp = loads(urllib.urlopen(url).read())
   self.assertEquals(resp[u'result'][-1], u'Default')
   self.assertEquals(resp[u'result'][1], u'this is omg')
   self.assertEquals(resp[u'result'][0], u'this is a string')
   self.assert_(u'error' not in resp)
示例#4
0
 def __call__(self, *args, **kwargs):
   params = kwargs if len(kwargs) else args
   if Any.kind(params) == Object and self.version != '2.0':
     raise Exception('Unsupport arg type for JSON-RPC 1.0 '
                    '(the default version for this client, '
                    'pass version="2.0" to use keyword arguments)')
   
   r = self.send_payload(params)    
   y = loads(r)
   if u'error' in y:
     try:
       from django.conf import settings
       if settings.DEBUG:
           print '%s error %r' % (self.service_name, y)
     except:
       pass
   return y
示例#5
0
 def test_20_batch_with_errors(self):
   req = [{
     u'jsonrpc': u'2.0',
     u'method': u'jsonrpc.test' if not i % 2 else u'jsonrpc.fails',
     u'params': [u'this is a string'],
     u'id': u'id-'+unicode(i)
   } for i in range(10)]
   resp = loads(urllib.urlopen(self.host, dumps(req)).read())
   self.assertEquals(len(resp), len(req))
   for i, D in enumerate(resp):
     if not i % 2:
       self.assertEquals(D[u'result'], req[i][u'params'][0])
       self.assertEquals(D[u'id'], req[i][u'id'])
       self.assert_(u'error' not in D)
     else:
       self.assert_(u'result' not in D)
       self.assert_(u'error' in D)
       self.assertEquals(D[u'error'][u'code'], 500)
示例#6
0
def _call(host, req):
  return loads(urllib.urlopen(host, dumps(req)).read())