* Normalize route when checking for duplicate routes. Fix issue #39570

This commit is contained in:
Michaël Van Canneyt 2022-02-10 14:13:30 +01:00
parent 72f852f653
commit 7b62186b9c

View File

@ -52,6 +52,7 @@ Type
Procedure DoHandleRequest(ARequest : TRequest; AResponse : TResponse); virtual;
Public
Destructor Destroy; override;
class function NormalizeRoute(AValue: String): String;
Procedure HandleRequest(ARequest : TRequest; AResponse : TResponse);
Function Matches(Const APattern : String; AMethod : TRouteMethod; Options : TRouteOptions) : Boolean;
Function MatchPattern(Const Path : String; L : TStrings; Options : TRouteOptions) : Boolean;
@ -457,9 +458,11 @@ procedure THTTPRouter.CheckDuplicate(APattern: String; AMethod: TRouteMethod;
Var
I,DI : Integer;
R : THTTPRoute;
aPtrn : String;
begin
DI:=-1;
aPtrn:=THTTPRoute.NormalizeRoute(aPattern);
Lock;
try
For I:=0 to FRoutes.Count-1 do
@ -467,7 +470,7 @@ begin
R:=FRoutes[I];
if R.Default then
DI:=I;
if R.Matches(APattern,AMethod,FRouteOptions) then
if R.Matches(aPtrn,AMethod,FRouteOptions) then
Raise EHTTPRoute.CreateFmt(EDuplicateRoute,[APattern,RouteMethodToString(AMethod)]);
end;
finally
@ -866,15 +869,21 @@ end;
{ THTTPRoute }
Class Function THTTPRoute.NormalizeRoute(AValue: String) : String;
begin
Result:=IncludeHTTPPathDelimiter(AValue);
if (Length(Result)>1) and (Result[1]='/') then
Delete(Result,1,1);
end;
procedure THTTPRoute.SetURLPattern(AValue: String);
Var
V : String;
begin
V:=IncludeHTTPPathDelimiter(AValue);
if (V<>'') and (V<>'/') and (V[1]='/') then
Delete(V,1,1);
V:=NormalizeRoute(aValue);
if FURLPattern=V then Exit;
FURLPattern:=V;
end;
@ -899,7 +908,7 @@ function THTTPRoute.Matches(const APattern: String; AMethod: TRouteMethod; Optio
begin
Result:=((Method=rmAll) or (AMethod=Method));
if Result then
Result:=SameText(URLPattern,APattern) or ((URLPattern='') and (roEmptyMatchesAll in Options))
Result:=SameText(URLPattern,NormalizeRoute(APattern)) or ((URLPattern='') and (roEmptyMatchesAll in Options))
end;
Function THTTPRoute.MatchPattern(Const Path : String; L : TStrings; Options: TRouteOptions) : Boolean;