⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mischand.cpp

📁 mini http server,可以集成嵌入到程序中,实现简单的web功能
💻 CPP
字号:
/*____________________________________________________________________________*\
 *

 Copyright (c) 1997-2003 John Roy, Holger Zimmermann. All rights reserved.

 These sources, libraries and applications are
 FREE FOR COMMERCIAL AND NON-COMMERCIAL USE
 as long as the following conditions are adhered to.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:

 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer. 

 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in
    the documentation and/or other materials provided with the
    distribution.

 3. The name of the author may not be used to endorse or promote products
    derived from this software without specific prior written permission.

 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 IN NO EVENT SHALL THE AUTHORS OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 OF THE POSSIBILITY OF SUCH DAMAGE.

 *____________________________________________________________________________*|
 *
 * $Source: /cvsroot/pi3web/Pi3Web_200/Source/HTTP/MiscHand.cpp,v $
 * $Date: 2003/05/13 18:42:03 $
 *
 Description:
	Miscellanious simple handlers.
\*____________________________________________________________________________*/
//$SourceTop:$

#include "HandBase.h"
#include "HTTPCore.h"
#include "HTTPUtil.h"
#include "PIStrStr.h"
#include "DblList.h"
#include "Pi3Expr.h"

/*____________________________________________________________________________*\
 *
 Description:
	Configuration & Documentation
\*____________________________________________________________________________*/
#if 0
	/*
	** HTML documentation for this handler
	*/
/*___+++HTMLDOC_BEGIN+++___*/
Name:
	ReturnCode

Description:
	Returns the specified error code. This handler can be used to 'fake'
	a response to a phase, or to otherwise cause the specified return
	code to be given.

Options:
<H5>Overview</H5>
<TABLE BORDER=1>
<TH>Option
<TH>Default
<TH>Values
<TH>Short Description
<TH>Example(s)

<TR>
<TD>ReturnCode
<TD>+
<TD>COMPLETED, CONTINUE, REDIRECT, ERROR, ABORT
<TD>Specify a handler return code
<TD>ReturnCode="COMPLETED"

</TABLE>
<STRONG>-</STRONG> in the <IT>default</IT> indicates no default<BR>
<STRONG>+</STRONG> in the <IT>default</IT> indicates the field is mandatory<BR>

<H4>Description of Options</H4>
<H5>
	ReturnCode
</H5>
Specifies the return code that will be returned from this handler. This
handler takes no other action.

Phase:
	Any

Returns:
	The specified return code.

Note:
Example:
	<PRE>
	&lt;Object&gt;
		Name ReturnCode
		Class ReturnCodeClass
	&lt;/Object&gt;

	&lt;Object&gt;
		...
		CheckAuth ReturnCode ReturnCode="COMPLETED"
		...
	&lt;/Object&gt;

	</PRE>
/*___+++HTMLDOC_END+++___*/
#endif

/*____________________________________________________________________________*\
 *
 Description:
\*____________________________________________________________________________*/
#define KEY_CONF_RETURNCODE		"ReturnCode"

/*____________________________________________________________________________*\
 *
 Class:
 Description:
\*____________________________________________________________________________*/
class ReturnCode : public HandlerBaseHTTP
{
private:
	/* ---
	Configuration data
	--- */
	const char *pReturnCode;		/* --- to check if it was set --- */
	int iReturnCode;				

protected:
	int Parameter( const char *pVariable, const char *pValue,
		const char *pWhere )
		{
		assert( pVariable && pValue );
		PIOStrStream os;
		os << pWhere << "ReturnCode: ";
		if ( !PIUtil_stricmp( KEY_CONF_RETURNCODE, pVariable ) )
			{
			pReturnCode = pValue;
			iReturnCode = HTTPUtil_rcNameToNumber( pValue ); 
			if ( iReturnCode==PIAPI_ABORT )
				{
				os << "Not a valid return code '" << pValue << "'." << ends;
				CONFIG_ERR( Object(), os.str() );
				return 0;
				};
			}
		else
			{
			os << "Unknown directive '" << pVariable <<
				"'" << ends;
			CONFIG_ERR( Object(), os.str() );
			return 0;
			};

		return 1;
		};

public:
	ReturnCode( PIObject *pObject, int iArgc, const char *ppArgv[] )
	:	HandlerBaseHTTP( pObject ), pReturnCode( 0 ), iReturnCode( PIAPI_ABORT )
		{
		ReadParameters( iArgc, ppArgv );
		if ( !pReturnCode )
			{
			CONFIG_ERR( Object(), "ReturnCode: 'ReturnCode' not \
defined" );
			SetOK( 0 );
			return;
			};
		};

	~ReturnCode()
		{
		};

	int Handle( int, PIHTTP &tPIHTTP, PIIOBuffer & )
		{
        return iReturnCode;
		};
};

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ReturnCode_constructor( PIObject *pObj,
	int iArgc, const char *ppArgv[] )
{
	return HandlerBaseHTTP_constructor( pObj, PI_NEW( ReturnCode( pObj,
		iArgc, ppArgv ) ) );
}

#if 0
/*___+++CNF_BEGIN+++___*/
	<Class>
		Name ReturnCodeClass
		Type LogicExtension
		Library HTTP
		OnClassLoad HandlerBaseHTTP_onClassLoad
		Constructor ReturnCode_constructor
		CopyConstructor HandlerBaseHTTP_copyConstructor
		Destructor HandlerBaseHTTP_destructor
		Execute HandlerBaseHTTP_execute
	</Class>

	<Object>
		Name ReturnCode
		Class ReturnCodeClass
	</Object>

/*___+++CNF_END+++___*/
#endif

/*____________________________________________________________________________*\
 *
 Description:
	Configuration & Documentation
\*____________________________________________________________________________*/
#if 0
	/*
	** HTML documentation for this handler
	*/
/*___+++HTMLDOC_BEGIN+++___*/
Name:
	StatusCode

Description:
	Cause the given status code to be set for this handler.

Options:
<H5>Overview</H5>
<TABLE BORDER=1>
<TH>Option
<TH>Default
<TH>Values
<TH>Short Description
<TH>Example(s)

<TR>
<TD>StatusCode
<TD>+
<TD>An HTTP response code in 3 digital decimal form
<TD>Specify  an HTTP reponse code to be set
<TD>StatusCode="403"

</TABLE>
<STRONG>-</STRONG> in the <IT>default</IT> indicates no default<BR>
<STRONG>+</STRONG> in the <IT>default</IT> indicates the field is mandatory<BR>

<H4>Description of Options</H4>
<H5>
	StatusCode
</H5>
Specifies the status code to be set by this handler.

Phase:
	Any

Returns:
	PIAPI_COMPLETED.

Note:
Example:
	<PRE>
	&lt;Object&gt;
		Name StatusCode
		Class StatusCodeClass
	&lt;/Object&gt;

	&lt;Object&gt;
		...
		CheckAccess StatusCode StatusCode="403"
		...
	&lt;/Object&gt;

	</PRE>
/*___+++HTMLDOC_END+++___*/
#endif

/*____________________________________________________________________________*\
 *
 Description:
\*____________________________________________________________________________*/
#define KEY_CONF_STATUSCODE		"StatusCode"
#define KEY_CONF_CONDITION		"Condition"
#define KEY_CONF_FLAGS			"Flags"
#define VALUE_INVERTCONDITION	"InvertCondition"
#define VALUE_ORCONDITIONS		"OrConditions"
#define FLAG_INVERTCONDITION	0x0001
#define FLAG_ORCONDITIONS		0x0002

/*____________________________________________________________________________*\
 *
 Class:
 Description:
\*____________________________________________________________________________*/
class StatusCode : public HandlerBaseHTTP
{
private:
	/* --- forbid copy constructor --- */
	StatusCode( const StatusCode &t )
	: HandlerBaseHTTP( t )
		{ assert( 0 ); };

	/* ---
	Configuration data
	--- */
	DblList lConditions;			/* --- conditions --- */
	int iStatusCode;				/* --- status code to set --- */
	const char *pStatusCode;		/* --- for checking if status was set --- */
	int iFlags;						/* --- flags --- */

protected:
	int Parameter( const char *pVariable, const char *pValue,
		const char *pWhere )
		{
		assert( pVariable && pValue );
		PIOStrStream os;
		os << pWhere << "StatusCode: ";
		if ( !PIUtil_stricmp( KEY_CONF_CONDITION, pVariable ) )
			{
			Pi3String *pError = Pi3String_new( 0 );
			Pi3Expression *pExpr = Pi3Expression_new( pValue, 0, pError );
			if ( !pExpr )
				{
				os << Pi3String_getPtr( pError ) << ends;
				Pi3String_delete( pError );
				CONFIG_ERR( Object(), os.str() );
				delete pExpr;
				pExpr = 0;
				return 0;
				};
			Pi3String_delete( pError );
			lConditions.Append( (DblList::type)pExpr );
			}
		else if ( !PIUtil_stricmp( KEY_CONF_STATUSCODE, pVariable ) )
			{
			iStatusCode = atoi( pValue );
			pStatusCode = pValue;
			}
		else if ( !PIUtil_stricmp( KEY_CONF_FLAGS, pVariable ) )
			{
			if ( !PIUtil_stricmp( VALUE_INVERTCONDITION, pValue ) )
				{ iFlags |= FLAG_INVERTCONDITION; }
			else if ( !PIUtil_stricmp( VALUE_ORCONDITIONS, pValue ) )
				{ iFlags |= FLAG_ORCONDITIONS; }
			else
				{
				os << "Unknown flag '" << pValue << "'" << ends;
				CONFIG_ERR( Object(), os.str() );
				return 0;
				};
			}
		else
			{
			os << "Unknown directive '" << pVariable << "'" << ends;
			CONFIG_ERR( Object(), os.str() );
			return 0;
			};

		return 1;
		};

public:
	StatusCode( PIObject *pObject, int iArgc, const char *ppArgv[] )
	:	HandlerBaseHTTP( pObject ), iStatusCode( 0 ), pStatusCode( 0 ),
		iFlags( 0 )
		{
		ReadParameters( iArgc, ppArgv );
		if ( !pStatusCode )
			{
			CONFIG_ERR( Object(), "StatusCode: 'StatusCode' not \
defined" );
			SetOK( 0 );
			return;
			};
		};

	~StatusCode()
		{
		for( DblListIterator i( lConditions ); !i.BadIndex(); i++ )	
			{ Pi3Expression_delete( (Pi3Expression *)i.Current() ); };
		};

	/* ---
	Handle request
	--- */
	int Handle( int /* iPhase */, PIHTTP &tPIHTTP, PIIOBuffer &/* tB */ )
		{
		/* ---
		Check preconditions
		--- */
		bool bCondition = !(iFlags & FLAG_ORCONDITIONS);
		for( DblListIterator i( lConditions ); !i.BadIndex(); i++ )
			{
			Pi3Expression *pExpr = (Pi3Expression *)i.Current();
			int iExpr = Pi3Expression_write( pExpr, &tPIHTTP, 0, 0, 0 );
			if ( iFlags & FLAG_ORCONDITIONS )
				{
				if ( iExpr )
					{ bCondition = true; break; };
				}
			else
				{
				if ( !iExpr )
					{ bCondition = false; break; };
				};
			};

		/* --- apply invert flag, if any --- */
		if ( iFlags & FLAG_INVERTCONDITION )
			{ bCondition  = !bCondition; };

		/* ---
		Check if condition satisfied
		--- */
		if ( !bCondition )
			{ return PIAPI_CONTINUE; };

		/* ---
		Set the status code and return
		--- */
        return HTTPUtil_doHTTPError( &tPIHTTP, iStatusCode );
		};
};

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int StatusCode_constructor( PIObject *pObj,
	int iArgc, const char *ppArgv[] )
{
	return HandlerBaseHTTP_constructor( pObj, PI_NEW( StatusCode( pObj,
		iArgc, ppArgv ) ) );
}

#if 0
/*___+++CNF_BEGIN+++___*/
	<Class>
		Name StatusCodeClass
		Type LogicExtension
		Library HTTP
		OnClassLoad HandlerBaseHTTP_onClassLoad
		Constructor StatusCode_constructor
		CopyConstructor HandlerBaseHTTP_copyConstructor
		Destructor HandlerBaseHTTP_destructor
		Execute HandlerBaseHTTP_execute
	</Class>

	<Object>
		Name StatusCode
		Class StatusCodeClass
	</Object>

/*___+++CNF_END+++___*/
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -