Durante lo sviluppo di una ISAPI filter mi è capitata la necessità di creare una variabile server IIS durante la gestione della notifica SF_NOTIFY_AUTHENTICATION.
Peccato che in questa notifica il parametro pvNotification passato da IIS sia di tipo PHTTP_FILTER_AUTHENT e non vi sia il modo di recuperare la struttura di tipo PHTTP_FILTER_PREPROC_HEADERS che contiene il metodo AddHeader.
Dopo un po' di tentativi ho percorso questa strada:
1. Definisco i seguenti typedef e define
1: #define MYISAPI_HEADER "MYISAPI-HEADER:"
2: #define HTTP_MYISAPI_HEADER "HTTP_MYISAPI_HEADER"
3: 4: typedef BOOL (WINAPI * PAddHeader) 5: (6: struct _HTTP_FILTER_CONTEXT * pfc,
7: LPSTR lpszName, 8: LPSTR lpszValue 9: );2. Nella notifica SF_NOTIFY_PREPROC_HEADERS creo una variabile server che contiene l'indirizzo del metodo AddHeader come nel codice seguente
1: TCHAR szTmp[256];2: sprintf_s(szTmp, sizeof(szTmp), "%08lx", ((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->AddHeader);
3: if(((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->HttpStatus == 0)
4: { 5: TCHAR szValue[256];6: DWORD dwValue = sizeof(szValue);
7: 8: *szValue = 0; 9: ((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->GetHeader(pfc, MYISAPI_HEADER, szValue, &dwValue); 10: 11: if(*szValue == 0)
12: ((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->AddHeader(pfc, MYISAPI_HEADER, szTmp); 13: }14: return(SF_STATUS_REQ_NEXT_NOTIFICATION);
3. Nella notifica SF_NOTIFY_AUTHENTICATION utilizzo la variabile server creata precedentemente nella notifica SF_NOTIFY_PREPROC_HEADERS, eseguo il cast su il pointer a funzione definito nel typedef e la richiamo per impostare una nuova variabile server
1: TCHAR szValue[256];2: DWORD dwValue = sizeof(szValue);
3: 4: *szValue = 0; 5: pfc->GetServerVariable(pfc, HTTP_MYISAPI_HEADER, szValue, &dwValue);6: if(*szValue != 0)
7: {8: try
9: { 10: PAddHeader pHeader = (PAddHeader)strtoul(szTmp, NULL, 16);11: if(pHeader)
12: (pHeader)(pfc, MYISAPI_USER_ID_LDAP, W2A(pszUidLdap)); 13: }14: catch(CException *e)
15: { 16: DumpException(e) 17: e->Delete(); 18: } 19: }
Funziona :)
Nessun commento:
Posta un commento