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.
|
|
/*++
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; }
|