在TISAPIRequest上添加自定义标头(Delphi 10.1 Datasnap Server)

时间:2016-08-11 16:08:39

标签: http delphi cors datasnap

您知道如何在TISAPIRequest上手动添加自定义标头吗?

此类(或最通用的TWebRequest)不公开RawHeaders属性以允许在需要时添加新的自定义标头。

PS:当我的WebRequest是TIdHTTPAppRequest(Datasnap独立服务器)时,我有一个脏的解决方案,因为那时我可以创建一个Helper类来访问其私有FRequestInfo属性,并从那里获得对RawHeaders的访问权限,我可以用来添加新标题。但我只使用独立服务器进行开发和测试,生产环境必须在IIS服务器上运行。

TIdHTTPAppRequestHelper = class helper for TIdHTTPAppRequest
  public
    function GetRequestInfo: TIdEntityHeaderInfo;
  end;

implementation

function TIdHTTPAppRequestHelper.GetRequestInfo: TIdEntityHeaderInfo;
begin
  Result := FRequestInfo;
end;

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var Token: string;
begin
  Response.SetCustomHeader('Access-Control-Allow-Origin','*');

  Token := Request.Query;

  if Copy(Token, 1, 10) = 'dssession=' then begin
    if Request is TIdHTTPAppRequest then begin
      TIdHTTPAppRequest(Request).GetRequestInfo.RawHeaders.AddValue('Pragma', Token);
    end;
  end;

  if FServerFunctionInvokerAction <> nil then
    FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;

当WebRequest是TISAPIRequest而不是THTTPAppRequest时,可以编写类似的代码来获得相同的结果(向WebRequest添加自定义标头)。

谢谢。

1 个答案:

答案 0 :(得分:2)

TISAPIRequest具有公共ECB属性,该属性返回指向表示基础请求数据的ISAPI EXTENSION_CONTROL_BLOCK结构的指针。但是,ECB不允许您以任何方式更改请求标头,只读取它们的值。不过,您可以通过ECB设置自定义响应标头。

我在ISAPI中添加/修改自定义请求标头值的唯一方法是编写ISAPI Filter DLL,这超出了TISAPIRequest处理的范围。在DLL导出的HttpFilterProc()函数中,SF_NOTIFY_PREPROC_HEADERS通知提供了HTTP_FILTER_PREPROC_HEADERS结构,其中包含指向AddHeader()SetHeader()函数的指针,用于添加/修改请求标头值。