2009-07-16 2 views
3

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

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

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

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

EDIT: BUMP.

ответ

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

+0

Отлично, спасибо. Хорошая идея. Я попробую. – Cheeso

+0

FYI: Это сработало. – Cheeso

1

Я использовал этот код, чтобы переписать заголовки (Firefor не rendring 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; 
}