@@ -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 \n 1--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
203264class JsonRpcError (object ):
0 commit comments