richter 02/02/26 00:48:43
Modified: . Tag: Embperl2c Embperl.pm ep.h epapinit.c epcfg.h
epcgiinit.c epdat2.h epeval.c epinit.c eputil.c
xsbuilder/maps Tag: Embperl2c ep_structure.map
Log:
session handling
Revision Changes Path
No revision
No revision
1.118.4.89 +44 -1 embperl/Embperl.pm
Index: Embperl.pm
===================================================================
RCS file: /home/cvs/embperl/Embperl.pm,v
retrieving revision 1.118.4.88
retrieving revision 1.118.4.89
diff -u -r1.118.4.88 -r1.118.4.89
--- Embperl.pm 25 Feb 2002 11:20:25 -0000 1.118.4.88
+++ Embperl.pm 26 Feb 2002 08:48:42 -0000 1.118.4.89
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: Embperl.pm,v 1.118.4.88 2002/02/25 11:20:25 richter Exp $
+# $Id: Embperl.pm,v 1.118.4.89 2002/02/26 08:48:42 richter Exp $
#
###################################################################################
@@ -111,6 +111,7 @@
}
#######################################################################################
+
sub Warn
{
local $^W = 0 ;
@@ -173,6 +174,48 @@
}
#######################################################################################
+
+sub get_multipart_formdata
+ {
+ my ($self) = @_ ;
+
+ my $dbgForm = $self -> config -> debug & Embperl::Constant::dbgForm ;
+
+ # just let CGI.pm read the multipart form data, see cgi docu
+ require CGI ;
+
+ my $cgi = new CGI ;
+ my $fdat = $self -> thread -> form_hash ;
+ my $ffld = $self -> thread -> form_array ;
+ @$ffld = $cgi->param;
+
+ $self -> log ("[$$]FORM: Read multipart formdata,
length=$ENV{CONTENT_LENGTH}\n") if ($dbgForm) ;
+ my $params ;
+ foreach ( @$ffld )
+ {
+ # the param_fetch needs CGI.pm 2.43
+ #$params = $cgi->param_fetch( $_ ) ;
+ $params = $cgi->{$_} ;
+ if ($#$params > 0)
+ {
+ $fdat->{ $_ } = join ("\t", @$params) ;
+ }
+ else
+ {
+ $fdat->{ $_ } = $params -> [0] ;
+ }
+
+ $self -> log ("[$$]FORM: $_=$fdat->{$_}\n") if ($dbgForm) ;
+
+ if (ref($fdat->{$_}) eq 'Fh')
+ {
+ $fdat->{"-$_"} = $cgi -> uploadInfo($fdat->{$_}) ;
+ }
+ }
+ }
+
+#######################################################################################
+
sub SendErrorDoc ()
1.27.4.44 +2 -0 embperl/ep.h
Index: ep.h
===================================================================
RCS file: /home/cvs/embperl/ep.h,v
retrieving revision 1.27.4.43
retrieving revision 1.27.4.44
diff -u -r1.27.4.43 -r1.27.4.44
--- ep.h 12 Feb 2002 09:11:44 -0000 1.27.4.43
+++ ep.h 26 Feb 2002 08:48:42 -0000 1.27.4.44
@@ -593,6 +593,8 @@
AV * embperl_String2AV (/*in*/ tApp * pApp,
/*in*/ const char * sData,
/*in*/ const char * sSeparator) ;
+HV * embperl_String2HV (/*in*/ tApp * a,
+ /*in*/ const char * sData) ;
/* ---- from epeval.c ----- */
1.1.2.20 +12 -4 embperl/epapinit.c
Index: epapinit.c
===================================================================
RCS file: /home/cvs/embperl/epapinit.c,v
retrieving revision 1.1.2.19
retrieving revision 1.1.2.20
diff -u -r1.1.2.19 -r1.1.2.20
--- epapinit.c 25 Feb 2002 11:20:25 -0000 1.1.2.19
+++ epapinit.c 26 Feb 2002 08:48:42 -0000 1.1.2.20
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: epapinit.c,v 1.1.2.19 2002/02/25 11:20:25 richter Exp $
+# $Id: epapinit.c,v 1.1.2.20 2002/02/26 08:48:42 richter Exp $
#
###################################################################################*/
@@ -31,6 +31,7 @@
#define EPCFG_BOOL EPCFG
#define EPCFG_CV EPCFG
#define EPCFG_SV EPCFG
+#define EPCFG_HV EPCFG
#define EPCFG_REGEX EPCFG
#define EPCFG_CHAR EPCFG
#define EPCFG_APP
@@ -318,7 +319,7 @@
#define EPCFG_BOOL(STRUCT,TYPE,NAME,CFGNAME) \
char * embperl_Apache_Config_##STRUCT##NAME (cmd_parms *cmd, tApacheDirConfig *
pDirCfg, char * arg) \
{ \
- pDirCfg -> STRUCT.NAME = arg ; \
+ pDirCfg -> STRUCT.NAME = (TYPE)arg ; \
pDirCfg -> set_##STRUCT##NAME = 1 ; \
return NULL; \
}
@@ -339,7 +340,7 @@
char * embperl_Apache_Config_##STRUCT##NAME (cmd_parms *cmd, tApacheDirConfig *
pDirCfg, char* arg) \
{ \
epdcTHX_ \
- pDirCfg -> STRUCT.NAME = newSVpv(arg, 0) ; \
+ pDirCfg -> STRUCT.NAME = newSVpv((char *)arg, 0) ; \
pDirCfg -> set_##STRUCT##NAME = 1 ; \
return NULL; \
}
@@ -348,7 +349,7 @@
#define EPCFG_CHAR(STRUCT,TYPE,NAME,CFGNAME) \
char * embperl_Apache_Config_##STRUCT##NAME (cmd_parms *cmd, tApacheDirConfig *
pDirCfg, char * arg) \
{ \
- pDirCfg -> STRUCT.NAME = arg[0] ; \
+ pDirCfg -> STRUCT.NAME = (TYPE)arg[0] ; \
pDirCfg -> set_##STRUCT##NAME = 1 ; \
return NULL; \
}
@@ -367,6 +368,13 @@
#undef EPCFG_AV
#define EPCFG_AV(STRUCT,TYPE,NAME,CFGNAME,SEPARATOR) \
+char * embperl_Apache_Config_##STRUCT##NAME (cmd_parms *cmd, tApacheDirConfig *
pDirCfg, char * arg) \
+ { \
+ return "unimplemented" ; \
+ }
+
+#undef EPCFG_HV
+#define EPCFG_HV(STRUCT,TYPE,NAME,CFGNAME) \
char * embperl_Apache_Config_##STRUCT##NAME (cmd_parms *cmd, tApacheDirConfig *
pDirCfg, char * arg) \
{ \
return "unimplemented" ; \
1.1.2.10 +3 -2 embperl/Attic/epcfg.h
Index: epcfg.h
===================================================================
RCS file: /home/cvs/embperl/Attic/epcfg.h,v
retrieving revision 1.1.2.9
retrieving revision 1.1.2.10
diff -u -r1.1.2.9 -r1.1.2.10
--- epcfg.h 25 Feb 2002 11:20:25 -0000 1.1.2.9
+++ epcfg.h 26 Feb 2002 08:48:42 -0000 1.1.2.10
@@ -40,8 +40,9 @@
/* tAppConfig */
EPCFG_STR(AppConfig, char *, sAppName, APPNAME)
-EPCFG_STR(AppConfig, char *, sSessionArgs, SESSION_ARGS)
-EPCFG_STR(AppConfig, char *, sSessionClasses, SESSION_CLASSES)
+EPCFG_STR(AppConfig, char *, sSessionHandlerClass, SESSION_HANDLER_CLASS)
+EPCFG_HV (AppConfig, HV *, pSessionArgs, SESSION_ARGS)
+EPCFG_AV (AppConfig, AV *, pSessionClasses, SESSION_CLASSES, " ,")
EPCFG_STR(AppConfig, char *, sSessionConfig, SESSION_CONFIG)
EPCFG_STR(AppConfig, char *, sCookieName, COOKIE_NAME)
EPCFG_STR(AppConfig, char *, sCookieDomain, COOKIE_DOMAIN)
1.1.2.11 +17 -1 embperl/Attic/epcgiinit.c
Index: epcgiinit.c
===================================================================
RCS file: /home/cvs/embperl/Attic/epcgiinit.c,v
retrieving revision 1.1.2.10
retrieving revision 1.1.2.11
diff -u -r1.1.2.10 -r1.1.2.11
--- epcgiinit.c 25 Feb 2002 11:20:25 -0000 1.1.2.10
+++ epcgiinit.c 26 Feb 2002 08:48:42 -0000 1.1.2.11
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: epcgiinit.c,v 1.1.2.10 2002/02/25 11:20:25 richter Exp $
+# $Id: epcgiinit.c,v 1.1.2.11 2002/02/26 08:48:42 richter Exp $
#
###################################################################################*/
@@ -57,6 +57,7 @@
tainted = 0 ; \
if (arg) \
pConfig -> NAME = newSVpv (arg, 0) ; \
+ tainted = 0 ; \
}
#undef EPCFG_AV
@@ -68,6 +69,19 @@
tainted = 0 ; \
if (arg) \
pConfig -> NAME = embperl_String2AV(pApp, arg, SEPARATOR) ;\
+ tainted = 0 ; \
+ }
+
+#undef EPCFG_HV
+#define EPCFG_AV(STRUCT,TYPE,NAME,CFGNAME) \
+ { \
+ char * arg ; \
+ tainted = 0 ; \
+ arg = GetHashValueStr (aTHX_ pThread -> pEnvHash, "EMBPERL_"#CFGNAME, NULL) ; \
+ tainted = 0 ; \
+ if (arg) \
+ pConfig -> NAME = embperl_String2HV(pApp, arg) ;\
+ tainted = 0 ; \
}
#undef EPCFG_CV
@@ -81,6 +95,7 @@
if (arg) \
if ((rc = EvalConfig (pApp, sv_2mortal(newSVpv(arg, 0)), 0, NULL,
"Configuration: EMBPERL_"#CFGNAME, &pConfig -> NAME)) != ok) \
return rc ; \
+ tainted = 0 ; \
}
#undef EPCFG_REGEX
@@ -94,6 +109,7 @@
if (arg) \
if ((rc = EvalRegEx (pApp, arg, "Configuration: EMBPERL_"#CFGNAME, &pConfig
-> NAME)) != ok) \
return rc ; \
+ tainted = 0 ; \
}
1.1.2.27 +10 -8 embperl/Attic/epdat2.h
Index: epdat2.h
===================================================================
RCS file: /home/cvs/embperl/Attic/epdat2.h,v
retrieving revision 1.1.2.26
retrieving revision 1.1.2.27
diff -u -r1.1.2.26 -r1.1.2.27
--- epdat2.h 25 Feb 2002 11:20:26 -0000 1.1.2.26
+++ epdat2.h 26 Feb 2002 08:48:42 -0000 1.1.2.27
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: epdat2.h,v 1.1.2.26 2002/02/25 11:20:26 richter Exp $
+# $Id: epdat2.h,v 1.1.2.27 2002/02/26 08:48:42 richter Exp $
#
###################################################################################*/
@@ -121,8 +121,9 @@
SV * _perlsv ; /**< The perl reference to this structure */
tMemPool * pPool ; /**< pool for memorymanagement */
char * sAppName ;
- char * sSessionArgs ;
- char * sSessionClasses ;
+ char * sSessionHandlerClass ;
+ HV * pSessionArgs ;
+ AV * pSessionClasses ;
char * sSessionConfig ;
char * sCookieName ;
char * sCookieDomain ;
@@ -204,12 +205,13 @@
struct tReq * pCurrReq ; /**< Current running request if any */
tAppConfig Config ; /**< application configuration data */
FILEIO * lfd ; /**< log file handle */
- SV * pUserSession ; /**< user session object */
- SV * pStateSession ; /**< state session object */
- HV * pUserHash ; /* Session User data */
- HV * pStateHash ; /* Session State data */
- HV * pModHash ; /* Module data */
+ HV * pUserHash ; /**< Session User data */
+ SV * pUserObj ; /**< Session User object */
+ HV * pStateHash ; /**< Session State data */
+ SV * pStateObj ; /**< Session State object */
+ HV * pAppHash ; /**< Session Application data */
+ SV * pAppObj ; /**< Session Application object */
} tApp ;
1.23.4.22 +29 -8 embperl/epeval.c
Index: epeval.c
===================================================================
RCS file: /home/cvs/embperl/epeval.c,v
retrieving revision 1.23.4.21
retrieving revision 1.23.4.22
diff -u -r1.23.4.21 -r1.23.4.22
--- epeval.c 25 Feb 2002 11:20:26 -0000 1.23.4.21
+++ epeval.c 26 Feb 2002 08:48:42 -0000 1.23.4.22
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: epeval.c,v 1.23.4.21 2002/02/25 11:20:26 richter Exp $
+# $Id: epeval.c,v 1.23.4.22 2002/02/26 08:48:42 richter Exp $
#
###################################################################################*/
@@ -146,10 +146,18 @@
{
SV * pSVErr ;
SV * pRV ;
+ int n ;
- pRV = perl_eval_pv (s, 0) ;
+ n = perl_eval_sv (pSV, G_EVAL | G_SCALAR) ;
tainted = 0 ;
- if (SvROK (pRV))
+
+ SPAGAIN;
+ if (n > 0)
+ pRV = POPs;
+ PUTBACK;
+
+ tainted = 0 ;
+ if (n > 0 && SvROK (pRV))
{
*pCV = (CV *)SvRV (pRV) ;
SvREFCNT_inc (*pCV) ;
@@ -228,6 +236,8 @@
SV * pRV ;
SV * pSVErr ;
char c ;
+ int n ;
+ dSP ;
if (sRegex[0] == '!')
{
@@ -241,9 +251,19 @@
tainted = 0 ;
pSV = newSVpvf ("package Embperl::Regex ; sub { $_[0] %c~ m{%s} }", c, sRegex) ;
- p = SvPV(pSV, l) ;
- pRV = perl_eval_pv (p, 0) ;
+ /* perl_eval_pv seems to be broken in 5.005_03!! */
+ /* p = SvPV(pSV, l) ; */
+ /* pRV = perl_eval_pv (p, 0) ; */
+
+ n = perl_eval_sv (pSV, G_EVAL | G_SCALAR) ;
+ SvREFCNT_dec(pSV);
+ tainted = 0 ;
+ SPAGAIN;
+ if (n > 0)
+ pRV = POPs;
+ PUTBACK;
+
pSVErr = ERRSV ;
if (SvTRUE (pSVErr))
{
@@ -253,17 +273,18 @@
sv_setpv(pSVErr,"");
*ppCV = NULL ;
- SvREFCNT_dec (pSV) ;
return rcEvalErr ;
}
- if (SvROK (pRV))
+ if (n > 0 && SvROK (pRV))
{
*ppCV = (CV *)SvRV (pRV) ;
SvREFCNT_inc (*ppCV) ;
}
+ else
+ *ppCV = NULL ;
+
- SvREFCNT_dec (pSV) ;
return ok ;
}
1.1.2.29 +195 -21 embperl/Attic/epinit.c
Index: epinit.c
===================================================================
RCS file: /home/cvs/embperl/Attic/epinit.c,v
retrieving revision 1.1.2.28
retrieving revision 1.1.2.29
diff -u -r1.1.2.28 -r1.1.2.29
--- epinit.c 25 Feb 2002 11:20:26 -0000 1.1.2.28
+++ epinit.c 26 Feb 2002 08:48:42 -0000 1.1.2.29
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: epinit.c,v 1.1.2.28 2002/02/25 11:20:26 richter Exp $
+# $Id: epinit.c,v 1.1.2.29 2002/02/26 08:48:42 richter Exp $
#
###################################################################################*/
@@ -203,6 +203,7 @@
{
pCfg -> sAppName = "Embperl" ;
pCfg -> sCookieName = "EMBPERL_UID" ;
+ pCfg -> sSessionHandlerClass = "Apache::SessionX" ;
#ifdef WIN32
pCfg -> sLog = "\\embperl.log" ;
#else
@@ -212,6 +213,163 @@
}
+/*---------------------------------------------------------------------------
+* embperl_CreateSessionObject
+*/
+/*!
+*
+* \_en
+* Creates a new session object.
+*
+* \endif
+*
+* \_de
+* Erzeugt eine neues Sessionobjekt.
+*
+* \endif
+*
+* ------------------------------------------------------------------------ */
+
+
+
+static int embperl_CreateSessionObject(/*in*/ tApp * a,
+ /*in*/ SV * pArgs,
+ /*out*/ SV * * ppHash,
+ /*out*/ SV * * ppObj)
+
+
+ {
+ epaTHX_
+ dSP ;
+
+ char * sPackage = a -> sSessionHandlerClass ;
+ HV * pHash = newHV () ;
+ SV * pTie = newRV_noinc((SV *)newHV()) ;
+ hv_magic(pHash, pTie, 'P') ;
+ PUSHMARK(sp);
+ XPUSHs(sv_2mortal(newSVpv(sPackage, 0)));
+ XPUSHs(&sv_undef); /* id */
+ XPUSHs(pArgs);
+ PUTBACK;
+ n = perl_call_method ("TIEHASH", G_EVAL) ;
+ if (SvTRUE (ERRSV))
+ {
+ STRLEN l ;
+ strncpy (r -> errdat1, SvPV (ERRSV, l), sizeof (r -> errdat1) - 1) ;
+ sv_setpv(ERRSV,"");
+ return rcEvalError ;
+ }
+ if (n > 0)
+ pTie = POPs ;
+ if (n == 0 || !SvROK(pTie))
+ {
+ strncpy (r -> errdat1, "Session handling", sizeof (r -> errdat1) - 1) ;
+ strncpy (r -> errdat1, sPackage, sizeof (r -> errdat1) - 1) ;
+ return rcNotHashRef ;
+ }
+
+ *ppHash = pHash ;
+ *ppObj = pTie ;
+
+ return ok ;
+ }
+
+/*---------------------------------------------------------------------------
+* embperl_SetupSessionObjects
+*/
+/*!
+*
+* \_en
+* Setup the session onbjects.
+*
+* \endif
+*
+* \_de
+* Initialisiert neue Sessionobjekte.
+*
+* \endif
+*
+* ------------------------------------------------------------------------ */
+
+
+
+int embperl_SetupSessionObjects (/*in*/ tApp * a)
+
+
+ {
+ epaTHX_
+ int rc ;
+ SV * pStore ;
+ SV ** ppStore ;
+ SV * pLocker ;
+ SV ** ppLocker ;
+ SV * pSerializer ;
+ SV ** ppSerializer ;
+ SV * pGenerator ;
+ SV ** ppGenerator ;
+ HV * pArgs = a -> pSessionArgs ;
+ HV * pArgs1 ;
+ HV * pArgs2 ;
+ HV * pArgs3 ;
+
+ if (!pArgs)
+ a -> pSessionArgs = pArgs = newHV() ;
+
+ if (a -> pSessionClasses)
+ {
+ if ((ppStore = av_fetch (a -> pSessionClasses, 0, 0)))
+ pStore = *ppStore ;
+ if (!pStore)
+ pStore = sv_2mortal(newSVpv("File", 4)) ;
+ hv_store (pArgs, "Store", 5, pStore, 0) ;
+
+ if ((ppLocker = av_fetch (a -> pSessionClasses, 1, 0)))
+ pLocker = *ppLocker ;
+ if (!pLocker)
+ pLocker = sv_2mortal(newSVpv("Null", 4)) ;
+ hv_store (pArgs, "Locker", 6, pLocker, 0) ;
+
+ if ((ppSerializer = av_fetch (a -> pSessionClasses, 2, 0)))
+ pSerializer = *ppSerializer ;
+ if (!pSerializer)
+ pSerializer = sv_2mortal(newSVpv("Storable", 8)) ;
+ hv_store (pArgs, "Serialize", 9, pSerializer, 0) ;
+
+ if ((ppGenerator = av_fetch (a -> pSessionClasses, 3, 0)))
+ pGenerator = *ppGenerator ;
+ if (!pGenerator)
+ pGenerator = sv_2mortal(newSVpv("MD5", 3)) ;
+ hv_store (pArgs, "Generate", 8, pGenerator, 0) ;
+ }
+
+ if (a -> sSessionConfig)
+ hv_store (pArgs, "config", 5, newSVpv (a -> sSessionConfig, 0), 0) ;
+
+ hv_store (pArgs, "lazy", 4, newSViv (1), 0) ;
+ hv_store (pArgs, "create_unknown", 14, newSViv (1), 0) ;
+
+ pArgs1 = newHVhv(pArgs) ;
+ hv_store (pArgs1, "Transaction", 11, newSViv (1), 0) ;
+
+ if ((rc = embperl_CreateSessionObject (a, pArgs1, pApp -> pModHash, pApp ->
pModObj)) != ok)
+ return rc ;
+
+ pArgs2 = newHVhv(pArgs) ;
+ hv_store (pArgs2, "recreate_id", 11, newSViv (1), 0) ;
+ pArgs3 = newHVhv(pArgs2) ;
+
+ if ((rc = embperl_CreateSessionObject (a, pArgs2, pApp -> pUserHash, pApp ->
pUserObj)) != ok)
+ return rc ;
+
+ hv_store (pArgs3, "newid", 5, newSViv (1), 0) ;
+
+ if ((rc = embperl_CreateSessionObject (a, pArgs3, pApp -> pStateHash, pApp ->
pStateObj)) != ok)
+ return rc ;
+
+
+ return ok ;
+ }
+
/*---------------------------------------------------------------------------
* embperl_SetupApp
@@ -224,6 +382,8 @@
* one.
*
* @param pThread per thread data
+* @param pApacheCfg apache configuration vector
+* @param pPerlParam parameters passed from Perl
* \endif
*
* \_de
@@ -231,6 +391,8 @@
* benutzt, oder falls nicht vorhanden, ein neues erzeugt.
*
* @param pThread per thread daten
+* @param pApacheCfg apache Konfigurations Vector
+* @param pPerlParam Parameter die von Perl aus �bergeben wurden
* \endif
*
* ------------------------------------------------------------------------ */
@@ -295,6 +457,7 @@
pApp -> pThread = pThread ;
+ *ppApp = pApp ;
if (pApp -> Config.sLog && pApp -> Config.sLog[0])
{
@@ -305,26 +468,11 @@
}
}
-
- /*
- if ((pApp ->pUserHash = perl_get_hv (sUserHashName, TRUE)) == NULL)
- {
- LogError (r, rcHashError) ;
- }
-
- if ((pApp ->pStateHash = perl_get_hv (sStateHashName, TRUE)) == NULL)
+ if ((rc = embperl_SetupSessionObjects (pApp)) != ok)
{
- LogError (r, rcHashError) ;
- }
-
- if ((pApp ->pModHash = perl_get_hv (sModHashName, TRUE)) == NULL)
- {
- LogError (r, rcHashError) ;
+ LogErrorParam (pApp, rc, NULL, NULL) ;
+ return rc ;
}
- */
-
- if (pPerlParam && SvROK(pPerlParam))
- Embperl__App__Config_new_init(aTHX_ &pApp -> Config, SvRV(pPerlParam),
0) ;
}
*ppApp = pApp ;
@@ -788,13 +936,13 @@
static int embperl_SetupFormData (/*i/o*/ register req * r)
{
+ epTHX_
char * p = NULL ;
char * f ;
int rc = ok ;
STRLEN len = 0 ;
char sLen [20] ;
- epTHX ;
-
+ const char * sType ;
hv_clear (r -> pThread -> pFormHash) ;
hv_clear (r -> pThread -> pFormSplitHash) ;
@@ -811,6 +959,7 @@
if (r -> pApacheReq)
{
const char * sLength = table_get(r -> pApacheReq->headers_in,
"Content-Length") ;
+ sType = table_get(r -> pApacheReq->headers_in, "Content-Type") ;
len = sLength?atoi (sLength):0 ;
}
else
@@ -818,9 +967,30 @@
{
sLen [0] = '\0' ;
GetHashValue (r, r -> pThread -> pEnvHash, "CONTENT_LENGTH", sizeof (sLen) -
1, sLen) ;
+ sType = GetHashValueStr (aTHX_ r -> pThread -> pEnvHash, "CONTENT_TYPE", "") ;
len = atoi (sLen) ;
}
+ if (sType && strncmp (sType, "multipart/form-data", 19) == 0)
+ {
+ dSP ;
+
+ PUSHMARK(sp);
+ XPUSHs(r -> _perlsv);
+ PUTBACK;
+ perl_call_method ("get_multipart_formdata", G_EVAL) ;
+ if (SvTRUE (ERRSV))
+ {
+ STRLEN l ;
+ strncpy (r -> errdat1, SvPV (ERRSV, l), sizeof (r -> errdat1) - 1) ;
+ LogError (r, rcEvalErr) ;
+ sv_setpv(ERRSV,"");
+ }
+ tainted = 0 ;
+ return ok ;
+ }
+
+
if (len == 0)
{
p = r -> Param.sQueryInfo ;
@@ -899,6 +1069,8 @@
#endif
tMemPool * pPool = ep_make_sub_pool (pApp -> pPool) ;
+ tainted = 0 ;
+
epxs_Embperl__Req_create_obj(r,pReqSV,pReqRV,ep_palloc(pPool,sizeof(*r))) ;
epxs_Embperl__Req__Config_create_obj(pConfig,pSV,pRV,&r->Config) ;
epxs_Embperl__Req__Param_create_obj(pParam,pSV,pRV,&r->Param) ;
@@ -952,6 +1124,7 @@
r -> Param.sFilename = GetHashValueStrDup(aTHX_ pPool, (HV *)pHV,
"inputfile", NULL) ;
}
+ tainted = 0 ;
r -> pApp = pApp ;
pThread = r -> pThread = pApp -> pThread ;
@@ -987,6 +1160,7 @@
getcwd (r -> sInitialCWD, PATH_MAX * 2 - 1) ;
*ppReq = r ;
+ tainted = 0 ;
return ok ;
}
1.15.4.45 +65 -1 embperl/eputil.c
Index: eputil.c
===================================================================
RCS file: /home/cvs/embperl/eputil.c,v
retrieving revision 1.15.4.44
retrieving revision 1.15.4.45
diff -u -r1.15.4.44 -r1.15.4.45
--- eputil.c 25 Feb 2002 11:20:26 -0000 1.15.4.44
+++ eputil.c 26 Feb 2002 08:48:42 -0000 1.15.4.45
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: eputil.c,v 1.15.4.44 2002/02/25 11:20:26 richter Exp $
+# $Id: eputil.c,v 1.15.4.45 2002/02/26 08:48:42 richter Exp $
#
###################################################################################*/
@@ -1641,6 +1641,70 @@
}
return pAV ;
+ }
+
+
+
+/* ---------------------------------------------------------------------------- */
+/* */
+/* Split string into hash */
+/* */
+/* ---------------------------------------------------------------------------- */
+
+
+HV * embperl_String2HV (/*in*/ tApp * a,
+ /*in*/ const char * sData)
+
+ {
+ HV * pHV ;
+ char * p ;
+ char * q ;
+ char * pVal ;
+ char * pKeyEnd ;
+#ifdef PERL_IMPLICIT_CONTEXT
+ pTHX ;
+
+ if (a)
+ aTHX = a -> pPerlTHX ;
+ else
+ aTHX = PERL_GET_THX ;
+#endif
+
+ pHV = newHV () ;
+
+
+ while (*sData)
+ {
+ while (isspace(*sData))
+ sData++ ;
+
+ p = strchr (sData, '=') ;
+ if (!p)
+ break ;
+ pKeyEnd = p ;
+ while (pKeyEnd > sData && isspace(pKeyEnd[-1]))
+ pKeyEnd-- ;
+
+ p++ ;
+ while (isspace(*p))
+ p++ ;
+
+ if (*p == '\'' || *p == '"')
+ q = *p++ ;
+ else
+ q = ' ' ;
+
+ pVal = p ;
+ while (*p && p != q)
+ p++ ;
+
+ hv_store(pHV, sData, pKeyEnd - sData, newSVpv(pVal, p - pVal)) ;
+ sData = p ;
+ if (*sData)
+ sData++ ;
+ }
+
+ return pHV ;
}
No revision
No revision
1.1.2.18 +16 -14 embperl/xsbuilder/maps/Attic/ep_structure.map
Index: ep_structure.map
===================================================================
RCS file: /home/cvs/embperl/xsbuilder/maps/Attic/ep_structure.map,v
retrieving revision 1.1.2.17
retrieving revision 1.1.2.18
diff -u -r1.1.2.17 -r1.1.2.18
--- ep_structure.map 25 Feb 2002 11:20:30 -0000 1.1.2.17
+++ ep_structure.map 26 Feb 2002 08:48:43 -0000 1.1.2.18
@@ -58,18 +58,19 @@
<tApp>
! _perlsv
-! pPerlTHX | perl_thx
-! pPool | pool
- pThread | thread
- pCurrReq | curr_req
- Config | config
+! pPerlTHX | perl_thx
+! pPool | pool
+ pThread | thread
+ pCurrReq | curr_req
+ Config | config
lfd
- pUserSession | user_session
- pStateSession | state_session
- pUserHash | user_hash
- pStateHash | state_hash
- pModHash | mod_hash
- bDebug | debug
+ pUserObj | user_session
+ pStateObj | state_session
+ pAppObj | app_session
+ pUserHash | udat
+ pStateHash | sdat
+ pAppHash | mdat
+ bDebug | debug
new
! private
</tApp>
@@ -78,9 +79,10 @@
<tAppConfig>
! _perlsv
sAppName | app_name
- sSessionArgs | session_args
- sSessionClasses | session_classes
- sSessionConfig | session_config
+ pSessionArgs | session_args
+ pSessionClasses | session_classes
+ sSessionConfig | session_config
+ sSessionHandlerClass | session_handler_class
sCookieName | cookie_name
sCookieDomain | cookie_domain
sCookiePath | cookie_path
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]