richter 02/01/09 07:26:21
Modified: . Tag: Embperl2c epdat2.h epinit.c
Log:
data structure rewrite
Revision Changes Path
No revision
No revision
1.1.2.2 +35 -38 embperl/Attic/epdat2.h
Index: epdat2.h
===================================================================
RCS file: /home/cvs/embperl/Attic/epdat2.h,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- epdat2.h 8 Jan 2002 15:47:13 -0000 1.1.2.1
+++ epdat2.h 9 Jan 2002 15:26:21 -0000 1.1.2.2
@@ -53,6 +53,8 @@
SV * pInput ;
SV * pOutput ;
char * sSub ; /* subroutine to call */
+ int nImport ;
+ int nFirstLine ;
} tComponentParam ;
@@ -62,6 +64,15 @@
HV * pApplications ; /**< Hash with available applications */
tReq * pCurrReq ; /**< Current running request if any */
pid_t nPid ; /**< process/thread id */
+
+ /* --- Embperl special hashs/arrays --- */
+
+ HV * pEnvHash ; /* environement from CGI Script */
+ HV * pFormHash ; /* Formular data */
+ HV * pFormSplitHash ; /* Formular data split up at \t */
+ HV * pInputHash ; /* Data of input fields */
+ AV * pFormArray ; /* Fieldnames */
+ HV * pHeaderHash ;/* http headers */
} tThreadData ;
@@ -78,6 +89,10 @@
#endif
SV * pUserSession ; /**< user session object */
SV * pStateSession ; /**< state session object */
+
+ HV * pUserHash ; /* Session User data */
+ HV * pStateHash ; /* Session State data */
+ HV * pModHash ; /* Module data */
} tApp ;
@@ -85,75 +100,48 @@
{
SV * pReqSV ; /* The perl reference to this request structure */
+#ifdef PERL_IMPLICIT_CONTEXT
+ pTHX ; /* pointer to Perl interpreter */
+#endif
+
#ifdef APACHE
request_rec * pApacheReq ; /* apache request record */
SV * pApacheReqSV ;
#endif
tReqConfig ReqConfig ; /**< request configuration data */
+ tReqParam ReqParam ; /**< request parameter data */
tApp * pApp ;
tThreadData * pThread ;
- int nRequestCount ; /**< increments by one on each request */
- time_t nRequestTime ; /**< time when request starts */
-
- int nSessionMgnt ; /* how to retrieve the session id */
- char * sSessionID ; /* stores session name and id for status session
data */
-
char * sUnparsedUri ;
char * sUri ;
char * sPathInfo ;
char * sQueryInfo ;
- int bExit ; /**< We should exit the request */
-
- /* --- memory management --- */
-
- size_t nAllocSize ; /* Alloced memory for debugging */
+ int nRequestCount ; /**< increments by one on each request */
+ time_t nRequestTime ; /**< time when request starts */
- long nLogFileStartPos ; /* file position of logfile, when logfile started */
+ int nSessionMgnt ; /* how to retrieve the session id */
+ char * sSessionID ; /* stores session name and id for status session
data */
- /* --- keep track of errors --- */
+ int bExit ; /**< We should exit the request */
+ long nLogFileStartPos ; /**< file position of logfile, when logfile started
*/
bool bError ; /* Error has occured somewhere */
- I32 nLastErrFill ; /* last size of error array */
- int bLastErrState ; /* last state of error flag */
AV * pErrArray ; /* Errors to show on Error response */
- AV * pErrFill ; /* AvFILL of pErrArray, index is nMarker */
- AV * pErrState ; /* bError, index is nMarker */
-
- /* Everything after here will not automaticly set to zero */
- int zeroend ;
char errdat1 [ERRDATLEN] ; /* Additional error information */
char errdat2 [ERRDATLEN] ;
char lastwarn [ERRDATLEN] ; /* last warning */
- /* --- Embperl special hashs/arrays --- */
-
- HV * pEnvHash ; /* environement from CGI Script */
- HV * pFormHash ; /* Formular data */
- HV * pFormSplitHash ; /* Formular data split up at \t */
- HV * pInputHash ; /* Data of input fields */
- AV * pFormArray ; /* Fieldnames */
- HV * pUserHash ; /* Session User data */
- HV * pStateHash ; /* Session State data */
- HV * pModHash ; /* Module data */
- HV * pHeaderHash ;/* http headers */
-#ifdef EP2
AV * pDomTreeAV ; /* holds all DomTrees alocated during the request */
AV * pCleanupAV ; /* set all sv's that are conatined in that array to undef
after the whole request */
-#endif
/* --- for statistics --- */
clock_t startclock ;
I32 stsv_count ;
- I32 stsv_objcount ;
- I32 lstsv_count ;
- I32 lstsv_objcount ;
- int numEvals ;
- int numCacheHits ;
#if defined (_DEBUG) && defined (WIN32)
_CrtMemState MemCheckpoint ; /* memory leak debugging */
@@ -188,6 +176,15 @@
bool bEP1Compat ; /* run in Embperl 1.x compatible mode */
tPhase nPhase ; /* which phase of the request we are in */
+
+ char * pCurrPos ; /* Current position in html file */
+ int nSourceline ; /* Currentline in sourcefile */
+ char * pSourcelinePos ; /* Positon of nSourceline in sourcefile */
+ char * pLineNoCurrPos ; /* save pCurrPos for line no calculation */
+
+ char * sEvalPackage ; /* Package for eval (normaly same sCurrPackage,
+ differs when running in a safe namespace */
+ STRLEN nEvalPackage ; /* Package for eval (length) */
/* --- DomTree ---*/
1.1.2.2 +544 -165 embperl/Attic/epinit.c
Index: epinit.c
===================================================================
RCS file: /home/cvs/embperl/Attic/epinit.c,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- epinit.c 8 Jan 2002 15:47:13 -0000 1.1.2.1
+++ epinit.c 9 Jan 2002 15:26:21 -0000 1.1.2.2
@@ -1,8 +1,4 @@
-#define EMBPERL_APP_PACKAGE "HTML::Embperl::Application"
-#define EMBPERL_REQ_PACKAGE "HTML::Embperl::Req"
-#define EMBPERL_THREAD_PACKAGE "HTML::Embperl::Thread"
-
#if !defined (pTHX) || pTHX == ""
@@ -13,6 +9,28 @@
#endif
+#define EMBPERL_PACKAGE_POSTFIX "2"
+#define EMBPERL_PACKAGE "HTML::Embperl"EMBPERL_PACKAGE_POSTFIX
+
+
+#define EMBPERL_APP_PACKAGE EMBPERL_PACKAGE"::Application"
+#define EMBPERL_REQ_PACKAGE EMBPERL_PACKAGE"::Req"
+#define EMBPERL_THREAD_PACKAGE EMBPERL_PACKAGE"::Thread"
+
+#define EMBPERL_FDAT_NAME EMBPERL_PACKAGE"::fdat"
+#define EMBPERL_SPLIFDAT_NAME EMBPERL_PACKAGE"::splitfdat"
+#define EMBPERL_FFLD_NAME EMBPERL_PACKAGE"::ffld"
+#define EMBPERL_HDR_NAME EMBPERL_PACKAGE"::http_headers_out"
+#define EMBPERL_IDAT_NAME EMBPERL_PACKAGE"::idat"
+#define EMBPERL_ENV_NAME "ENV"
+
+
+static char sUserHashName [] = "HTML::Embperl::udat" ;
+static char sStateHashName [] = "HTML::Embperl::sdat" ;
+static char sModHashName [] = "HTML::Embperl::mdat" ;
+
+
+
/*---------------------------------------------------------------------------
* embperl_SetupThread
*/
@@ -62,6 +80,26 @@
pThread -> pThreadSV = newRV_noinc ((SV *)pThreadHV) ;
pThread -> nPid = getpid () ;
pThread -> pApplications = newHV ;
+
+
+ if ((pThread ->pFormHash = perl_get_hv (EMBPERL_FDAT_NAME, TRUE)) == NULL)
+ LogError (r, rcHashError) ;
+
+ if ((pThread ->pFormSplitHash = perl_get_hv (EMBPERL_SPLIFDAT_NAME, TRUE))
== NULL)
+ LogError (r, rcHashError) ;
+
+ if ((pThread ->pFormArray = perl_get_av (EMBPERL_FFLD_NAME, TRUE)) == NULL)
+ LogError (r, rcArrayError) ;
+
+ if ((pThread ->pHeaderHash = perl_get_hv (EMBPERL_HDR_NAME, TRUE)) == NULL)
+ LogError (r, rcHashError) ;
+
+ if ((pThread ->pInputHash = perl_get_hv (EMBPERL_IDAT_NAME, TRUE)) == NULL)
+ LogError (r, rcHashError) ;
+
+ if ((pThread ->pEnvHash = perl_get_hv (EMBPERL_ENV_NAME, TRUE)) == NULL)
+ LogError (r, rcHashError) ;
+
}
return pThread ;
@@ -111,7 +149,7 @@
pApp -> pAppSV = newRV_noinc ((SV *)pAppHV) ;
sv_bless (pApp -> pAppSV, gv_stashpv (EMBPERL_APP_PACKAGE, 0)) ;
- memcpy (pApp -> AppConfig, pAppCfg, sizeof (*pApp -> AppConfig)) ;
+ memcpy (&pApp -> AppConfig, pAppCfg, sizeof (pApp -> AppConfig)) ;
pApp -> pThread = pThread ;
@@ -122,46 +160,327 @@
LogError (NULL, rc) ;
}
}
+
+
+ /*
+ if ((pApp ->pUserHash = perl_get_hv (sUserHashName, TRUE)) == NULL)
+ {
+ LogError (r, rcHashError) ;
+ }
+
+ if ((pApp ->pStateHash = perl_get_hv (sStateHashName, TRUE)) == NULL)
+ {
+ LogError (r, rcHashError) ;
+ }
+
+ if ((pApp ->pModHash = perl_get_hv (sModHashName, TRUE)) == NULL)
+ {
+ LogError (r, rcHashError) ;
+ }
+ */
+
+
}
return pApp ;
}
+/*---------------------------------------------------------------------------
+* embperl_GetFormData
+*/
+/*!
+*
+* \_en
+* Takes the given form data and put them in %fdat/@ffld
+* \endif
+*
+* \_de
+* Nimmt die �bergebenen Formulardaten und legt sie in %fdat/@ffld ab
+* \endif
+*
+* ------------------------------------------------------------------------ */
+static int embperl_GetFormData (/*i/o*/ register req * r,
+ /*in*/ char * pQueryString,
+ /*in*/ int nLen)
+ {
+ int num ;
+ char * p ;
+ char * pMem ;
+ int nVal ;
+ int nKey ;
+ char * pKey ;
+ char * pVal ;
+ SV * pSVV ;
+ SV * pSVK ;
+ SV * * ppSV ;
+
+ AV * pFormArray = r -> pThread -> pFormArray ;
+ HV * pFormHash = r -> pThread -> pFormHash ;
+ HV * pFormSplitHash = r -> pThread -> pFormSplitHash ;
+ bool bAll = r -> pComponent -> ComponentConfig.bOptions &
optAllFormData ;
+ bool bDebug = r -> pComponent -> ComponentConfig.bDebug & dbgForm ;
+
+ hv_clear (pFormHash) ;
+ hv_clear (pFormSplitHash) ;
+ av_clear (pFormArray) ;
+ av_clear (pInputHash) ;
+
+ if (nLen == 0)
+ return ok ;
+
+ if ((pMem = _malloc (r, nLen + 4)) == NULL)
+ return rcOutOfMemory ;
+
+ p = pMem ;
-/* ---------------------------------------------------------------------------- */
-/* */
-/* Setup Request */
-/* */
-/* ---------------------------------------------------------------------------- */
+ nKey = nVal = 0 ;
+ pKey = pVal = p ;
+ while (1)
+ {
+ switch (nLen > 0?*pQueryString:'\0')
+ {
+ case '+':
+ pQueryString++ ;
+ nLen-- ;
+ *p++ = ' ' ;
+ break ;
+
+ case '%':
+ pQueryString++ ;
+ nLen-- ;
+ num = 0 ;
+ if (*pQueryString)
+ {
+ if (toupper (*pQueryString) >= 'A')
+ num += (toupper (*pQueryString) - 'A' + 10) << 4 ;
+ else
+ num += ((*pQueryString) - '0') << 4 ;
+ pQueryString++ ;
+ }
+ if (*pQueryString)
+ {
+ if (toupper (*pQueryString) >= 'A')
+ num += (toupper (*pQueryString) - 'A' + 10) ;
+ else
+ num += ((*pQueryString) - '0') ;
+ pQueryString++ ;
+ nLen-- ;
+ }
+ *p++ = num ;
+ break ;
+ case '=':
+ nKey = p - pKey ;
+ *p++ = r -> pReqConfig.cMultFieldSep ;
+ nVal = 0 ;
+ pVal = p ;
+ pQueryString++ ;
+ nLen-- ;
+ break ;
+ case ';':
+ case '&':
+ pQueryString++ ;
+ nLen-- ;
+ case '\0':
+ nVal = p - pVal ;
+ *p++ = '\0' ;
+
+ if (nKey > 0 && (nVal > 0 || (bAll)))
+ {
+ char * sid = NULL ;
+ if (r -> pConf)
+ sid = r -> pApp -> AppConfig.sCookieName ;
+ if (sid)
+ { /* remove session id */
+ if (strncmp (pKey, sid, nKey) != 0)
+ sid = NULL ;
+ }
+
+ if (sid == NULL)
+ { /* field is not the session id */
+ if (pVal > pKey)
+ pVal[-1] = '\0' ;
+
+ if ((ppSV = hv_fetch (pFormHash, pKey, nKey, 0)))
+ { /* Field exists already -> append separator and field
value */
+ sv_catpvn (*ppSV, r -> pReqConfig.cMultFieldSep , 1) ;
+ sv_catpvn (*ppSV, pVal, nVal) ;
+ }
+ else
+ { /* New Field -> store it */
+ pSVV = newSVpv (pVal, nVal) ;
+ if (hv_store (pFormHash, pKey, nKey, pSVV, 0) == NULL)
+ {
+ _free (r, pMem) ;
+ return rcHashError ;
+ }
+
+ pSVK = newSVpv (pKey, nKey) ;
+
+ av_push (pFormArray, pSVK) ;
+ }
+
+
+ if (bDebug)
+ lprintf (r, "[%d]FORM: %s=%s\n", r -> nPid, pKey, pVal) ;
+ }
+ }
+ pKey = pVal = p ;
+ nKey = nVal = 0 ;
+
+ if (*pQueryString == '\0')
+ {
+ _free (r, pMem) ;
+ return ok ;
+ }
+
+
+ break ;
+ default:
+ *p++ = *pQueryString++ ;
+ nLen-- ;
+ break ;
+ }
+ }
+
+ return ok ;
+ }
+
+
+/*---------------------------------------------------------------------------
+* embperl_SetupFormData
+*/
+/*!
+*
+* \_en
+* Get the posted form data and put them in %fdat/@ffld
+* \endif
+*
+* \_de
+* Lie�t die formular daten ein und legt sie in %fdat/@ffld ab
+* \endif
+*
+* ------------------------------------------------------------------------ */
-tReq * embperl_SetupRequest(/*in*/ pTHX_
- /*in*/ SV * pApacheReqSV,
- /*in*/ tReqConfig * pReqCfg,
- /*in*/ tApp * pApp,
- /*in*/ tReqParam * param)
+static int embperl_SetupFormData (/*i/o*/ register req * r)
+
+ {
+ char * p = NULL ;
+ char * f ;
+ int rc = ok ;
+ STRLEN len = 0 ;
+ char sLen [20] ;
+
+
+ /* print out of env set tainted, so reset it now */
+ tainted = 0 ;
+
+#ifdef APACHE
+ if (r -> pApacheReq)
+ {
+ const char * sLength = table_get(r -> pApacheReq->headers_in,
"Content-Length") ;
+ len = sLength?atoi (sLength):0 ;
+ }
+ else
+#endif
+ {
+ sLen [0] = '\0' ;
+ GetHashValue (r -> pThread -> pEnvHash, "CONTENT_LENGTH", sizeof (sLen) - 1,
sLen) ;
+ len = atoi (sLen) ;
+ }
+
+ if (len == 0)
+ {
+ p = r -> sQueryString ;
+ len = strlen (p) ;
+ f = NULL ;
+ }
+ else
+ {
+ if ((p = _malloc (r, len + 1)) == NULL)
+ return rcOutOfMemory ;
+
+ if ((rc = OpenInput (r, NULL)) != ok)
+ {
+ _free (r, p) ;
+ return rc ;
+ }
+ iread (r, p, len) ;
+ CloseInput (r) ;
+
+ p[len] = '\0' ;
+ f = p ;
+ }
+
+ if (r -> pComponent -> bDebug)
+ lprintf (r, "[%d]Formdata... length = %d\n", r -> pThread -> nPid, len) ;
+
+ rc = GetFormData (r, p, len) ;
+
+ if (len > 0 && f)
+ {
+ r -> sQueryInfo = f ;
+ f[len] = '\0' ;
+ }
+
+ return rc ;
+ }
+
+
+
+/*---------------------------------------------------------------------------
+* embperl_SetupRequest
+*/
+/*!
+*
+* \_en
+* setup data for (http-)request object
+* \endif
+*
+* \_de
+* Initialisiert das Requestobjekt
+* \endif
+*
+* ------------------------------------------------------------------------ */
+
+
+int embperl_SetupRequest (/*in*/ pTHX_
+ /*in*/ SV * pApacheReqSV,
+ /*in*/ tReqConfig * pReqCfg,
+ /*in*/ tApp * pApp,
+ /*out*/tReq * * ppReq)
{
- int rc ;
- tReq * r ;
- char * sMode ;
- tFile * pFile ;
- HV * pReqHV ;
-#ifdef EP2
- SV * * ppSV ;
- STRLEN len ;
-#endif
+ int rc ;
+ tReq * r ;
+ HV * pReqHV ;
+ tThreadData * pThread ;
+
#ifdef APACHE
request_rec * pApacheReq = r -> pApacheReq ;
#endif
- tThreadData * pThread ;
r = malloc (sizeof (*r)) ;
+ r -> startclock = clock () ;
+ r -> stsv_count = sv_count ;
+
+#ifdef PERL_IMPLICIT_CONTEXT
+ r -> pPerlTHX = aTHX ;
+#endif
+
+#if defined (_DEBUG) && defined (WIN32)
+ _CrtMemCheckpoint(&r -> MemCheckpoint);
+#endif
+#ifdef DMALLOC
+ r -> MemCheckpoint = dmalloc_mark () ;
+#endif
+
+
pReqHV = newHV () ;
sv_magic ((SV *)pReqHV, NULL, '~', (char *)&r, sizeof (r)) ;
r -> pReqSV = newRV_noinc ((SV *)pReqHV) ;
@@ -176,26 +495,11 @@
#endif
- memcpy (r -> pReqConfig, pReqCfg, sizeof (*r -> pReqConfig)) ;
+ memcpy (&r -> ReqConfig, pReqCfg, sizeof (r -> ReqConfig)) ;
r -> pApp = pApp ;
pThread = r -> pThread = pApp -> pThread ;
- r -> nPhase = phInit ;
-
-#if defined (_DEBUG) && defined (WIN32)
- _CrtMemCheckpoint(&r -> MemCheckpoint);
-#endif
-#ifdef DMALLOC
- r -> MemCheckpoint = dmalloc_mark () ;
-#endif
-
- r -> startclock = clock () ;
- r -> stsv_count = sv_count ;
- r -> stsv_objcount = sv_objcount ;
- r -> lstsv_count = sv_count ;
- r -> lstsv_objcount = sv_objcount ;
-
#ifdef APACHE
if (pApacheReq)
{
@@ -213,166 +517,241 @@
r -> sQueryInfo = GetHashValueStr (pThread -> pEnvHash, "QUERY_INFO", "")
;
}
-
- ppSV = hv_fetch(r -> pEnvHash, "PATH_INFO", sizeof ("PATH_INFO") - 1, 0) ;
- if (ppSV)
- r -> sPathInfo = SvPV (*ppSV ,len) ;
- r -> pTokenTable = pTokenTable ;
-#else
- r -> pTokenTable = (void *)pTokenTable ;
-#endif
- if (rc != ok)
- r -> bDebug = 0 ; /* Turn debbuging off, only errors will go to stderr if
logfile not open */
- r -> bOptions = pReqCfg -> bOptions ;
- /*r -> nIOType = InitialReq.nIOType ;*/
- if (r -> pApplication)
- {
- SvREFCNT_inc (r -> pApplication) ;
- }
+ r -> nRequestCount = nRequestCount++ ;
+ r -> nRequestTime = time(NULL) ;
- r -> sSubName = sSubName ;
- r -> nSessionMgnt = nSessionMgnt ;
- r -> pReqCfg = pReqCfg ;
- r -> nInsideSub = 0 ;
- r -> bExit = 0 ;
+ r -> pErrArray = newAV () ;
+ r -> pDomTreeAV = newAV () ;
+ r -> pCleanupAV = newAV () ;
- r -> nRequestCount = nRequestCount++ ;
- r -> nRequestTime = time(NULL) ;
- getcwd (r->sCWD, sizeof (r->sCWD)-1) ;
- r -> sResetDir[0] = '\0' ;
- r -> pOutData = pOut ;
- r -> pInData = pIn ;
+ r -> bExit = 0 ;
+ r -> bError = 0 ;
+ r -> errdat1 [0] = '\0' ; /* Additional error information */
+ r -> errdat2 [0] = '\0' ;
+ r -> lastwarn [0] = '\0' ; /* last warning */
- r -> pFiles2Free = NULL ;
- if (r -> bSubReq && sSourcefile[0] == '?' && sSubName && sSubName[0] != '\0')
- {
- pFile = r -> pLastReq -> Buf.pFile ;
- r -> bOptions |= optDisableChdir ;
- }
- else
- {
- if ((pFile = SetupFileData (r, sSourcefile, mtime, nFilesize, nFirstLine,
pReqCfg)) == NULL)
- return NULL ;
- }
- if (r -> bSubReq && sOutputfile[0] == 1 && r -> pLastReq && !SvROK (pOut))
- {
- r -> sOutputfile = r -> pLastReq -> sOutputfile ;
- r -> bAppendToMainReq = TRUE ;
- }
- else
- {
- if (sOutputfile[0] == 1)
- r -> sOutputfile = "" ;
- else
- r -> sOutputfile = sOutputfile ;
- r -> bAppendToMainReq = FALSE ;
- }
+ /*
+ int nSessionMgnt ;
+ char * sSessionID ;
+ */
+
+ r -> nLogFileStartPos = GetLogFilePos (pApp) ;
+
+
+ hv_clear (pThread -> pHeaderHash) ;
+
+ embperl_SetupFormData (r) ;
+
+ ppReq = r ;
+
+ return ok ;
+ }
- r -> bReqRunning = 0 ;
+/*---------------------------------------------------------------------------
+* embperl_SetupComponent
+*/
+/*!
+*
+* \_en
+* setup data for component object
+* \endif
+*
+* \_de
+* Initialisiert das Component-Objekt
+* \endif
+*
+* ------------------------------------------------------------------------ */
- r -> Buf.pFile = pFile ;
- r -> pOutData = pOut ;
- r -> pInData = pIn ;
+int embperl_SetupComponent (/*in*/ tReq * r,
+ /*in*/ tComponentConfig * pComponentCfg,
+ /*in*/ tComponentParam * pComponentParam,
+ /*out*/tComponent * * ppComponent)
+
+
+ {
+ tComponent * c = _malloc (r, sizeof (*c)) ;
+
+ memset (c, 0, sizeof (*c)) ;
+
+ c -> pLast = r -> pComponent ;
+ r -> pComponent = c ;
+
+
+ memcpy (&c -> ComponentConfig, pComponentCfg, sizeof (c -> ComponentConfig)) ;
+ memcpy (&c -> ComponentParam, pComponentParam, sizeof (c -> ComponentParam)) ;
- r -> CmdStack.State.nCmdType = cmdNorm ;
- r -> CmdStack.State.bProcessCmds = cmdAll ;
- r -> HtmlStack.State.nCmdType = cmdNorm ;
- r -> HtmlStack.State.bProcessCmds = cmdAll ;
- r -> nTabMode = epTabRowDef | epTabColDef ;
- r -> nTabMaxRow = 100 ;
- r -> nTabMaxCol = 10 ;
+
+ getcwd (c->sCWD, sizeof (c->sCWD)-1) ;
+#ifdef WIN32
+ c -> nCWDrive = _getdrive () ;
+#endif
+ if ((rc = embperl_GetSyntax (c -> ComponentConfig.sSyntax, r -> pTokenTable))
!= ok)
+ return rc ;
- r -> nEscMode = pReqCfg -> nEscMode ;
+ c -> nInsideSub = 0 ;
+ c -> bExit = 0 ;
+ c -> nPhase = phInit ;
+ c -> bReqRunning = 0 ;
NewEscMode (r, NULL) ;
- r -> bEscModeSet = 0 ;
+ c -> bEscModeSet = 0 ;
- if (r -> bOptions & optSafeNamespace)
- {
- r -> Buf.sEvalPackage = "main" ;
- r -> Buf.nEvalPackage = sizeof ("main") - 1 ;
- }
- else
- {
- r -> Buf.sEvalPackage = r -> Buf.pFile -> sCurrPackage ;
- r -> Buf.nEvalPackage = r -> Buf.pFile -> nCurrPackage ;
- }
-
- if (sImport && *sImport)
+ if (c -> ComponentParam.nImport >= 0)
{
+ char code[40] ;
+ SV * pSVImport ;
+ char * sImport ;
+
+ sprintf (code, "caller(%d)", c -> ComponentParam.nImport>0?c ->
ComponentParam.nImport:0) ;
+ /* there is no c api to the caller function, eval it... */
+ pSVImport = eval_pv(code, 0) ;
+ sImport = SvPV_nolen (pSVImport) ;
- if ((r -> pImportStash = gv_stashpv (sImport, 0)) == NULL)
+ if ((c -> pImportStash = gv_stashpv (sImport, 0)) == NULL)
{
strncpy (r -> errdat1, sImport, sizeof (r -> errdat1) - 1);
LogError (r, rcImportStashErr) ;
}
- r -> bOptions |= optDisableHtmlScan ;
}
else
- r -> pImportStash = NULL ;
+ c -> pImportStash = NULL ;
+
+ c -> nSourceline = c -> ComponentConfig.nFirstLine ;
+ c -> pSourcelinePos = NULL ;
+ c -> pLineNoCurrPos = NULL ;
- r -> Buf.nSourceline = r -> Buf.pFile -> nFirstLine ;
- r -> Buf.pSourcelinePos = NULL ;
- r -> Buf.pLineNoCurrPos = NULL ;
+ c -> bStrict = FALSE ;
- r -> bStrict = FALSE ;
+ *ppComponent = c ;
+
+ return ok ;
+ }
+
+
+
+/*---------------------------------------------------------------------------
+* embperl_LogStartReq
+*/
+/*!
+*
+* \_en
+* Log request startup, headers and environment
+* \endif
+*
+* \_de
+* Logged den Requeststart, HTTP-Header und Umgebungsvariablen
+* \endif
+*
+* ------------------------------------------------------------------------ */
+
+
+static void embperl_LogStartReq (/*i/o*/ req * r)
+
+ {
- r -> errdat1 [0] = '\0' ; /* Additional error information */
- r -> errdat2 [0] = '\0' ;
- r -> lastwarn [0] = '\0' ; /* last warning */
- if (!r -> bSubReq)
+ if (r -> pComponent -> ComponentConfig.bDebug)
{
- r -> bError = FALSE ;
- av_clear (r -> pErrFill) ;
- av_clear (r -> pErrState) ;
- av_clear (r -> pErrArray) ;
- hv_clear (r -> pHeaderHash) ;
- r -> nLastErrFill = AvFILL(r -> pErrArray) ;
- r -> bLastErrState = r -> bError ;
- r -> nLogFileStartPos = GetLogFilePos (r) ;
+ lprintf (r, "[%d]REQ: Start Request at %s\n", r -> nPid, ctime
(time(NULL))) ;
+#ifdef DMALLOC
+ dmalloc_message ("[%d]REQ: Start Request at %s\n", r -> nPid, ctime
(time(NULL))) ;
+#endif
}
- if (r -> bDebug)
+
+#ifdef APACHE
+ if (r -> pApacheReq && (r -> pComponent -> ComponentConfig.bDebug &
dbgHeadersIn))
{
- time_t t ;
- struct tm * tm ;
- time (&t) ;
- tm =localtime (&t) ;
- if (!r -> bSubReq)
- lprintf (r, "[%d]REQ: Embperl %s starting... %s\n", r -> nPid, sVersion,
asctime(tm)) ;
- r -> numEvals = 0 ;
- r -> numCacheHits = 0 ;
+ int i;
+ array_header *hdrs_arr;
+ table_entry *hdrs;
+
+ hdrs_arr = table_elts (r -> pApacheReq->headers_in);
+ hdrs = (table_entry *)hdrs_arr->elts;
+
+ lprintf (r, "[%d]HDR: %d\n", r -> nPid, hdrs_arr->nelts) ;
+ for (i = 0; i < hdrs_arr->nelts; ++i)
+ if (hdrs[i].key)
+ lprintf (r, "[%d]HDR: %s=%s\n", r -> nPid, hdrs[i].key,
hdrs[i].val) ;
}
-
- if (r -> bDebug)
+#endif
+ if (r -> pComponent -> ComponentConfig.bDebug & dbgEnv)
{
- switch (r -> nIOType)
+ SV * psv ;
+ HE * pEntry ;
+ char * pKey ;
+ I32 l ;
+ int savewarn = dowarn ;
+ dowarn = 0 ; /* no warnings here */
+
+ hv_iterinit (r -> pThread -> pEnvHash) ;
+ while ((pEntry = hv_iternext (r -> pThread -> pEnvHash)))
{
- case epIOMod_Perl: sMode = "mod_perl"; break ;
- case epIOPerl: sMode = "Offline"; break ;
- case epIOCGI: sMode = "CGI-Script"; break ;
- case epIOProcess: sMode = "Demon"; break ;
- default: sMode = "unknown" ; break ;
+ pKey = hv_iterkey (pEntry, &l) ;
+ psv = hv_iterval (r -> pThread -> pEnvHash, pEntry) ;
+
+ lprintf (r, "[%d]ENV: %s=%s\n", r -> pThread -> nPid, pKey, SvPV
(psv, na)) ;
}
-
- lprintf (r, "[%d]REQ: %s %s ", r -> nPid, (r -> bOptions &
optSafeNamespace)?"SafeNamespace":"No Safe Eval", (r -> bOptions &
optOpcodeMask)?"OpcodeMask":"All Opcode allowed") ;
-#ifdef EP2
- lprintf (r, " mode = %s (%d) %s recipe = %s\n", sMode, r -> nIOType, r ->
bEP1Compat?"EP 1.x":"EP 2.x", r -> pReqCfg -> sRecipe) ;
-#else
- lprintf (r, " mode = %s (%d)\n", sMode, r -> nIOType) ;
-#endif
- lprintf (r, "[%d]REQ: Package = %s\n", r -> nPid, r -> Buf.pFile ->
sCurrPackage) ;
-#ifdef DMALLOC
- dmalloc_message ("[%d]REQ: Package = %s File = %s\n", r -> nPid, r ->
Buf.pFile -> sCurrPackage, r -> Buf.pFile -> sSourcefile) ;
-#endif
+ dowarn = savewarn ;
}
- return r ;
+ }
+
+
+/*---------------------------------------------------------------------------
+* embperl_InitRequest
+*/
+/*!
+*
+* \_en
+* Initialize all necessary data structures to start a request like thread,
+* application and request object
+* \endif
+*
+* \_de
+* Initialisiert alle n�tigen Datenstrukturen um den Request zu starten, wie
+* Thread-, Applikcation und Request-Objekt.
+* \endif
+*
+* ------------------------------------------------------------------------ */
+
+
+
+
+void embperl_InitRequest (/*in*/ pTHX_
+ /*in*/ SV * pApacheReqSV,
+ /*in*/ tReqConfig * pReqCfg,
+ /*in*/ tApp * pApp,
+ /*out*/tReq * * ppReq)
+
+
+ {
+ tThreadData * pThread ;
+ tApp * pApp ;
+ tReq * r ;
+
+ /* get our thread object */
+ if ((rc = embperl_SetupThread (aTHX_ &pThread)) != ok)
+ return rc ;
+
+
+ /* get the application object */
+ if ((rc = embperl_SetupApp (aTHX_ pThread, pAppCfg, pHVParam, &pApp)) != ok)
+ return rc ;
+
+
+ /* and setup the request object */
+ if ((rc = embperl_SetupRequest (aTHX_ pSVApache, pApp, pReqCfg, &r)) != ok)
+ return rc ;
+
+
+ *ppReq = r ;
+
+ embperl_LogStartRequest (r) ;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]