REQUEST_NOTIFICATION_STATUS CCacheHelperModule::OnSendResponse( IN IHttpContext* pHttpContext, IN ISendResponseProvider* pProvider) { UNREFERENCED_PARAMETER(pProvider); IHttpResponse* pHttpResponse = pHttpContext->GetResponse(); IHttpRequest* pHttpRequest = pHttpContext->GetRequest(); if ((pHttpResponse != NULL) && (pHttpRequest != NULL)) { HTTP_COOKED_URL url = pHttpRequest->GetRawHttpRequest()->CookedUrl; if (!m_pConfig->UrlHasSitePrefix(url.pAbsPath)) return RQ_NOTIFICATION_CONTINUE; CachingBehavior behavior = CachingBehaviorIgnore; USHORT cchXCache; PCSTR szXCache = pHttpResponse->GetHeader((PCSTR)"X-Cache", &cchXCache); if (cchXCache > 0) { behavior = (CachingBehavior)StrToIntA(szXCache); pHttpResponse->DeleteHeader((PCSTR)"X-Cache"); } else { behavior = m_pConfig->GetCachePolicy(url.pAbsPath); } switch (behavior) { case CachingBehaviorPrivate: MakeUncacheable(pHttpResponse); break; case CachingBehaviorConditional: MakeConditionallyCacheable(pHttpResponse); break; case CachingBehaviorPublic: MakeCacheable(pHttpResponse); break; } } return RQ_NOTIFICATION_CONTINUE; }
REQUEST_NOTIFICATION_STATUS OnSendResponse( IN IHttpContext * pHttpContext, IN ISendResponseProvider * pProvider ) { UNREFERENCED_PARAMETER( pProvider ); pMgr = NULL; pParentElem = NULL; pElemColl = NULL; pElem = NULL; pElemProps = NULL; pElemProp = NULL; hr = S_OK; bstrConfigCommitPath = SysAllocString( L"MACHINE/WEBROOT/APPHOST" ); bstrSectionName = SysAllocString( L"system.webServer/stripHeaders" ); bstrPropertyName = SysAllocString( L"name" ); dwElementCount = 0; vtPropertyName.vt = VT_BSTR; vtPropertyName.bstrVal = bstrPropertyName; // Initialize hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ); if ( FAILED( hr ) ) { // Set the error status. pProvider->SetErrorStatus( hr ); // cleanup cleanup(); // End additional processing. return RQ_NOTIFICATION_FINISH_REQUEST; } // Create hr = CoCreateInstance( __uuidof( AppHostAdminManager ), NULL, CLSCTX_INPROC_SERVER, __uuidof( IAppHostAdminManager ), (void**) &pMgr ); if( FAILED( hr ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the admin section hr = pMgr->GetAdminSection( bstrSectionName, bstrConfigCommitPath, &pParentElem ); if ( FAILED( hr ) || ( &pParentElem == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the site collection hr = pParentElem->get_Collection( &pElemColl ); if ( FAILED ( hr ) || ( &pElemColl == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the elements hr = pElemColl->get_Count( &dwElementCount ); for ( USHORT i = 0; i < dwElementCount; i++ ) { VARIANT vtItemIndex; vtItemIndex.vt = VT_I2; vtItemIndex.iVal = i; // Add a new section group hr = pElemColl->get_Item( vtItemIndex, &pElem ); if ( FAILED( hr ) || ( &pElem == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the child elements hr = pElem->get_Properties( &pElemProps ); if ( FAILED( hr ) || ( &pElemProps == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } hr = pElemProps->get_Item( vtPropertyName, &pElemProp ); if ( FAILED( hr ) || ( pElemProp == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } hr = pElemProp->get_Value( &vtValue ); if ( FAILED( hr ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Retrieve a pointer to the response. IHttpResponse * pHttpResponse = pHttpContext->GetResponse(); // Test for an error. if ( pHttpResponse != NULL ) { // convert bstr to string in order to delete header _bstr_t header( vtValue.bstrVal ); // delete header hr = pHttpResponse->DeleteHeader( (char *)header ); // Test for an error. if ( FAILED( hr ) ) { // Set the error status. pProvider->SetErrorStatus( hr ); // cleanup cleanup(); // End additional processing. return RQ_NOTIFICATION_FINISH_REQUEST; } } // loop_cleanup if ( pElem != NULL ) { pElem->Release(); pElem = NULL; } } cleanup(); // Return processing to the pipeline. return RQ_NOTIFICATION_CONTINUE; }