2009-07-16 4 views
3

La documentation du filtre ISAPI indique que je peux appeler le SF_REQ_SEND_RESPONSE_HEADER pour envoyer l'en-tête de réponse et ajouter des en-têtes supplémentaires.Comment supprimer les en-têtes d'un filtre ISAPI?

ISAPI a également AddResponseHeaders pour permettre à un filtre d'ajouter d'en-têtes supplémentaires à envoyer dans la réponse au client.

Existe-t-il un moyen, dans ISAPI, de de supprimer les en-têtes qui seraient autrement envoyés au client? Ou un moyen de demander à l'exécution ISAPI d'exclure certains en-têtes de la réponse? Le runtime ISAPI semble toujours inclure un en-tête Server: et j'aimerais trouver un moyen de le supprimer.

Je sais que je peux définir ou supprimer des en-têtes administrativement, dans le Gestionnaire des services Internet (IIS), mais ce n'est pas tout à fait ce que je veux. Je veux le faire à l'exécution dans le filtre, par programmation, et conditionnellement.

EDIT: BUMP.

Répondre

2

J'ai écrit plusieurs ISAPI, dont un qui avait la fonctionnalité que vous décrivez. Je SF_NOTIFY_SEND_RAW_DATA - Je crois que le premier appel sera l'en-tête, vous pouvez donc utiliser:

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

pour désactiver les notifications pour les données brutes futures. Puis dans la structure HTTP_FILTER_RAW_DATA vous avez pvInData, qui est l'en-tête actuel, je l'ai lu et ensuite l'ai écrit dans un nouveau HTTP_FILTER_RAW_DATA que j'ai alloué (n'oubliez pas d'utiliser FilterContext-> AllocMem pour la structure et pvInData). Une fois que vous avez terminé, écrivez le nouvel en-tête sur FilterContext-> WriteClient et renvoyez SF_STATUS_REQ_READ_NEXT.

De même, lors de l'initialisation, assurez-vous de définir SF_NOTIFY_ORDER_HIGH et SF_NOTIFY_SEND_RAW_DATA. En regardant dans mon ancien code, c'est ce que j'ai fait et c'était pour supprimer spécifiquement un en-tête (plus il en a ajouté un), donc il va certainement effectuer ce que vous devez faire. La seule mise en garde que je vais dire est que je me souviens de quelque chose de changement lié à RAW_DATA de IIS5 (quand j'ai écrit ceci) à IIS6 +, mais je n'ai jamais eu besoin de mettre à jour ce ISAPI particulier, donc je ne sais pas ne pas. Espérons que cela vous aide, même si vous avez probablement au moins un tumbleweed pour votre question! :)

+0

Grand, merci. Une bonne idée. Je vais essayer. – Cheeso

+0

FYI: Cela a fonctionné. – Cheeso

1

J'ai utilisé ce code pour réécrire les en-têtes (Firefor pas Rendring HTML b/c pas présent en-tête de type de contenu)

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; 
} 
Questions connexes