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

📄 jsphandler.cpp

📁 mini http server,可以集成嵌入到程序中,实现简单的web功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	JspCompilerClass = env->FindClass("org/pi3/jsp/core/Pi3JspCompiler");
	if (!JspCompilerClass) { goto init_error; }

	/* get the JspCompiler constructor */
	jmethodID JspCompilerMID;
	JspCompilerMID = env->GetMethodID(JspCompilerClass, "<init>", "()V");
	if (!JspCompilerMID) { goto init_error; };

	/* get the JspCompiler object */
	JspCompilerObject = env->NewObject( JspCompilerClass, JspCompilerMID );
	if (!JspCompilerObject) { goto init_error; };

	/* get the Pi3JspCompiler.compile method */
	jmethodID compileMID;
	compileMID = env->GetMethodID(JspCompilerClass, "compile",
		"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z");
	if (!compileMID) { goto init_error; };

    /* invoke the Pi3JspCompiler.compile method */
	jboolean bRes;
	bRes = env->CallBooleanMethod(JspCompilerObject, compileMID,
		env->NewStringUTF( (const char *)sEncoding ),
		env->NewStringUTF( (const char *)sClassPath ),
		env->NewStringUTF( (const char *)sOutputPath ),
		env->NewStringUTF( pSourcePath ));

	if (!bRes)
		{
		Log( &tPIHTTP, "Pi3JspCompiler.compile() method failed for %s.",
			pSourcePath );
		}
	else
		{
	Log( &tPIHTTP, "Pi3JspCompiler.compile() method invoked for %s.",
		pSourcePath );
		goto done;
		}

init_error:
	Exception = env->ExceptionOccurred();
	if ( Exception && ServletUtilsObject && grabStackTraceMID )
		{
		Log( &tPIHTTP, "%s: Exception occured: ", GetLogName());

		/* invoke ServletUtils.grabStackTrace */
		jstring jmsg = (jstring)env->CallObjectMethod(ServletUtilsObject,
			grabStackTraceMID, Exception);
		if (jmsg) {
			jboolean isCopy;
			const char *msg = env->GetStringUTFChars(jmsg, &isCopy);
			Log( &tPIHTTP, msg);
			HTTPCore_logError(&tPIHTTP, msg);
			env->ReleaseStringUTFChars(jmsg, msg);
			}
		else
			{
			HTTPCore_logError( &tPIHTTP, "%s: \
An unknown exception occured during invokation of java compiler.", GetLogName());
			}
		env->ExceptionDescribe();
		env->ExceptionClear();
	} else {
		HTTPCore_logError(&tPIHTTP, "%s: Check your CLASSPATH settings.",
			GetLogName());
	};

	iRet = HTTPUtil_doHTTPError(&tPIHTTP, ST_INTERNALERROR);

done:
    /* We are done. */
	if (!PIHTTP_isChild( &tPIHTTP )) {
		if (!JVM()->DetachCurrentThread()/* !jvm->DestroyJavaVM() **/) {
			Log( &tPIHTTP, "%s: JVM detached.", GetLogName());
		} else {
			Log( &tPIHTTP, "%s: Error when trying to detach JVM.", GetLogName());
		};
	};
#endif // WIN32

#ifdef POSIX
	pid_t iPid;
	PIString sEnc("-encoding");

	iPid = ::fork();
	switch( iPid )
		{
		case -1:
			break;

		case 0:
			/* ---
			This is the child
			--- */
			enum { MAX_PARAMS = 7 };
			char *ppParams[MAX_PARAMS];

			sEnc.Concatenate(sEncoding);
			if (sClassPath.Len())
				{
				ppParams[0] = (char *)(const char *)sEnc;
				ppParams[1] = "-classpath";				
				ppParams[2] = (char *)(const char *)sClassPath;
				ppParams[3] = "-d";
				ppParams[4] = (char *)(const char *)sOutputPath;
				ppParams[5] = (char *)pSourcePath;
				ppParams[6] = NULL;
				}
			else
				{
				ppParams[0] = (char *)(const char *)sEnc;
				ppParams[1] = "-d";
				ppParams[2] = (char *)(const char *)sOutputPath;
				ppParams[3] = (char *)pSourcePath;
				ppParams[4] = NULL;
				};

			if ( ::execv((const char *)sCompiler, (char *const *)ppParams)==-1 )
				{
				perror( "Java Compiler, execv() failed." );
				fprintf( stderr, "Path is '%s'\n", pSourcePath );
				fflush( stderr );
				::_exit( 1 );
				};

			/* none of the following should happen */
			::_exit( -1 );
			assert( 0 );
			break;

		default:
			/* --- this is the parent --- */
			waitpid( iPid, &iRet, WUNTRACED );

			/* --- log debug information about the process --- */
			HTTPCore_logDebug( DBG_MED, "Process created!, \n\tPid %d", iPid );
		};
#endif // POSIX
	return iRet;
}

int Jsp::Handle( int iPhase, PIHTTP &tPIHTTP, PIIOBuffer &pB/* tBuffer */ )
{
	if ( iPhase != PH_HANDLE ) return PIAPI_ERROR;
	/**
	* Assume we can't keep open connection due to
	* unknow Content-Length because of dynamic Jsp
	**/
	PIDB_replace( tPIHTTP.pConnectionDB, PIDBTYPE_OPAQUE, KEY_INT_KEEPOPEN, 0, 0 );

	PIDB *pR = tPIHTTP.pResponseDB;
	const char *pServletName = 0;
	int iRet = PIAPI_ERROR;

	PIString sServletPath;
	PIString sClassFile;
	const char *Ext;
	PIFInfo *pFI;
	PIFInfo *pTmpFI;
	// File modification times
	PIPLATFORM_TIME tJsp;
	PIPLATFORM_TIME tJava;
	PIPLATFORM_TIME tClass;

	// Ascertain Jsp name from path and compile Jsp
	const char *pPath = (const char *)PIDB_lookup( pR, PIDBTYPE_STRING,
		KEY_INT_PATH, 0 );
	if (!pPath) return PIAPI_ERROR;

	pFI = PIFInfo_new( pPath );
	
	if (!PIFInfo_exists( pFI ) || !PIFInfo_isRegular( pFI ))
		{
		PIFInfo_delete( pFI );
		return HTTPUtil_doHTTPError( &tPIHTTP,  ST_NOTFOUND );
		}

	Ext = PIFInfo_getExtension( pFI );

	if ( Ext && !PIUtil_stricmp(Ext, "jsp")) 
		{
		const char *pServletName = PIFInfo_getName( pFI );
		if ( pServletName )
			{ 
			sClassName = PIString( pServletName, strlen( pServletName ) - 4 );
			}
		else
			{
			goto init_error;
			};
		}
	else
		{
		goto init_error;
		};

	sServletPath = sSourcePath;
	sServletPath.Concatenate( PIPlatform_getDirectorySeparator() );
	sServletPath.Concatenate( sClassName );
	sServletPath.Concatenate( ".java" );

	PISync_lock( pMutex );
	tJsp = PIFInfo_getLastModified( pFI );

	pTmpFI = PIFInfo_new( (const char *)sServletPath );
	tJava = PIFInfo_getLastModified( pTmpFI );
	PIFInfo_delete( pTmpFI );

	// no java source or older than jsp source
	if ( tJsp > tJava )
		{
		JspFlexLexer scanner(pPath, sServletPath, sClassName, sExtendsName);
		iRet = scanner.exec();
		if (iRet) {
			iRet = PIAPI_ERROR;
			HTTPCore_logError( &tPIHTTP,  "Jsp parser failed for \
Input: %s, ServletPath: %s, ClassName: %s, Extends: %",
				pPath,
				(const char *)sServletPath,
				(const char *)sClassName,
				(const char *)sExtendsName
				) ;
			goto init_error;
		};
		pTmpFI = PIFInfo_new( sServletPath );
		tJava = PIFInfo_getLastModified( pTmpFI );
		PIFInfo_delete( pTmpFI );
		}

	PIFInfo_delete( pFI );

	sClassFile = sOutputPath;
	sClassFile.Concatenate( PIPlatform_getDirectorySeparator() );
	sClassFile.Concatenate( sClassName );
	sClassFile.Concatenate( ".class" );

	pFI = PIFInfo_new( (const char *)sClassFile );
	tClass = PIFInfo_getLastModified( pFI );

	// no java class or older than java source
	if ( tJava > tClass )
		{
		// call the java compiler
		iRet = Compile( tPIHTTP, sServletPath );

		if (iRet != PIAPI_COMPLETED ) {
			HTTPCore_logError( &tPIHTTP,
				"Java compiler failed for: \"%s\"", (const char *)sServletPath) ;
			goto init_error;
		};
	};

	iRet = Servlet::Handle( iPhase, tPIHTTP, pB );

init_error:
	PISync_unlock( pMutex );
	PIFInfo_delete( pFI );
	if (iRet) {
		return HTTPUtil_doHTTPError( &tPIHTTP,  ST_INTERNALERROR );
	}
	return iRet;
};


/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int Jsp_constructor( PIObject *pObj,
	int iArgc, const char *ppArgv[] )
{
	return HandlerBaseServlet_constructor( pObj, PI_NEW( Jsp( pObj,
		iArgc, ppArgv, "Jsp handler" ) ) );
}


/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int Jsp_destructor( PIObject *pObj, int,
	const char *[] )
{
	delete (Servlet *)PIObject_getUserData( pObj );
	return PIAPI_COMPLETED;
}

#if 0
/*___+++CNF_BEGIN+++___*/
	<Class>
		Name JspClass
		Type LogicExtension
		Library Servlet
		OnClassLoad HandlerBaseServlet_onClassLoad
		Constructor Jsp_constructor
		CopyConstructor HandlerBaseServlet_copyConstructor
		Destructor Jsp_destructor
		Execute HandlerBaseServlet_execute
	</Class>

	<Object>
		Name Jsp
		Class JspClass
		Context ServletContainer
	</Object>

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


⌨️ 快捷键说明

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