Skip to content

Commit e9e4feb

Browse files
committed
Code corrected, added more tests
1 parent 01fbcb9 commit e9e4feb

File tree

2 files changed

+176
-75
lines changed

2 files changed

+176
-75
lines changed

pyjsonrpclite/jsonrpc.py

Lines changed: 95 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -134,70 +134,131 @@ def SubValidateMethod(jsondict):
134134
raise JsonRpcException('No "method" field')
135135
if not SubIsMethodCorrect(jsondict):
136136
raise JsonRpcException('Invalid "method" field value')
137+
138+
def SubValidateParams(params):
139+
'''Checks if params not empty. Raises JsonRpcException if invalid.
140+
Params:
141+
params -- {scalar|array|object} value of jsondict['params']
142+
'''
143+
if params is None:
144+
return True
145+
valid = False
146+
if isinstance(params, basestring):
147+
valid = not params
148+
if isinstance(params, list):
149+
valid = valid and (len(params) > 0)
150+
if isinstance(params, object):
151+
valid = True
152+
if not valid:
153+
raise JsonRpcException('Invalid Params field value')
137154

138155
def SubValidateErrorObj(errdict):
139156
'''Checks if Error object has JSON-RPC 2.0 required fields. '''
140157
hasCode = 'code' in errdict
141158
hasMessage = 'message' in errdict
142159
if not (hasCode and hasMessage):
143160
raise JsonRpcException('Invalid JSON-RPC 2.0 Error object structure')
144-
return True
161+
allowedCodes = [-32700]
162+
allowedCodes = allowedCodes + [x for x in range(-32603, -32599)]
163+
allowedCodes = allowedCodes + [x for x in range(-32099,-31999)]
164+
if not errdict['code'] in allowedCodes:
165+
raise JsonRpcException('Invalid JSON-RPC 2.0 Error code')
166+
167+
def SubParseNotification(jsondict):
168+
'''Parses jsondict, validates JSON-RPC 2.0 Notification structure and values.
169+
Doesn't check JSON-RPC 2.0 "jsonrpc" and "id".
170+
Raises JsonRpcParseError if parse failed, or params invalid.'''
171+
try:
172+
SubValidateMethod(jsondict)
173+
except JsonRpcException as e:
174+
raise JsonRpcParseError(JsonRpcError.InvalidRequest(str(e)))
175+
params = jsondict.get('params', None)
176+
try:
177+
SubValidateParams(params)
178+
payload = JsonRpcMessage.Notification(jsondict['method'], params)
179+
return JsonRpcParsed(JsonRpcParsedType.NOTIFICATION, payload)
180+
except JsonRpcException as e:
181+
raise JsonRpcParseError(JsonRpcError.InvalidParams(str(e)))
145182

183+
def SubParseRequest(jsondict):
184+
'''Parses jsondict, validates JSON-RPC 2.0 Request structure and values.
185+
Doesn't check JSON-RPC 2.0 "jsonrpc","id", "method".
186+
Raises JsonRpcParseError if parse failed, or params invalid.'''
187+
id = jsondict['id']
188+
method = jsondict['method']
189+
params = jsondict.get('params', None)
190+
try:
191+
SubValidateParams(params)
192+
payload = JsonRpcMessage.Request(id, method, params)
193+
return JsonRpcParsed(JsonRpcParsedType.REQUEST, payload)
194+
except JsonRpcException as e:
195+
raise JsonRpcParseError(JsonRpcError.InvalidParams(str(e)))
196+
197+
def SubParseSuccessResponse(jsondict):
198+
'''Parses jsondict, validates JSON-RPC 2.0 Response Success structure and values.
199+
Doesn't check JSON-RPC 2.0 "jsonrpc","id".
200+
Raises JsonRpcParseError if parse failed, or result invalid.
201+
Params:
202+
jsondict - object, json parsed object
203+
'''
204+
payload = JsonRpcMessage.Success(jsondict['id'], jsondict['result'])
205+
return JsonRpcParsed(JsonRpcParsedType.SUCCESS, payload)
206+
207+
def SubParseErrorResponse(jsondict):
208+
'''Parses jsondict, validates JSON-RPC 2.0 Response Error structure and values.
209+
Doesn't check JSON-RPC 2.0 "jsonrpc","id".
210+
Raises JsonRpcParseError if parse failed, or error object invalid.
211+
Params:
212+
jsondict - object, json parsed object
213+
'''
214+
err = jsondict.get('error', None)
215+
try:
216+
SubValidateErrorObj(err)
217+
errorobj = JsonRpcError(err['code'], err['message'], \
218+
err.get('data', None))
219+
payload = JsonRpcMessage.Error(jsondict['id'], errorobj)
220+
return JsonRpcParsed(JsonRpcParsedType.ERROR, payload)
221+
except JsonRpcException as e:
222+
raise JsonRpcParseError(JsonRpcError.InvalidParams(str(e)))
223+
146224
def SubParseJsonRpcObject(jsondict):
147225
'''Check if jsondict is valid JSON-RPC 2.0 object.
148226
Returns JsonRpcParsed object containing Parse results.'''
149227
try:
150228
SubValidateHeader(jsondict)
151229
except JsonRpcException as e:
152230
raise JsonRpcParseError(JsonRpcError.InvalidRequest(str(e)))
153-
154-
isNotification = not SubHasValidId(jsondict)
155-
if isNotification:
156-
try:
157-
SubValidateMethod(jsondict)
158-
data = JsonRpcMessage.Notification(jsondict['method'], \
159-
jsondict.get('params', None))
160-
return JsonRpcParsed(JsonRpcParsedType.NOTIFICATION, data)
161-
except JsonRpcException as e:
162-
raise JsonRpcParseError(JsonRpcError.InvalidRequest(str(e)))
231+
232+
isNotification = not SubHasValidId(jsondict)
233+
if isNotification:
234+
return SubParseNotification(jsondict)
235+
163236
#else it has Id so it may be: request, success, error message
164237
isRequest = SubIsMethodCorrect(jsondict)
165-
if isRequest:
166-
data = JsonRpcMessage.Request(jsondict['id'], \
167-
jsondict['method'], jsondict.get('params', None))
168-
return JsonRpcParsed(JsonRpcParsedType.REQUEST, data)
169-
# no METHOD field so it may be: success, error message
170-
238+
if isRequest:
239+
return SubParseRequest(jsondict)
240+
241+
# no METHOD field so it may be: success, error message
171242
isSuccessMsg = 'result' in jsondict
172-
if isSuccessMsg:
173-
data = JsonRpcMessage.Success(jsondict['id'], jsondict['result'])
174-
return JsonRpcParsed(JsonRpcParsedType.SUCCESS, data)
243+
if isSuccessMsg:
244+
return SubParseSuccessResponse(jsondict)
175245

176246
isErrorMsg = 'error' in jsondict
177-
if isErrorMsg:
178-
err = jsondict['error']
179-
try:
180-
SubValidateErrorObj(err)
181-
errorobj = JsonRpcError(err['code'], err['message'], \
182-
err.get('data', None))
183-
data = JsonRpcMessage.Error(jsondict['id'], errorobj)
184-
return JsonRpcParsed(JsonRpcParsedType.ERROR, data)
185-
except JsonRpcException as e:
186-
raise JsonRpcParseError(JsonRpcError.InvalidParams(str(e)))
187-
# no result, no error - id only
247+
if isErrorMsg:
248+
return SubParseErrorResponse(jsondict)
249+
# no result, no error, no method - id only
188250
raise JsonRpcParseError(
189251
JsonRpcError.InvalidRequest('No reqired fields'))
190252
try:
191253
jsondict = json.loads(jsonstr)
192254
except ValueError as e:
193-
print '\r\n1--repr(e):' + repr(e)
194255
raise JsonRpcParseError(JsonRpcError.ParseError(jsonstr))
195256
try:
196257
parsedObjInfo = SubParseJsonRpcObject(jsondict)
197258
except JsonRpcParseError as e:
198259
raise
199-
except Exception as e:
200-
raise JsonRpcParseError(JsonRpcError.InternalError(str(e)))
260+
'''except Exception as e:
261+
raise JsonRpcParseError(JsonRpcError.InternalError(str(e)))'''
201262
return parsedObjInfo
202263

203264
class JsonRpcError(object):

0 commit comments

Comments
 (0)