Skip to content

Commit

Permalink
Issue #102 (#104)
Browse files Browse the repository at this point in the history
As pointed out by @gmurt, some data about the request was no longer accessible through IMARSRequest interface.
Added ContentFields, QueryFields, RemoteIP and UserAgent properties to IMARSRequest
  • Loading branch information
andrea-magni authored Nov 23, 2020
1 parent 95c314a commit 8039840
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 0 deletions.
8 changes: 8 additions & 0 deletions Source/MARS.Core.RequestAndResponse.Interfaces.pas
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ interface
function GetPort: Integer;
function GetRawPath: string;
function GetDate: TDateTime;
function GetContentFields: TArray<string>;
function GetQueryFields: TArray<string>;
function GetRemoteIP: string;
function GetUserAgent: string;

function AsObject: TObject;
procedure CheckWorkaroundForISAPI;
Expand All @@ -53,6 +57,10 @@ interface
property HostName: string read GetHostName;
property Port: Integer read GetPort;
property RawPath: string read GetRawPath;
property ContentFields: TArray<string> read GetContentFields;
property QueryFields: TArray<string> read GetQueryFields;
property RemoteIP: string read GetRemoteIP;
property UserAgent: string read GetUserAgent;
end;

IMARSResponse = interface
Expand Down
57 changes: 57 additions & 0 deletions Source/MARS.http.Server.DCS.pas
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ TMARSDCSRequest = class(TInterfacedObject, IMARSRequest)
function GetQueryString: string; inline;
function GetRawContent: TBytes; inline;
function GetRawPath: string;
function GetContentFields: TArray<string>;
function GetQueryFields: TArray<string>;
function GetRemoteIP: string;
function GetUserAgent: string;
procedure CheckWorkaroundForISAPI;
// -------------------------------------------------------------------------
constructor Create(ADCSRequest: ICrossHttpRequest); virtual;
Expand Down Expand Up @@ -225,6 +229,40 @@ function TMARSDCSRequest.GetContent: string;
Result := '';
end;

function TMARSDCSRequest.GetContentFields: TArray<string>;
var
LHeader: TNameValue;
LMultiPartBody: THttpMultiPartFormData;
LIndex: Integer;
LFormField: TFormField;
LURLParamsBody: THttpUrlParams;
LParam: TNameValue;
begin
Result := [];

if FDCSRequest.BodyType = btMultiPart then
begin
LMultiPartBody := FDCSRequest.Body as THttpMultiPartFormData;

for LIndex := 0 to LMultiPartBody.Count - 1 do
begin
LFormField := LMultiPartBody.Items[LIndex];

Result := Result + [LFormField.AsString];
end;
end
else if FDCSRequest.BodyType = btUrlEncoded then
begin
LURLParamsBody := FDCSRequest.Body as THttpUrlParams;

for LIndex := 0 to LURLParamsBody.Count-1 do
begin
LParam := LURLParamsBody.Items[LIndex];
Result := Result + [LParam.Name + '=' + LParam.Value];
end;
end;
end;

function TMARSDCSRequest.GetCookieParamCount: Integer;
begin
Result := FDCSRequest.Cookies.Count;
Expand Down Expand Up @@ -462,6 +500,15 @@ function TMARSDCSRequest.GetPort: Integer;
Result := FDCSRequest.HostPort;
end;

function TMARSDCSRequest.GetQueryFields: TArray<string>;
var
LQuery: TNameValue;
begin
Result := [];
for LQuery in FDCSRequest.Query do
Result := Result + [LQuery.Name + '=' + LQuery.Value];
end;

function TMARSDCSRequest.GetQueryParamCount: Integer;
begin
Result := FDCSRequest.Query.Count;
Expand Down Expand Up @@ -525,6 +572,16 @@ function TMARSDCSRequest.GetRawPath: string;
Result := FDCSRequest.Path;
end;

function TMARSDCSRequest.GetRemoteIP: string;
begin
Result := FDCSRequest.Connection.PeerAddr;
end;

function TMARSDCSRequest.GetUserAgent: string;
begin
Result := FDCSRequest.UserAgent;
end;

function TMARSDCSRequest.GetHeaderParamCount: Integer;
begin
Result := FDCSRequest.Header.Count;
Expand Down
25 changes: 25 additions & 0 deletions Source/MARS.http.Server.Indy.pas
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ TMARSWebRequest = class(TInterfacedObject, IMARSRequest)
function GetQueryString: string; inline;
function GetRawContent: TBytes; inline;
function GetRawPath: string; inline;
function GetContentFields: TArray<string>;
function GetQueryFields: TArray<string>;
function GetRemoteIP: string;
function GetUserAgent: string;

procedure CheckWorkaroundForISAPI;
// -------------------------------------------------------------------------
constructor Create(AWebRequest: TWebRequest); virtual;
Expand Down Expand Up @@ -313,6 +318,11 @@ function TMARSWebRequest.GetContent: string;
Result := FWebRequest.Content;
end;

function TMARSWebRequest.GetContentFields: TArray<string>;
begin
Result := FWebRequest.ContentFields.ToStringArray;
end;

function TMARSWebRequest.GetCookieParamCount: Integer;
begin
Result := FWebRequest.CookieFields.Count;
Expand Down Expand Up @@ -437,6 +447,11 @@ function TMARSWebRequest.GetPort: Integer;
Result := FWebRequest.ServerPort;
end;

function TMARSWebRequest.GetQueryFields: TArray<string>;
begin
Result := FWebRequest.QueryFields.ToStringArray;
end;

function TMARSWebRequest.GetQueryParamCount: Integer;
begin
Result := FWebRequest.QueryFields.Count;
Expand Down Expand Up @@ -477,6 +492,16 @@ function TMARSWebRequest.GetRawPath: string;
Result := FWebRequest.RawPathInfo;
end;

function TMARSWebRequest.GetRemoteIP: string;
begin
Result := FWebRequest.RemoteIP;
end;

function TMARSWebRequest.GetUserAgent: string;
begin
Result := FWebRequest.UserAgent;
end;

function TMARSWebRequest.GetHeaderParamCount: Integer;
begin
if (FWebRequest is TMARSIdHTTPAppRequest) or (FWebRequest is TIdHTTPAppRequest) then
Expand Down

0 comments on commit 8039840

Please sign in to comment.