Как удалить заголовки в фильтре ISAPI? - PullRequest
3 голосов
/ 17 июля 2009

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

ISAPI также имеет AddResponseHeaders , чтобы разрешить фильтру добавлять дополнительные заголовки для отправки в ответ клиенту.

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

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

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

Ответы [ 2 ]

2 голосов
/ 07 января 2010

Я написал несколько 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, поэтому я не знаю, повлиял ли какой-либо шанс на то, как это делается или не. Надеюсь, это поможет вам, хотя вы, по крайней мере, получили переплетение для вашего вопроса! :)

1 голос
/ 18 апреля 2012

Я использовал этот код для перезаписи заголовков (Firefor не воспроизводил HTML, потому что заголовок типа контента отсутствует)

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;
}
...