Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

270 lines
5.6 KiB

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name :
handlerequest.cxx
Abstract:
Handle request state
Author:
Bilal Alam (balam) 10-Jan-2000
Environment:
Win32 - User Mode
Project:
ULW3.DLL
--*/
#include "precomp.hxx"
#include "staticfile.hxx"
#include "isapi_handler.h"
#include "cgi_handler.h"
#include "trace_handler.h"
#include "dav_handler.h"
#include "generalhandler.hxx"
#include "redirectionhandler.hxx"
W3_STATE_HANDLE_REQUEST::W3_STATE_HANDLE_REQUEST()
{
BOOL fStaticInit = FALSE;
BOOL fCGIInit = FALSE;
BOOL fTraceInit = FALSE;
BOOL fISAPIInit = FALSE;
BOOL fDAVInit = FALSE;
BOOL fGeneralInit = FALSE;
BOOL fRedirectionInit = FALSE;
//
// Initialize static file handler
//
_hr = W3_STATIC_FILE_HANDLER::Initialize();
if ( FAILED( _hr ) )
{
goto Failure;
}
fStaticInit = TRUE;
//
// Initialize ISAPI handler
//
_hr = W3_ISAPI_HANDLER::Initialize();
if ( FAILED( _hr ) )
{
goto Failure;
}
fISAPIInit = TRUE;
//
// Initialize CGI handler
//
_hr = W3_CGI_HANDLER::Initialize();
if ( FAILED( _hr ) )
{
goto Failure;
}
fCGIInit = TRUE;
//
// Initialize Trace handler
//
_hr = W3_TRACE_HANDLER::Initialize();
if ( FAILED( _hr ) )
{
goto Failure;
}
fTraceInit = TRUE;
//
// Initialize DAV handler
//
_hr = W3_DAV_HANDLER::Initialize();
if ( FAILED( _hr ) )
{
goto Failure;
}
fDAVInit = TRUE;
//
// Initialize general handler
//
_hr = W3_GENERAL_HANDLER::Initialize();
if ( FAILED( _hr ) )
{
goto Failure;
}
fGeneralInit = TRUE;
_hr = W3_REDIRECTION_HANDLER::Initialize();
if ( FAILED( _hr ) )
{
goto Failure;
}
fRedirectionInit = TRUE;
return;
Failure:
if ( fRedirectionInit )
{
W3_REDIRECTION_HANDLER::Terminate();
}
if ( fGeneralInit )
{
W3_GENERAL_HANDLER::Terminate();
}
if ( fDAVInit )
{
W3_DAV_HANDLER::Terminate();
}
if ( fCGIInit )
{
W3_CGI_HANDLER::Terminate();
}
if ( fISAPIInit )
{
W3_ISAPI_HANDLER::Terminate();
}
if ( fStaticInit )
{
W3_STATIC_FILE_HANDLER::Terminate();
}
}
W3_STATE_HANDLE_REQUEST::~W3_STATE_HANDLE_REQUEST()
{
if ( FAILED( _hr ) )
{
return;
}
W3_STATIC_FILE_HANDLER::Terminate();
W3_ISAPI_HANDLER::Terminate();
W3_CGI_HANDLER::Terminate();
W3_DAV_HANDLER::Terminate();
W3_GENERAL_HANDLER::Terminate();
W3_REDIRECTION_HANDLER::Terminate();
}
CONTEXT_STATUS
W3_STATE_HANDLE_REQUEST::DoWork(
W3_MAIN_CONTEXT * pMainContext,
DWORD cbCompletion,
DWORD dwCompletionStatus
)
/*++
Routine Description:
Handle the request.
This routine should determine and invoke the appropriate request
handler.
Arguments:
pMainContext - Mainline context
cbCompletion - Bytes of completion
dwCompletionStatus - Completion status
Return Value:
CONTEXT_STATUS_PENDING if async pending, else CONTEXT_STATUS_CONTINUE
--*/
{
HRESULT hr = NO_ERROR;
BOOL fImmediateFinish = FALSE;
W3_TRACE_LOG * pTraceLog;
//
// We must NOT allow any handlers to store state with the context
// (that would screw up child execution)
//
DBG_ASSERT( pMainContext->QueryContextState() == NULL );
//
// We must have a user by now!
//
DBG_ASSERT( pMainContext->QueryUserContext() != NULL );
pTraceLog = pMainContext->QueryTraceLog();
if ( pTraceLog != NULL )
{
pTraceLog->Trace( L"%I64x: Successfully authenticated request as user '%s', type %d\n",
pMainContext->QueryRequest()->QueryRequestId(),
pMainContext->QueryUserContext()->QueryUserName(),
pMainContext->QueryUserContext()->QueryAuthType() );
}
//
// What handler should handle this request?
//
hr = pMainContext->DetermineHandler();
if ( FAILED( hr ) )
{
goto Failure;
}
//
// If we were successful, but no handler was set, then there must
// be an error for us to send
//
if ( pMainContext->QueryHandler() == NULL )
{
DBG_ASSERT( pMainContext->QueryResponse()->QueryStatusCode() != 200 );
hr = pMainContext->SendResponse( W3_FLAG_ASYNC );
}
else
{
hr = pMainContext->ExecuteHandler( W3_FLAG_ASYNC,
&fImmediateFinish );
}
//
// If the execution succeeded, then we expect a completion so bail
//
if ( SUCCEEDED( hr ) )
{
if ( fImmediateFinish )
{
return CONTEXT_STATUS_CONTINUE;
}
else
{
return CONTEXT_STATUS_PENDING;
}
}
Failure:
pMainContext->SetErrorStatus( hr );
pMainContext->QueryResponse()->SetStatus( HttpStatusServerError );
pMainContext->SetFinishedResponse();
return CONTEXT_STATUS_CONTINUE;
}