brookmiddleware.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. (*
  2. Brook for Free Pascal
  3. Copyright (C) 2014-2019 Silvio Clecio
  4. See the file LICENSE.txt, included in this distribution,
  5. for details about the copyright.
  6. This library is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. *)
  10. { Middleware classes. }
  11. unit BrookMiddleware;
  12. {$i brook.inc}
  13. interface
  14. uses
  15. BrookClasses, BrookAction, BrookRouter, BrookException, BrookHttpDefs,
  16. BrookUtils;
  17. type
  18. { Handles exceptions for @link(TBrookMiddleware). }
  19. EBrookMiddleware = class(EBrook);
  20. { Is a metaclass for @link(TBrookMiddleware) class. }
  21. TBrookMiddlewareClass = class of TBrookMiddleware;
  22. { Is a type to @code(*Middleware.OnExecute) event. }
  23. TBrookMiddlewareExecuteEvent = procedure(ASender: TObject;
  24. AAction: TBrookAction; ARoute: TBrookRoute) of object;
  25. { Defines a pointer to the @code(TBrookMiddlewareExecuteEvent) type.}
  26. PBrookMiddlewareExecuteEvent = ^TBrookMiddlewareExecuteEvent;
  27. { Intermediates two classes through a @code(TBrookExecuteActionEvent) event. }
  28. TBrookMiddleware = class(TBrookComponent)
  29. private
  30. FOldExecute: TBrookExecuteActionEvent;
  31. FOnExecute: TBrookMiddlewareExecuteEvent;
  32. protected
  33. procedure DoExecute(ASender: TObject; AAction: TBrookAction;
  34. ARequest: TBrookRequest; AResponse: TBrookResponse; const ANames,
  35. AValues: TBrookArrayOfString; ARoute: TBrookRoute;
  36. var AHandled: Boolean); virtual;
  37. public
  38. { Creates an instance of a @link(TBrookMiddleware) class. }
  39. constructor Create(ABoundEvent: PBrookExecuteActionEvent); overload; virtual;
  40. { Is triggered when the @code(DoExecute) method bound in this class is
  41. executed. }
  42. procedure Execute(ASender: TObject; AAction: TBrookAction;
  43. ARoute: TBrookRoute); virtual;
  44. { Bindes a @code(TBrookExecuteActionEvent) event to this class keeping the
  45. implementation of a previously declared event. }
  46. procedure BindExecution(AEvent: PBrookExecuteActionEvent);
  47. { Is triggered when the @code(Execute) method bound in this class is
  48. executed. }
  49. property OnExecute: TBrookMiddlewareExecuteEvent read FOnExecute
  50. write FOnExecute;
  51. end;
  52. implementation
  53. { TBrookCustomMiddleware }
  54. constructor TBrookMiddleware.Create(ABoundEvent: PBrookExecuteActionEvent);
  55. begin
  56. inherited Create(nil);
  57. BindExecution(ABoundEvent);
  58. end;
  59. procedure TBrookMiddleware.DoExecute(ASender: TObject; AAction: TBrookAction;
  60. ARequest: TBrookRequest; AResponse: TBrookResponse; const ANames,
  61. AValues: TBrookArrayOfString; ARoute: TBrookRoute; var AHandled: Boolean);
  62. begin
  63. Execute(ASender, AAction, ARoute);
  64. if Assigned(FOldExecute) then
  65. FOldExecute(ASender, AAction, ARequest, AResponse, ANames, AValues, ARoute,
  66. AHandled);
  67. end;
  68. {$PUSH}{$WARN 5024 OFF}
  69. procedure TBrookMiddleware.Execute(ASender: TObject; AAction: TBrookAction;
  70. ARoute: TBrookRoute);
  71. begin
  72. if Assigned(FOnExecute) then
  73. FOnExecute(Self, AAction, ARoute);
  74. end;
  75. {$POP}
  76. procedure TBrookMiddleware.BindExecution(AEvent: PBrookExecuteActionEvent);
  77. begin
  78. if Assigned(AEvent) then
  79. begin
  80. FOldExecute := AEvent^;
  81. AEvent^ := @DoExecute;
  82. end;
  83. end;
  84. end.