Come rimuovere le intestazioni in un filtro ISAPI?
Domanda
La documentazione filtro ISAPI dice che posso chiamare SF_REQ_SEND_RESPONSE_HEADER per inviare l'intestazione di risposta, e anche accodare ulteriori intestazioni.
AddResponseHeaders per permettere un filtro di aggiungere < em> aggiuntivi intestazioni da inviare in risposta al client.
C'è un modo, in ISAPI, per Rimuovi intestazioni che altrimenti sarebbero inviati al cliente? O qualche modo per chiedere il runtime ISAPI di escludere alcune intestazioni dalla risposta? Il runtime ISAPI sembra includere sempre un server: colpo di testa, e mi piacerebbe trovare un modo per rimuovere questo.
So di poter impostare o intestazioni unset amministrativamente, in Gestione IIS, ma che non è proprio quello che voglio. Voglio farlo in fase di esecuzione nel filtro, a livello di codice, e condizionatamente.
EDIT:. BUMP
Soluzione
Ho scritto diverse ISAPI, tra cui uno che aveva la funzionalità che si descrive. Ho usato SF_NOTIFY_SEND_RAW_DATA - Credo che la prima chiamata sarà l'intestazione, in modo da poter utilizzare:
FilterContext-> ServerSupportFunction (FilterContext, SF_REQ_DISABLE_NOTIFICATIONS, 0, SF_NOTIFY_SEND_RAW_DATA, 0);
per disattivare le notifiche per i dati grezzi futuri. Poi nella struttura HTTP_FILTER_RAW_DATA hai pvInData, che è l'intestazione corrente, ho letto e poi scrivere in un nuovo HTTP_FILTER_RAW_DATA I assegnata (ricordarsi di utilizzare FilterContext-> AllocMem sia per la struttura e pvInData). Una volta fatto, scrivere il nuovo colpo di testa fuori FilterContext-> WriteClient e tornare SF_STATUS_REQ_READ_NEXT.
Inoltre, sulla inizializzazione assicurarsi di impostare SF_NOTIFY_ORDER_HIGH e SF_NOTIFY_SEND_RAW_DATA.
Da guardando attraverso il mio vecchio codice, che è quello che ho fatto ed è stato specificamente per rimuovere un colpo di testa (più esso aggiunto anche uno), quindi sicuramente si esibirà quello che devi fare. L'unico avvertimento che posso dire è che mi ricordo qualcosa che cambia correlate a RAW_DATA da IIS5 (quando ho scritto questo) per IIS6 +, ma non ho mai avuto bisogno di aggiornare questo particolare ISAPI, quindi non so se la possibilità effettuato come è fatto o non. Speriamo che questo ti aiuta, anche se probabilmente almeno ottenuto un tumbleweed per la tua domanda! :)
Altri suggerimenti
Ho usato questo codice per riscrivere le intestazioni (Firefox non il rendering HTML b / c nessun tipo di contenuto intestazione presente)
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;
}