HRESULT CNodeApplication::Dispatch(IHttpContext* context, IHttpEventProvider* pProvider, CNodeHttpStoredContext** ctx) { HRESULT hr; CheckNull(ctx); CheckNull(context); CheckNull(pProvider); ErrorIf(NULL == (*ctx = new CNodeHttpStoredContext(this, context)), ERROR_NOT_ENOUGH_MEMORY); IHttpModuleContextContainer* moduleContextContainer = context->GetModuleContextContainer(); moduleContextContainer->SetModuleContext(*ctx, this->GetApplicationManager()->GetModuleId()); // increase the pending async opertation count; corresponding decrease happens in // CProtocolBridge::FinalizeResponseCore, possibly after several context switches (*ctx)->IncreasePendingAsyncOperationCount(); CheckError(this->processManager->Dispatch(*ctx)); return S_OK; Error: // on error, nodeContext need not be freed here as it will be deallocated through IHttpStoredContext when the request is finished return hr; }
HRESULT MODSECURITY_STORED_CONTEXT::GetConfig( IHttpContext * pContext, MODSECURITY_STORED_CONTEXT ** ppModuleConfig ) { HRESULT hr = S_OK; MODSECURITY_STORED_CONTEXT * pModuleConfig = NULL; IHttpModuleContextContainer * pMetadataContainer = NULL; IAppHostConfigException * pException = NULL; pMetadataContainer = pContext->GetMetadata()->GetModuleContextContainer(); if ( pMetadataContainer == NULL ) { hr = E_UNEXPECTED; return hr; } pModuleConfig = (MODSECURITY_STORED_CONTEXT *)pMetadataContainer->GetModuleContext( g_pModuleContext ); if ( pModuleConfig != NULL ) { // // We found stored data for this module for the metadata // object which is different for unique configuration path // *ppModuleConfig = pModuleConfig; return S_OK; } // // If we reach here, that means this is first request or first // request after a configuration change IIS core will throw stored context away // if a change notification arrives for this metadata path // pModuleConfig = new MODSECURITY_STORED_CONTEXT(); if ( pModuleConfig == NULL ) { return E_OUTOFMEMORY; } // // Read module configuration data and store in MODSECURITY_STORED_CONTEXT // hr = pModuleConfig->Initialize( pContext, &pException ); if ( FAILED( hr ) || pException != NULL ) { pModuleConfig->CleanupStoredContext(); pModuleConfig = NULL; hr = E_UNEXPECTED; return hr; } // // Store MODSECURITY_STORED_CONTEXT data as metadata stored context // hr = pMetadataContainer->SetModuleContext( pModuleConfig, g_pModuleContext ); if ( FAILED( hr ) ) { pModuleConfig->CleanupStoredContext(); pModuleConfig = NULL; // // It is possible that some other thread stored context before this thread // could do. Check returned hr and return context stored by other thread // if ( hr == HRESULT_FROM_WIN32( ERROR_ALREADY_ASSIGNED ) ) { *ppModuleConfig = (MODSECURITY_STORED_CONTEXT *)pMetadataContainer->GetModuleContext( g_pModuleContext ); return S_OK; } } *ppModuleConfig = pModuleConfig; return hr; }