Skip to content

Commit 1a96669

Browse files
committed
Added support for Rate Limite in Wizard
1 parent 63c12e8 commit 1a96669

9 files changed

+975
-23
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,3 +154,6 @@ samples/wine_cellar_sample/winecellarclient_mobile/Android64/Debug/
154154
/unittests/general/TestClient/pgsql/testdatadir/
155155
**/dmvc_sessions/*
156156
.claude
157+
/samples/websocket_chat/_README.md
158+
/samples/websocket_primer/_README.md
159+
/samples/websocket_groups/_README.md

ideexpert/DMVC.Expert.CodeGen.Commands.pas

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -752,7 +752,10 @@ procedure TUnitWebModuleDeclarationCommand.ExecuteImplementation(Section: TStrin
752752
Section.AppendLine(' ' + Model[TConfigKey.jsonrpc_unit_name] + ',')
753753
end;
754754

755-
Section.AppendLine(' System.IOUtils,').AppendLine(' MVCFramework.Commons,');
755+
Section
756+
.AppendLine(' System.IOUtils,')
757+
.AppendLine(' MVCFramework.Commons,')
758+
.AppendLine(' MVCFramework.Logger,');
756759

757760
if Model.B[TConfigKey.program_ssv_templatepro] then
758761
begin
@@ -785,9 +788,19 @@ procedure TUnitWebModuleDeclarationCommand.ExecuteImplementation(Section: TStrin
785788
.AppendLine(' MVCFramework.Middleware.Trace,')
786789
.AppendLine(' MVCFramework.Middleware.CORS,')
787790
.AppendLine(' MVCFramework.Middleware.ETag,')
791+
.AppendLine(' MVCFramework.Middleware.RateLimit,')
788792
.AppendLine(' MVCFramework.Middleware.Compression;')
789793
.AppendLine
790-
.AppendLine('procedure ' + Model.S[TConfigKey.webmodule_classname] + '.WebModuleCreate(Sender: TObject);')
794+
.AppendLine('procedure ' + Model.S[TConfigKey.webmodule_classname] + '.WebModuleCreate(Sender: TObject);');
795+
796+
if Model.B[TConfigKey.webmodule_middleware_ratelimit] then
797+
begin
798+
Section
799+
.AppendLine('var')
800+
.AppendLine(' LRateLimitMiddleware: TMVCRateLimitMiddleware;');
801+
end;
802+
803+
Section
791804
.AppendLine('begin')
792805
.AppendLine(' fMVC := TMVCEngine.Create(Self,')
793806
.AppendLine(' procedure(Config: TMVCConfig)')
@@ -873,8 +886,44 @@ procedure TUnitWebModuleDeclarationCommand.ExecuteImplementation(Section: TStrin
873886
.AppendLine;
874887
end;
875888

889+
890+
if Model.B[TConfigKey.webmodule_middleware_ratelimit] then
891+
begin
892+
Section
893+
.AppendLine(' LRateLimitMiddleware := TMVCRateLimitMiddleware.Create(')
894+
.AppendLine(' 10, // Max requests')
895+
.AppendLine(' 60, // Window in seconds')
896+
.AppendLine(' rlkIPAddress // Rate limit by IP address')
897+
.AppendLine(' );')
898+
.AppendLine('')
899+
.AppendLine(' // Exclude health check endpoint from rate limiting (uncomment and configure)')
900+
.AppendLine(' // LRateLimitMiddleware.AddExcludedPath(''/health'');')
901+
.AppendLine(' // LRateLimitMiddleware.AddExcludedPath(''/metrics'');')
902+
.AppendLine('')
903+
.AppendLine(' // Set custom callback for rate limit exceeded event')
904+
.AppendLine(' LRateLimitMiddleware.SetOnRateLimitExceeded(')
905+
.AppendLine(' procedure(const AContext: TWebContext; const AKey: string;')
906+
.AppendLine(' const ALimit: Integer; const AWindowSeconds: Integer)')
907+
.AppendLine(' begin')
908+
.AppendLine(' LogW(Format(''Rate limit exceeded for key: %s (Limit: %d requests per %d seconds)'',')
909+
.AppendLine(' [AKey, ALimit, AWindowSeconds]));')
910+
.AppendLine(' end')
911+
.AppendLine(' );')
912+
913+
end;
914+
915+
916+
Section
917+
.AppendLine(' // Middleware');
918+
919+
if Model.B[TConfigKey.webmodule_middleware_ratelimit] then
920+
begin
921+
Section
922+
.AppendLine(' fMVC.AddMiddleware(LRateLimitMiddleware);');
923+
end;
924+
925+
876926
Section
877-
.AppendLine(' // Middleware')
878927
.AppendLine(' // To use memory session uncomment the following line')
879928
.AppendLine(' // fMVC.AddMiddleware(UseMemorySessionMiddleware);')
880929
.AppendLine(' //')

ideexpert/DMVC.Expert.Commons.pas

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ TConfigKey = class sealed
9595
webmodule_middleware_compression = 'webmodule.middleware.compression';
9696
webmodule_middleware_etag = 'webmodule.middleware.etag';
9797
webmodule_middleware_cors = 'webmodule.middleware.cors';
98+
webmodule_middleware_ratelimit = 'webmodule.middleware.ratelimit';
9899
webmodule_middleware_activerecord = 'webmodule.middleware.activerecord';
99100
webmodule_middleware_activerecord_con_def_name = 'webmodule.middleware.activerecord.con_def_name';
100101
webmodule_middleware_activerecord_con_def_filename = 'webmodule.middleware.activerecord.con_def_filename';

ideexpert/DMVC.Expert.Forms.NewProjectWizard.dfm

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,6 @@ object frmDMVCNewProject: TfrmDMVCNewProject
584584
Checked = True
585585
State = cbChecked
586586
TabOrder = 0
587-
ExplicitWidth = 264
588587
end
589588
object edtControllerClassName: TEdit
590589
Left = 16
@@ -593,7 +592,6 @@ object frmDMVCNewProject: TfrmDMVCNewProject
593592
Height = 19
594593
Anchors = [akLeft, akTop, akRight]
595594
TabOrder = 3
596-
ExplicitWidth = 264
597595
end
598596
object chkCreateActionFiltersMethods: TCheckBox
599597
Left = 16
@@ -603,7 +601,6 @@ object frmDMVCNewProject: TfrmDMVCNewProject
603601
Anchors = [akLeft, akTop, akRight]
604602
Caption = 'Generate Action Filters Methods'
605603
TabOrder = 1
606-
ExplicitWidth = 264
607604
end
608605
object chkCreateCRUDMethods: TCheckBox
609606
Left = 16
@@ -615,7 +612,6 @@ object frmDMVCNewProject: TfrmDMVCNewProject
615612
Checked = True
616613
State = cbChecked
617614
TabOrder = 2
618-
ExplicitWidth = 264
619615
end
620616
object chkProfileActions: TCheckBox
621617
Left = 16
@@ -626,7 +622,6 @@ object frmDMVCNewProject: TfrmDMVCNewProject
626622
Caption = 'Include Actions Profiling Code'
627623
TabOrder = 4
628624
WordWrap = True
629-
ExplicitWidth = 276
630625
end
631626
end
632627
end
@@ -689,17 +684,17 @@ object frmDMVCNewProject: TfrmDMVCNewProject
689684
TabOrder = 2
690685
end
691686
object chkTrace: TCheckBox
692-
Left = 213
687+
Left = 175
693688
Top = 50
694-
Width = 150
689+
Width = 98
695690
Height = 17
696691
Hint = 'Debug purposes'
697692
Anchors = [akTop]
698-
Caption = 'Tracing (debug purposes)'
693+
Caption = 'Tracing (debug)'
699694
TabOrder = 3
700695
end
701696
object chkCORS: TCheckBox
702-
Left = 213
697+
Left = 175
703698
Top = 27
704699
Width = 135
705700
Height = 17
@@ -708,12 +703,12 @@ object frmDMVCNewProject: TfrmDMVCNewProject
708703
TabOrder = 4
709704
end
710705
object chkETAG: TCheckBox
711-
Left = 213
706+
Left = 175
712707
Top = 74
713-
Width = 202
708+
Width = 76
714709
Height = 17
715710
Anchors = [akTop]
716-
Caption = 'ETag (Cache of unchanged resources)'
711+
Caption = 'ETag'
717712
TabOrder = 5
718713
end
719714
object chkActiveRecord: TCheckBox
@@ -743,6 +738,15 @@ object frmDMVCNewProject: TfrmDMVCNewProject
743738
TabOrder = 8
744739
TextHint = 'MyConnDef'
745740
end
741+
object chkRateLimit: TCheckBox
742+
Left = 323
743+
Top = 27
744+
Width = 113
745+
Height = 17
746+
Anchors = [akTop]
747+
Caption = 'Rate Limit'
748+
TabOrder = 9
749+
end
746750
end
747751
object GroupBoxJSONRPC: TGroupBox
748752
Left = 314

ideexpert/DMVC.Expert.Forms.NewProjectWizard.pas

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ TfrmDMVCNewProject = class(TForm)
106106
Image2: TImage;
107107
Shape2: TShape;
108108
rgServerType: TRadioGroup;
109+
chkRateLimit: TCheckBox;
109110
procedure FormCreate(Sender: TObject);
110111
procedure Image1Click(Sender: TObject);
111112
procedure lblBookMouseEnter(Sender: TObject);
@@ -424,6 +425,7 @@ function TfrmDMVCNewProject.GetConfigModel: TJSONObject;
424425
fModel.B[TConfigKey.webmodule_middleware_compression] := chkCompression.Checked;
425426
fModel.B[TConfigKey.webmodule_middleware_etag] := chkETAG.Checked;
426427
fModel.B[TConfigKey.webmodule_middleware_cors] := chkCORS.Checked;
428+
fModel.B[TConfigKey.webmodule_middleware_ratelimit] := chkRateLimit.Checked;
427429
fModel.B[TConfigKey.webmodule_middleware_activerecord] := chkActiveRecord.Checked;
428430
fModel.S[TConfigKey.webmodule_middleware_activerecord_con_def_name] := EdtConnDefName.Text;
429431
fModel.S[TConfigKey.webmodule_middleware_activerecord_con_def_filename] := EdtFDConnDefFileName.Text;

packages/d130/dmvcframeworkRT.dpk

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,13 @@ contains
129129
MVCFramework.ObjectPool in '..\..\sources\MVCFramework.ObjectPool.pas',
130130
MVCFramework.BloomFilter in '..\..\sources\MVCFramework.BloomFilter.pas',
131131
ExprEvaluator in '..\..\sources\ExprEvaluator.pas',
132-
MVCFramework.Repository in '..\..\sources\MVCFramework.Repository.pas';
132+
MVCFramework.Repository in '..\..\sources\MVCFramework.Repository.pas',
133+
MVCFramework.WebSocket.Client in '..\..\sources\MVCFramework.WebSocket.Client.pas',
134+
MVCFramework.WebSocket.ConnectionManager in '..\..\sources\MVCFramework.WebSocket.ConnectionManager.pas',
135+
MVCFramework.WebSocket in '..\..\sources\MVCFramework.WebSocket.pas',
136+
MVCFramework.WebSocket.RateLimiter in '..\..\sources\MVCFramework.WebSocket.RateLimiter.pas',
137+
MVCFramework.WebSocket.Server in '..\..\sources\MVCFramework.WebSocket.Server.pas',
138+
MVCFramework.Middleware.RateLimit in '..\..\sources\MVCFramework.Middleware.RateLimit.pas';
133139

134140
end.
135141

0 commit comments

Comments
 (0)