2016-08-11 2 views
1

Вы знаете, как вручную добавить пользовательский заголовок в TISAPIRequest?.Добавить пользовательский заголовок на TISAPIRequest (сервер Datasnap Delphi 10.1)

Этот класс (или самый общий TWebRequest) не предоставляет свойство RawHeaders, позволяющее при необходимости добавлять новые настраиваемые заголовки.

PS: У меня есть грязное решение, когда мой WebRequest является TIdHTTPAppRequest (автономный сервер Datasnap), потому что тогда я могу создать класс-помощник для доступа к его собственному свойству 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), когда WebRequest является TISAPIRequest вместо THTTPAppRequest?.

спасибо.

ответ

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() функции для добавления/изменения значений заголовка запроса.

+0

Спасибо Реми, я собираюсь написать этот фильтр ISAPI. –