Как удалить заголовки в фильтре ISAPI?

В документации по ISAPI-фильтру сказано, что я могу вызвать SF_REQ_SEND_RESPONSE_HEADER, чтобы отправить заголовок ответа. , а также добавить дополнительные заголовки.

В ISAPI также есть AddResponseHeaders, позволяющие фильтру добавлять дополнительные заголовки, которые будут отправлены в ответ клиенту.

Есть ли в ISAPI способ удалить заголовки, которые в противном случае отправлялись бы клиенту? Или какой-то способ попросить среду выполнения ISAPI исключить определенные заголовки из ответа? Среда выполнения ISAPI всегда включает заголовок Server:, и я хотел бы найти способ удалить его.

Я знаю, что могу устанавливать или сбрасывать заголовки административно, в диспетчере IIS, но это не совсем то, что мне нужно. Я хочу сделать это во время выполнения в фильтре, программно и условно.

РЕДАКТИРОВАТЬ: УДАР.


person Cheeso    schedule 16.07.2009    source источник


Ответы (2)


Я написал несколько ISAPI, в том числе один с описанной вами функциональностью. Я использовал SF_NOTIFY_SEND_RAW_DATA — я считаю, что первым вызовом будет заголовок, поэтому вы можете использовать:

FilterContext->ServerSupportFunction(FilterContext, SF_REQ_DISABLE_NOTIFICATIONS, 0, SF_NOTIFY_SEND_RAW_DATA, 0);

чтобы отключить уведомления для будущих необработанных данных. Затем в структуре HTTP_FILTER_RAW_DATA у вас есть pvInData, который является текущим заголовком, который я читаю, а затем записываю в новый выделенный мной HTTP_FILTER_RAW_DATA (не забудьте использовать FilterContext->AllocMem как для структуры, так и для pvInData). Когда вы закончите, запишите новый заголовок в FilterContext->WriteClient и верните SF_STATUS_REQ_READ_NEXT.

Кроме того, при инициализации обязательно установите SF_NOTIFY_ORDER_HIGH и SF_NOTIFY_SEND_RAW_DATA.

Просматривая мой старый код, я сделал это, специально удалив заголовок (плюс он также добавил его), поэтому он, безусловно, будет выполнять то, что вам нужно. Единственное предостережение, которое я скажу, это то, что я помню, что что-то изменилось, связанное с RAW_DATA от IIS5 (когда я писал это) до IIS6+, но мне никогда не нужно было обновлять этот конкретный ISAPI, поэтому я не знаю, повлиял ли случай на то, как это делается, или нет. Надеюсь, это поможет вам, хотя вы, вероятно, по крайней мере получили перекати-поле для вашего вопроса! :)

person Mark    schedule 07.01.2010

Я использовал этот код для перезаписи заголовков (Firefor не отображал HTML b/c без заголовка типа контента)

DWORD CMyAuthFilterImpl::OnSendRawData(PHTTP_FILTER_CONTEXT pfc, DWORD NotoficationType, LPVOID pvNotification)
{
SF_STATUS_TYPE retStatus =  SF_STATUS_REQ_NEXT_NOTIFICATION;

if(m_bWriteHeader)
{
    //rewriting response headers with correct information
    pfc->ServerSupportFunction(pfc, SF_REQ_DISABLE_NOTIFICATIONS, 0, SF_NOTIFY_SEND_RAW_DATA, 0);

    PHTTP_FILTER_RAW_DATA pSD = (PHTTP_FILTER_RAW_DATA)pvNotification;
    DWORD dL = (DWORD)m_pszHeaders.length();
    pSD->pvInData = pfc->AllocMem(pfc, dL, 0);

    memcpy(pSD->pvInData, (void*)m_pszHeaders.data(), dL);
    pSD->cbInData = dL;

    m_bWriteHeader=FALSE;

    m_dwordHeaderLength=0;
    m_pszHeaders.~basic_string();
    retStatus =  SF_STATUS_REQ_NEXT_NOTIFICATION;

}


return retStatus;
}
person Kashif    schedule 17.04.2012