📄 mischand.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>
<Object>
Name ReturnCode
Class ReturnCodeClass
</Object>
<Object>
...
CheckAuth ReturnCode ReturnCode="COMPLETED"
...
</Object>
</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>
<Object>
Name StatusCode
Class StatusCodeClass
</Object>
<Object>
...
CheckAccess StatusCode StatusCode="403"
...
</Object>
</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 + -