json error handling
authorforrest <forrest@470744a7-cac9-478e-843e-5ec1b25c69e8>
Mon, 18 Jul 2011 15:43:52 +0000 (15:43 +0000)
committerforrest <forrest@470744a7-cac9-478e-843e-5ec1b25c69e8>
Mon, 18 Jul 2011 15:43:52 +0000 (15:43 +0000)
git-svn-id: svn://forre.st/p2pool@1412 470744a7-cac9-478e-843e-5ec1b25c69e8

dump_addrs.py
p2pool/util/jsonrpc.py

index c0330a1..f37beb2 100644 (file)
@@ -3,8 +3,8 @@ from __future__ import division
 import os
 import sqlite3
 
-import db
-import p2p
+from p2pool.util import db
+from p2pool import p2p
 
 print 'main'
 x = p2p.AddrStore(db.SQLiteDict(sqlite3.connect(os.path.join(os.path.dirname(__file__), 'addrs.dat'), isolation_level=None), 'addrs'))
index efb69cf..bb8c711 100644 (file)
@@ -5,7 +5,7 @@ import json
 
 from twisted.internet import defer
 from twisted.python import log
-from twisted.web import client
+from twisted.web import client, error
 
 import deferred_resource
 
@@ -17,7 +17,7 @@ class Error(Exception):
             raise TypeError('message must be a unicode')
         self._code, self._message, self._data = code, message, data
     def __str__(self):
-        return '%i %s %r' % (self._code, self._message, self._data)
+        return '%i %s' % (self._code, self._message) + (' %r' % (self._data, ) if self._data is not None else '')
     def _to_obj(self):
         return {
             'code': self._code,
@@ -39,22 +39,27 @@ class Proxy(object):
         }
         if self._auth is not None:
             headers['Authorization'] = 'Basic ' + base64.b64encode(':'.join(self._auth))
-        resp = json.loads((yield client.getPage(
-            url=self._url,
-            method='POST',
-            headers=headers,
-            postdata=json.dumps({
-                'jsonrpc': '2.0',
-                'method': method,
-                'params': params,
-                'id': id_,
-            }),
-        )))
+        try:
+            data = yield client.getPage(
+                url=self._url,
+                method='POST',
+                headers=headers,
+                postdata=json.dumps({
+                    'jsonrpc': '2.0',
+                    'method': method,
+                    'params': params,
+                    'id': id_,
+                }),
+            )
+        except error.Error, e:
+            resp = json.loads(e.response)
+        else:
+            resp = json.loads(data)
         
         if resp['id'] != id_:
             raise ValueError('invalid id')
         if 'error' in resp and resp['error'] is not None:
-            raise Error(resp['error'])
+            raise Error(**resp['error'])
         defer.returnValue(resp['result'])
     
     def __getattr__(self, attr):