* Fix memleak in case of error.

This commit is contained in:
Michaël Van Canneyt 2022-10-09 12:42:50 +02:00
parent d12bf094ab
commit f2580efc15

View File

@ -253,7 +253,7 @@ Type
Function CheckRequests(Requests : TJSONData) : TJSONData; virtual;
// Format result of a single request. Result is returned to the client, possibly in an array if multiple requests were received in batch.
Function FormatResult(const AClassName, AMethodName: TJSONStringType; const Params, ID, Return: TJSONData) : TJSONData; virtual;
// Format error of a single request.
// Format error of a single request. ID will be cloned if non-nil.
function CreateJSON2Error(Const AMessage : String; Const ACode : Integer; ID : TJSONData = Nil; idname : TJSONStringType = 'id' ) : TJSONObject; virtual;
function CreateJSON2Error(Const AFormat : String; Args : Array of const; Const ACode : Integer; ID : TJSONData = Nil; idname : TJSONStringType = 'id') : TJSONObject;
// Hooks for user.
@ -423,6 +423,7 @@ function CreateJSONErrorObject(Const AMessage : String; Const ACode : Integer) :
// Create a JSON RPC 2 error response object containing an 'Error' object.
// Result is of type TJSONErrorObject
// ID is cloned if it is non-nil.
function CreateJSON2ErrorResponse(Const AMessage : String; Const ACode : Integer; ID : TJSONData = Nil; idname : TJSONStringType = 'id' ) : TJSONObject;
function CreateJSON2ErrorResponse(Const AFormat : String; Args : Array of const; Const ACode : Integer; ID : TJSONData = Nil; idname : TJSONStringType = 'id') : TJSONObject;
// Examines Req (request) and returns Error or an array of clones of Error)
@ -1099,20 +1100,16 @@ function TCustomJSONRPCDispatcher.ExecuteMethod(Const AClassName,AMethodName: TJ
Var
H : TCustomJSONRPCHandler;
FreeObject : TComponent;
aClonedID : TJSONData;
begin
H:=FindHandler(AClassName,AMethodName,AContext,FreeObject);
If (H=Nil) then
begin
if Assigned(ID) then
aClonedID:=ID.Clone
else
aClonedID:=TJSONNull.Create;
// ID is cloned by CreateJSON2Error
if (AClassName='') then
Exit(CreateJSON2Error(SErrInvalidMethodName,[AMethodName],EJSONRPCMethodNotFound,aClonedID,transactionProperty))
Exit(CreateJSON2Error(SErrInvalidMethodName,[AMethodName],EJSONRPCMethodNotFound,ID,transactionProperty))
else
Exit(CreateJSON2Error(SErrInvalidClassMethodName,[AClassName,AMethodName],EJSONRPCMethodNotFound,aClonedID,transactionProperty));
Exit(CreateJSON2Error(SErrInvalidClassMethodName,[AClassName,AMethodName],EJSONRPCMethodNotFound,ID,transactionProperty));
end;
H.SetRequestClassAndMethod(aClassName,aMethodName);
try