You are viewing a plain text version of this content. The canonical link for it is here.
Posted to embperl-cvs@perl.apache.org by ri...@apache.org on 2002/01/25 21:19:27 UTC

cvs commit: embperl Embperl.pm epinit.c epmain.c

richter     02/01/25 12:19:27

  Modified:    .        Tag: Embperl2c Embperl.pm epinit.c epmain.c
  Log:
  includes
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.118.4.82 +17 -3     embperl/Embperl.pm
  
  Index: Embperl.pm
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl.pm,v
  retrieving revision 1.118.4.81
  retrieving revision 1.118.4.82
  diff -u -r1.118.4.81 -r1.118.4.82
  --- Embperl.pm	25 Jan 2002 07:04:30 -0000	1.118.4.81
  +++ Embperl.pm	25 Jan 2002 20:19:26 -0000	1.118.4.82
  @@ -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.81 2002/01/25 07:04:30 richter Exp $
  +#   $Id: Embperl.pm,v 1.118.4.82 2002/01/25 20:19:26 richter Exp $
   #
   ###################################################################################
   
  @@ -68,7 +68,14 @@
   
       local $SIG{__WARN__} = \&Warn ;
   
  -    Embperl::Req::RunRequest (undef, $param) ;
  +    if (!ref $param)
  +        {
  +        Embperl::Req::RunRequest (undef, { inputfile => $param, param => [@_]}) ;
  +        }
  +    else
  +        {
  +        Embperl::Req::RunRequest (undef, $param) ;
  +        }
       }
   
   #######################################################################################
  @@ -110,7 +117,14 @@
       my $rc ;
       my $param = shift ;
   
  -    Embperl::Req::RunComponent ($Embperl::req, $param) ;
  +    if (!ref $param)
  +        {
  +        Embperl::Req::RunComponent ($Embperl::req, { inputfile => $param, param => [@_]}) ;
  +        }
  +    else
  +        {
  +        Embperl::Req::RunComponent ($Embperl::req, $param) ;
  +        }
       }
   
   #######################################################################################
  
  
  
  1.1.2.19  +4 -4      embperl/Attic/epinit.c
  
  Index: epinit.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epinit.c,v
  retrieving revision 1.1.2.18
  retrieving revision 1.1.2.19
  diff -u -r1.1.2.18 -r1.1.2.19
  --- epinit.c	25 Jan 2002 15:51:31 -0000	1.1.2.18
  +++ epinit.c	25 Jan 2002 20:19:26 -0000	1.1.2.19
  @@ -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.18 2002/01/25 15:51:31 richter Exp $
  +#   $Id: epinit.c,v 1.1.2.19 2002/01/25 20:19:26 richter Exp $
   #
   ###################################################################################*/
   
  @@ -1262,11 +1262,11 @@
       tComponentParam * pParam ;
       tComponentConfig * pConfig ;
       epTHX ;
  +    tComponent * pPrev = NULL ;
   
   
       if (r -> Component._perlsv)
           { /* we have already a component, so let safe it first */
  -        tComponent * pPrev ;
           SV * pHV ;
           MAGIC * mg ;
   
  @@ -1274,8 +1274,6 @@
   
           memcpy (pPrev, &r -> Component, sizeof (*pPrev)) ;
           
  -        r -> Component.pPrev = pPrev ;
  -
   	/* adjust pointer in perl magic */
           pHV = SvRV (pPrev -> _perlsv) ;
           if (mg = mg_find (pHV, '~'))
  @@ -1293,6 +1291,8 @@
       epxs_Embperl__Component__Param_create_obj(pParam,pSV, pRV,&r->Component.Param) ;
       epxs_Embperl__Component__Config_create_obj(pConfig,pSV, pRV,&r->Component.Config) ;
       
  +    r -> Component.pPrev = pPrev ;
  +
       c -> Param.nImport = -1 ;
       c -> Param.nFirstLine = 1 ;
   
  
  
  
  1.75.4.91 +369 -434  embperl/epmain.c
  
  Index: epmain.c
  ===================================================================
  RCS file: /home/cvs/embperl/epmain.c,v
  retrieving revision 1.75.4.90
  retrieving revision 1.75.4.91
  diff -u -r1.75.4.90 -r1.75.4.91
  --- epmain.c	25 Jan 2002 07:04:31 -0000	1.75.4.90
  +++ epmain.c	25 Jan 2002 20:19:26 -0000	1.75.4.91
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epmain.c,v 1.75.4.90 2002/01/25 07:04:31 richter Exp $
  +#   $Id: epmain.c,v 1.75.4.91 2002/01/25 20:19:26 richter Exp $
   #
   ###################################################################################*/
   
  @@ -663,7 +663,7 @@
           if (r -> pApacheReq == NULL)
               {
   #endif
  -            if (r -> nIOType != epIOPerl && (r -> Component.Config.bOptions & optSendHttpHeader))
  +            if (r -> Component.Config.bOptions & optSendHttpHeader)
                   oputs (r, "Content-type: text/html\n\n") ;
   
   #ifdef APACHE
  @@ -677,11 +677,7 @@
   	    /* mod_perl_sent_header(r -> pApacheReq, 1) ; */
   #endif
               if (r -> pApacheReq -> header_only)
  -            	{
  -	        if (!r -> Component.bAppendToMainReq)
  -                    CloseOutput (r) ;
               	return ok ;
  -    	        }
               }
   #endif
           }
  @@ -725,495 +721,417 @@
       return ok ;
       }
   
  +
   /* ---------------------------------------------------------------------------- */
   /*                                                                              */
  -/* End the output stream                                                        */
  +/* GenerateErrorPage                                                            */
   /*                                                                              */
   /* ---------------------------------------------------------------------------- */
   
   
  -static int EndOutput (/*i/o*/ register req * r,
  -		      /*in*/ int    rc,
  -                      /*in*/ SV *   pOutData) 
  -                      
   
  -    {
  -    SV * pOut = NULL ;
  -    int  bOutToMem = pOutData && SvROK (pOutData) ;
  -    SV * pCookie = NULL ;
  -    SV * pCookie2 = NULL ;
  -    int  bError = 0 ;
  -    STRLEN ldummy ;
  -    epTHX ;    
  +static int GenerateErrorPage (/*i/o*/ register req * r)
  +                     
   
  -#ifdef EP2OLDXSLT
  -    /* ### tmp ### */
  -    int bXSLT = 0 ;
  +    {
  +    epTHX_    
   
  -    if (strcmp (r -> Component.Config.sRecipe + strlen (r -> Component.Config.sRecipe) - 4 , "XSLT") == 0)
  +    dSP;                            /* initialize stack pointer      */
  +    
  +    if (r -> pApp -> Config.sMailErrorsTo)
           {
  -        bXSLT = 1 ;
  +        /* --- check if error should be mailed --- */
  +	PUSHMARK(sp);                   /* remember the stack pointer    */
  +        XPUSHs(r -> _perlsv) ;            /* push pointer to obeject */
  +        PUTBACK;
  +        perl_call_method ("MailErrorsTo", G_DISCARD) ; /* call the function             */
           }
  -#endif
       
  -    r -> Component.bEscModeSet = 0 ;
  -
  -    if (rc != ok ||  r -> bError)
  -        { /* --- generate error page if necessary --- */
  -	dSP;                            /* initialize stack pointer      */
  -        
  -        if (r -> pApp -> Config.sMailErrorsTo)
  -            {
  -            /* --- check if error should be mailed --- */
  -	    PUSHMARK(sp);                   /* remember the stack pointer    */
  -            XPUSHs(r -> _perlsv) ;            /* push pointer to obeject */
  -            PUTBACK;
  -            perl_call_method ("MailErrorsTo", G_DISCARD) ; /* call the function             */
  -            }
  -        
  -	if (r -> Component.Config.bOptions & optReturnError)
  -	    {
  -    	    r -> bError = 1 ;
  -	    oRollbackOutput (r, NULL) ;
  -	    if (bOutToMem)
  -		{
  -		pOut = SvRV (pOutData) ;
  -		sv_setsv (pOut, &sv_undef) ;
  -		}
  -	    return ok ; /* No further output or header, this should be handle by the server */
  -	    }    
  -        else if (!(r -> Component.Config.bOptions & optDisableEmbperlErrorPage))
  +    if (r -> Component.Config.bOptions & optReturnError)
  +	{
  +	oRollbackOutput (r, NULL) ;
  +	if (r -> Component.Param.pOutput && SvROK (r -> Component.Param.pOutput))
   	    {
  -	    if (!r -> Component.bAppendToMainReq)
  -		{
  -
  -		oRollbackOutput (r, NULL) ; /* forget everything outputed so far */
  -		oBegin (r) ;
  +	    sv_setsv (SvRV (r -> Component.Param.pOutput), &sv_undef) ;
  +	    }
  +    	r -> bExit = 1 ;
  +	return ok ; /* No further output or header, this should be handle by the server */
  +	}    
  +    else if (!(r -> Component.Config.bOptions & optDisableEmbperlErrorPage))
  +	{
  +	oRollbackOutput (r, NULL) ; /* forget everything outputed so far */
  +	oBegin (r) ;
   
  -		PUSHMARK(sp);                   /* remember the stack pointer    */
  -		XPUSHs(r -> _perlsv) ;            /* push pointer to obeject */
  -		PUTBACK;
  -		perl_call_method ("SendErrorDoc", G_DISCARD) ; /* call the function             */
  +	PUSHMARK(sp);                   /* remember the stack pointer    */
  +	XPUSHs(r -> _perlsv) ;            /* push pointer to obeject */
  +	PUTBACK;
  +	perl_call_method ("SendErrorDoc", G_DISCARD) ; /* call the function             */
   #ifdef APACHE
  -		if (r -> pApacheReq)
  -		    r -> pApacheReq -> status = 500 ;
  +	if (r -> pApacheReq)
  +	    r -> pApacheReq -> status = 500 ;
   #endif
  -		}
  -	    bError = 1 ;
  -	    }
  -	if (!r -> Component.bAppendToMainReq)
  -   	    r -> bError = 0 ; /* error already handled */
   	}
  -    
  +    r -> bError = 1 ;
  +
  +    return ok ;
  +    }
  +
  +/* ---------------------------------------------------------------------------- */
  +/*                                                                              */
  +/* SendHttpHeader                                                               */
  +/*                                                                              */
  +/* ---------------------------------------------------------------------------- */
  +
  +
   
  -    if (!(r -> Component.Config.bOptions & optEarlyHttpHeader) && (r -> Component.Config.bOptions & optSendHttpHeader) && !bOutToMem)
  -        {  /* --- send http headers if not alreay done --- */
  -        if (!r -> Component.bAppendToMainReq)
  -            {                    
  -            if (!(r -> Component.Config.bOptions & optNoSessionCookies))
  -                pCookie = CreateSessionCookie (r, r -> pApp -> pUserHash, 'u', 1) ;
  -	    /* pCookie2 = CreateSessionCookie (r, r -> pApp -> pStateHash, 's') ; */
  -		
  +static int SendHttpHeader (/*i/o*/ register req * r)
  +                     
  +
  +    {                    
  +    epTHX_
  +    SV * pCookie = NULL ;
  +    SV * pCookie2 = NULL ;
  +
  +    if (!(r -> Component.Config.bOptions & optNoSessionCookies))
  +        pCookie = CreateSessionCookie (r, r -> pApp -> pUserHash, 'u', 1) ;
  +    /* pCookie2 = CreateSessionCookie (r, r -> pApp -> pStateHash, 's') ; */
  +	
   #ifdef APACHE
  -	    if (r -> pApacheReq)
  -		{
  -		SV *   pHeader ;
  -		char * p ;
  -		HE *   pEntry ;
  -		char * pKey ;
  -		I32    l ;
  -
  - 
  - 		I32	i;
  - 		I32	len;
  - 		AV	*arr;
  - 		SV	**svp;
  -
  -		/* loc = 0  =>  no location header found
  -		 * loc = 1  =>  location header found
  -		 * loc = 2  =>  location header + value found
  -		 */
  - 		I32	loc;
  -        
  -		hv_iterinit (r -> pThread -> pHeaderHash) ;
  -		while ((pEntry = hv_iternext (r -> pThread -> pHeaderHash)))
  -		    {
  -		    pKey     = hv_iterkey (pEntry, &l) ;
  -		    pHeader  = hv_iterval (r -> pThread -> pHeaderHash, pEntry) ;
  - 		    loc = 0;
  -		    if (pHeader && pKey)
  -			{			    
  -
  -			if (stricmp (pKey, "location") == 0)
  -			    loc = 1;
  - 			if (stricmp (pKey, "content-type") == 0)  
  - 			    {
  - 			    p = NULL;
  - 			    if ( SvROK(pHeader) && SvTYPE(SvRV(pHeader)) == SVt_PVAV ) 
  - 				{
  - 				arr = (AV *)SvRV(pHeader);
  - 				if (av_len(arr) >= 0) 
  - 				    {
  - 				    svp = av_fetch(arr, 0, 0);
  -				    p = SvPV(*svp, ldummy);
  -			    	    }
  - 				} 
  - 			    else 
  - 		 		{
  - 				p = SvPV(pHeader, ldummy);
  - 				}
  - 			    if (p) 
  -				r->pApacheReq->content_type = pstrdup(r->pApacheReq->pool, p);
  -			    } 
  -  			else if (SvROK(pHeader)  && SvTYPE(SvRV(pHeader)) == SVt_PVAV ) 
  - 			    {
  - 			    arr = (AV *)SvRV(pHeader);
  - 			    len = av_len(arr);
  - 			    for (i = 0; i <= len; i++) 
  - 				{
  - 				svp = av_fetch(arr, i, 0);
  - 				p = SvPV(*svp, ldummy);
  - 				table_add( r->pApacheReq->headers_out, pstrdup(r->pApacheReq->pool, pKey),
  - 					   pstrdup(r->pApacheReq->pool, p ) );
  - 				if (loc == 1) 
  -				    {
  -				    loc = 2;
  -				    break;
  - 				    }
  -				}
  - 			    } 
  - 			else 
  +    if (r -> pApacheReq)
  +	{
  +	SV *   pHeader ;
  +	char * p ;
  +	HE *   pEntry ;
  +	char * pKey ;
  +	I32    l ;
  +
  +
  + 	I32	i;
  + 	I32	len;
  + 	AV	*arr;
  + 	SV	**svp;
  +
  +	/* loc = 0  =>  no location header found
  +	 * loc = 1  =>  location header found
  +	 * loc = 2  =>  location header + value found
  +	 */
  + 	I32	loc;
  +
  +	hv_iterinit (r -> pThread -> pHeaderHash) ;
  +	while ((pEntry = hv_iternext (r -> pThread -> pHeaderHash)))
  +	    {
  +	    pKey     = hv_iterkey (pEntry, &l) ;
  +	    pHeader  = hv_iterval (r -> pThread -> pHeaderHash, pEntry) ;
  + 	    loc = 0;
  +	    if (pHeader && pKey)
  +		{			    
  +
  +		if (stricmp (pKey, "location") == 0)
  +		    loc = 1;
  + 		if (stricmp (pKey, "content-type") == 0)  
  + 		    {
  + 		    p = NULL;
  + 		    if ( SvROK(pHeader) && SvTYPE(SvRV(pHeader)) == SVt_PVAV ) 
  + 			{
  + 			arr = (AV *)SvRV(pHeader);
  + 			if (av_len(arr) >= 0) 
    			    {
  - 			    p = SvPV(pHeader, ldummy);
  -			    table_set(r -> pApacheReq->headers_out, pstrdup(r -> pApacheReq->pool, pKey), pstrdup(r -> pApacheReq->pool, p)) ;
  -			    if (loc == 1) loc = 2;
  + 			    svp = av_fetch(arr, 0, 0);
  +			    p = SvPV(*svp, ldummy);
   			    }
  -
  -			if (loc == 2) r->pApacheReq->status = 301;
  + 			} 
  + 		    else 
  + 		 	{
  + 			p = SvPV(pHeader, ldummy);
  + 			}
  + 		    if (p) 
  +			r->pApacheReq->content_type = pstrdup(r->pApacheReq->pool, p);
  +		    } 
  +  		else if (SvROK(pHeader)  && SvTYPE(SvRV(pHeader)) == SVt_PVAV ) 
  + 		    {
  + 		    arr = (AV *)SvRV(pHeader);
  + 		    len = av_len(arr);
  + 		    for (i = 0; i <= len; i++) 
  + 			{
  + 			svp = av_fetch(arr, i, 0);
  + 			p = SvPV(*svp, ldummy);
  + 			table_add( r->pApacheReq->headers_out, pstrdup(r->pApacheReq->pool, pKey),
  + 				   pstrdup(r->pApacheReq->pool, p ) );
  + 			if (loc == 1) 
  +			    {
  +			    loc = 2;
  +			    break;
  + 			    }
   			}
  + 		    } 
  + 		else 
  + 		    {
  + 		    p = SvPV(pHeader, ldummy);
  +		    table_set(r -> pApacheReq->headers_out, pstrdup(r -> pApacheReq->pool, pKey), pstrdup(r -> pApacheReq->pool, p)) ;
  +		    if (loc == 1) loc = 2;
   		    }
   
  +		if (loc == 2) r->pApacheReq->status = 301;
  +		}
  +	    }
   
  -		if (pCookie)
  -		    {
  -		    table_add(r -> pApacheReq->headers_out, sSetCookie, pstrdup(r -> pApacheReq->pool, SvPV(pCookie, ldummy))) ;
  -		    SvREFCNT_dec (pCookie) ;
  -		    }
  -		if (pCookie2)
  -		    {
  -		    table_add(r -> pApacheReq->headers_out, sSetCookie, pstrdup(r -> pApacheReq->pool, SvPV(pCookie2, ldummy))) ;
  -		    SvREFCNT_dec (pCookie2) ;
  -		    }
  -#ifdef EP2
  -	        if (r -> Component.Config.bEP1Compat)  /*  Embperl 2 currently cannot calc Content Length */
  -#endif
  -		set_content_length (r -> pApacheReq, GetContentLength (r) + (r -> Component.pCurrEscape?2:0)) ;
  -		send_http_header (r -> pApacheReq) ;
  -#ifndef WIN32
  -		/* shouldn't be neccessary for newer mod_perl versions !? */
  -                /* mod_perl_sent_header(r -> pApacheReq, 1) ; */
  +
  +	if (pCookie)
  +	    {
  +	    table_add(r -> pApacheReq->headers_out, sSetCookie, pstrdup(r -> pApacheReq->pool, SvPV(pCookie, ldummy))) ;
  +	    SvREFCNT_dec (pCookie) ;
  +	    }
  +	if (pCookie2)
  +	    {
  +	    table_add(r -> pApacheReq->headers_out, sSetCookie, pstrdup(r -> pApacheReq->pool, SvPV(pCookie2, ldummy))) ;
  +	    SvREFCNT_dec (pCookie2) ;
  +	    }
  +#if 0
  +	if (r -> Component.Config.bEP1Compat)  /*  Embperl 2 currently cannot calc Content Length */
  +	    set_content_length (r -> pApacheReq, GetContentLength (r) + (r -> Component.pCurrEscape?2:0)) ;
   #endif
  -                if (r -> Component.Config.bDebug & dbgHeadersIn)
  -        	    {
  -        	    int i;
  -        	    array_header *hdrs_arr;
  -        	    table_entry  *hdrs;
  -
  -        	    hdrs_arr = table_elts (r -> pApacheReq->headers_out);
  -	            hdrs = (table_entry *)hdrs_arr->elts;
  -
  -        	    lprintf (r -> pApp,   "[%d]HDR:  %d\n", r -> pThread -> nPid, hdrs_arr->nelts) ; 
  -	            for (i = 0; i < hdrs_arr->nelts; ++i)
  -		        if (hdrs[i].key)
  -                	    lprintf (r -> pApp,   "[%d]HDR:  %s=%s\n", r -> pThread -> nPid, hdrs[i].key, hdrs[i].val) ; 
  -        	    }
  -                }
  -	    else
  +	    send_http_header (r -> pApacheReq) ;
  +
  +        if (r -> Component.Config.bDebug & dbgHeadersIn)
  +            {
  +            int i;
  +            array_header *hdrs_arr;
  +            table_entry  *hdrs;
  +
  +            hdrs_arr = table_elts (r -> pApacheReq->headers_out);
  +	    hdrs = (table_entry *)hdrs_arr->elts;
  +
  +            lprintf (r -> pApp,   "[%d]HDR:  %d\n", r -> pThread -> nPid, hdrs_arr->nelts) ; 
  +	    for (i = 0; i < hdrs_arr->nelts; ++i)
  +		if (hdrs[i].key)
  +                    lprintf (r -> pApp,   "[%d]HDR:  %s=%s\n", r -> pThread -> nPid, hdrs[i].key, hdrs[i].val) ; 
  +            }
  +        }
  +    else
   #endif
  -		{ 
  -		if (r -> nIOType == epIOCGI)
  -		    {            
  -		    char txt[100] ;
  -		    int  save = r -> Component.pOutput -> nMarker ;
  -		    SV *   pHeader ;
  -		    char * p ;
  -		    HE *   pEntry ;
  -		    char * pKey ;
  -		    I32    l ;
  -		    char * pContentType = "text/html";
  +	{ 
  +	char txt[100] ;
  +	int  save = r -> Component.pOutput -> nMarker ;
  +	SV *   pHeader ;
  +	char * p ;
  +	HE *   pEntry ;
  +	char * pKey ;
  +	I32    l ;
  +	char * pContentType = "text/html";
  +        STRLEN ldummy ;
   
  -		    r -> Component.pOutput -> nMarker = 0 ; /* output directly */
  -        
  -		    hv_iterinit (r -> pThread -> pHeaderHash) ;
  -		    while ((pEntry = hv_iternext (r -> pThread -> pHeaderHash)))
  -			{
  -			pKey     = hv_iterkey (pEntry, &l) ;
  -			pHeader  = hv_iterval (r -> pThread -> pHeaderHash, pEntry) ;
  +	r -> Component.pOutput -> nMarker = 0 ; /* output directly */
   
  -			if (pHeader && pKey)
  -			    {			    
  - 			    if (SvROK(pHeader)  && SvTYPE(SvRV(pHeader)) == SVt_PVAV ) 
  - 				{
  - 				AV * arr = (AV *)SvRV(pHeader);
  - 				I32 len = av_len(arr);
  -				int i ;
  -
  - 				for (i = 0; i <= len; i++) 
  - 				    {
  - 				    SV ** svp = av_fetch(arr, i, 0);
  - 				    p = SvPV(*svp, ldummy);
  -				    oputs (r, pKey) ;
  -				    oputs (r, ": ") ;
  -				    oputs (r, p) ;
  -				    oputs (r, "\n") ;
  -				    if (r -> Component.Config.bDebug & dbgHeadersIn)
  -                			lprintf (r -> pApp,   "[%d]HDR:  %s: %s\n", r -> pThread -> nPid, pKey, p) ; 
  -				    }
  - 				} 
  -			    else
  -				{				    
  -				p = SvPV (pHeader, na) ;
  -				if (stricmp (pKey, "content-type") == 0)
  -				    pContentType = p ;
  -				else
  -				    {
  -				    oputs (r, pKey) ;
  -				    oputs (r, ": ") ;
  -				    oputs (r, p) ;
  -				    oputs (r, "\n") ;
  -				    }
  -				if (r -> Component.Config.bDebug & dbgHeadersIn)
  -                		    lprintf (r -> pApp,   "[%d]HDR:  %s: %s\n", r -> pThread -> nPid, pKey, p) ; 
  -				}
  -			    }
  -			}
  -		    
  -		    oputs (r, "Content-Type: ") ;
  -		    oputs (r, pContentType) ;
  -		    oputs (r, "\n") ;
  -		    sprintf (txt, "Content-Length: %d\n", GetContentLength (r) + (r -> Component.pCurrEscape?2:0)) ;
  -		    oputs (r, txt) ;
  -		    if (pCookie)
  -			{
  -			oputs (r, sSetCookie) ;
  +	hv_iterinit (r -> pThread -> pHeaderHash) ;
  +	while ((pEntry = hv_iternext (r -> pThread -> pHeaderHash)))
  +	    {
  +	    pKey     = hv_iterkey (pEntry, &l) ;
  +	    pHeader  = hv_iterval (r -> pThread -> pHeaderHash, pEntry) ;
  +
  +	    if (pHeader && pKey)
  +		{			    
  + 		if (SvROK(pHeader)  && SvTYPE(SvRV(pHeader)) == SVt_PVAV ) 
  + 		    {
  + 		    AV * arr = (AV *)SvRV(pHeader);
  + 		    I32 len = av_len(arr);
  +		    int i ;
  +
  + 		    for (i = 0; i <= len; i++) 
  + 			{
  + 			SV ** svp = av_fetch(arr, i, 0);
  + 			p = SvPV(*svp, ldummy);
  +			oputs (r, pKey) ;
   			oputs (r, ": ") ;
  -			oputs (r, SvPV(pCookie, na)) ;
  +			oputs (r, p) ;
   			oputs (r, "\n") ;
  -			SvREFCNT_dec (pCookie) ;
  +			if (r -> Component.Config.bDebug & dbgHeadersIn)
  +                	    lprintf (r -> pApp,   "[%d]HDR:  %s: %s\n", r -> pThread -> nPid, pKey, p) ; 
   			}
  -		    if (pCookie2)
  + 		    } 
  +		else
  +		    {				    
  +		    p = SvPV (pHeader, na) ;
  +		    if (stricmp (pKey, "content-type") == 0)
  +			pContentType = p ;
  +		    else
   			{
  -			oputs (r, sSetCookie) ;
  +			oputs (r, pKey) ;
   			oputs (r, ": ") ;
  -			oputs (r, SvPV(pCookie2, na)) ;
  +			oputs (r, p) ;
   			oputs (r, "\n") ;
  -			SvREFCNT_dec (pCookie2) ;
   			}
  -
  -		    oputs (r, "\n") ;
  -
  -		    r -> Component.pOutput -> nMarker = save ;
  +		    if (r -> Component.Config.bDebug & dbgHeadersIn)
  +                	lprintf (r -> pApp,   "[%d]HDR:  %s: %s\n", r -> pThread -> nPid, pKey, p) ; 
   		    }
   		}
   	    }
  -	}
  +	
  +	oputs (r, "Content-Type: ") ;
  +	oputs (r, pContentType) ;
  +	oputs (r, "\n") ;
  +	sprintf (txt, "Content-Length: %d\n", GetContentLength (r) + (r -> Component.pCurrEscape?2:0)) ;
  +	oputs (r, txt) ;
  +	if (pCookie)
  +	    {
  +	    oputs (r, sSetCookie) ;
  +	    oputs (r, ": ") ;
  +	    oputs (r, SvPV(pCookie, na)) ;
  +	    oputs (r, "\n") ;
  +	    SvREFCNT_dec (pCookie) ;
  +	    }
  +	if (pCookie2)
  +	    {
  +	    oputs (r, sSetCookie) ;
  +	    oputs (r, ": ") ;
  +	    oputs (r, SvPV(pCookie2, na)) ;
  +	    oputs (r, "\n") ;
  +	    SvREFCNT_dec (pCookie2) ;
  +	    }
   
  -    /* --- output the content if not alreay done --- */
  +	oputs (r, "\n") ;
   
  -    if (bOutToMem)
  -        pOut = SvRV (pOutData) ;
  +	r -> Component.pOutput -> nMarker = save ;
  +	}
   
  +    return ok ;
  +    }
   
  -#ifdef APACHE
  -    if ((r -> pApacheReq == NULL || !r -> pApacheReq -> header_only) && 
  -	(!(r -> Component.Config.bOptions & optEarlyHttpHeader) || r -> Component.bAppendToMainReq))
  -#else
  -    if (!(r -> Component.Config.bOptions & optEarlyHttpHeader) || r -> Component.bAppendToMainReq)
  -#endif
  -        {
  -#ifdef EP2
  -	if (r -> Component.Config.bEP1Compat && r -> Component.pCurrEscape)
  -#else
  -	if (r -> Component.pCurrEscape)
  -#endif		
  -	    oputs (r, "\r\n") ;
  -#ifdef EP2OLDXSLT
  +/* ---------------------------------------------------------------------------- */
  +/*                                                                              */
  +/* End the output stream to memory                                              */
  +/*                                                                              */
  +/* ---------------------------------------------------------------------------- */
   
  -        if (bXSLT && !bError && !r -> Component.Config.bEP1Compat)
  -            {
  -            char * pData ;
  -            int    l ;
   
  +static int OutputToMem (/*i/o*/ register req * r)
  +
  +    {
  +    epTHX_
  +    SV * pOut = SvRV (r -> Component.Param.pOutput) ;
  +    char * pData ;
  +    STRLEN    l ;
  +            	
  +    if (!r -> bError && r -> Component.pOutputSV && !r -> Component.pImportStash)
  +	{
  +	sv_setsv (pOut, r -> Component.pOutputSV) ;
  +	}
  +    else
  +	{
  +	if (!r -> bError && !r -> Component.pImportStash)
  +	    {
   	    tDomTree * pDomTree = DomTree_self (r -> Component.xCurrDomTree) ;
   	    Node_toString (r, pDomTree, pDomTree -> xDocument, 0) ;
  +	    }
   
  -            pOut = newSVpv ("", 0) ;
  +	if (!r -> Component.Config.bEP1Compat)
   	    oputs (r, "\r\n") ;
  -            l = GetContentLength (r) + 1 ;
  -            
  -            SvGROW (pOut, l) ;
  -            pData = SvPVX (pOut) ;
  -            oCommitToMem (r, NULL, pData) ;
  -            oRollbackOutput (r, NULL) ;
  -            SvCUR_set (pOut, l - 1) ;
  -
  -            if (r -> Component.bAppendToMainReq)
  -                oBegin (r) ;
  -
  -            
  -            if (strstr (r -> Component.Config.sRecipe, "LibXSLT"))
  -                {
  -#ifdef LIBXSLT
  -                if (r -> Component.Config.bDebug & dbgXSLT)
  -                    lprintf (r -> pApp,  "[%d]XSLT: call libxslt\n", r -> pThread -> nPid) ;
  -
  -                if ((rc = embperl_LibXSLT_Text2Text   (r, r -> pConf -> pReqParameter, pOut)) != ok)
  -                    return rc ;
  -#else
  -                strcpy (r -> errdat1, "libxslt not supported") ;
  -                return 9999 ;
  -#endif
  -                }
  -            else if (strstr (r -> Component.Config.sRecipe, "Xalan"))
  -                {
  -#ifdef XALAN
  -                if (r -> Component.Config.bDebug & dbgXSLT)
  -                    lprintf (r -> pApp,  "[%d]XSLT: call xalan\n", r -> pThread -> nPid) ;
  +	l = GetContentLength (r) + 1 ;
  +    
  +	sv_setpv (pOut, "") ;
  +	SvGROW (pOut, l) ;
  +	pData = SvPVX (pOut) ;
  +	oCommitToMem (r, NULL, pData) ;
  +	SvCUR_set (pOut, l - 1) ;
  +	}
  +    
  +    return ok ;
  +    }
   
  -                if ((rc = embperl_Xalan_Text2Text   (r, r -> pConf -> pReqParameter, pOut)) != ok)
  -                    return rc ;
  -#else
  -                strcpy (r -> errdat1, "xalan not supported") ;
  -                return 9999 ;
  -#endif
  -                }
  -            }
  -#endif
   
  -        if (bOutToMem)
  -            {
  -            char * pData ;
  -            STRLEN    l ;
  -#ifdef EP2
  -            		
  -	    if (!bError && !r -> Component.Config.bEP1Compat && r -> Component.pOutputSV)
  -		{
  -		sv_setsv (pOut, r -> Component.pOutputSV) ;
  -		}
  -	    else
  -		{
  -		if (!bError && !r -> Component.Config.bEP1Compat)
  -		    {
  -		    tDomTree * pDomTree = DomTree_self (r -> Component.xCurrDomTree) ;
  -		    Node_toString (r, pDomTree, pDomTree -> xDocument, 0) ;
  -		    }
  +/* ---------------------------------------------------------------------------- */
  +/*                                                                              */
  +/* End the output stream to file                                                */
  +/*                                                                              */
  +/* ---------------------------------------------------------------------------- */
   
  -		if (!r -> Component.Config.bEP1Compat)
  -		    oputs (r, "\r\n") ;
  -#endif		
  -		l = GetContentLength (r) + 1 ;
  -            
  -		sv_setpv (pOut, "") ;
  -		SvGROW (pOut, l) ;
  -		pData = SvPVX (pOut) ;
  -		oCommitToMem (r, NULL, pData) ;
  -		SvCUR_set (pOut, l - 1) ;
  -#ifdef EP2
  -		}
  -#endif		
  -            }
  -        else
  -            {
  -            if (r -> Component.bAppendToMainReq)
  -                {
  -                tComponent * lc = r -> Component.pPrev ;
   
  +static int OutputToFile (/*i/o*/ register req * r)
   
  -#ifdef EP2
  -		    {
  -		    if (!bError && !r -> Component.pImportStash)
  -			{
  -			tDomTree * pDomTree = DomTree_self (r -> Component.xCurrDomTree) ;
  -#ifdef EP2OLDXSLT
  -                        if (bXSLT)
  -                            {
  -                            int len = GetContentLength (r) + 1 ;
  -                            char * pData = _malloc (r, len) ;
  -                            oCommitToMem (r, NULL, pData) ;
  -                            oRollbackOutput (r, NULL) ;
  -                            lc -> xCurrNode =  Node_appendChild (r -> pApp, DomTree_self (lc -> xCurrDomTree),
  -								lc -> xCurrNode, 
  -								lc -> nCurrRepeatLevel, 
  -			                                            ntypCDATA,
  -                                                                    0,
  -                                                                    pData, len - 1, 0, 0, "XSLT Result") ;
  -                            }
  -                        else
  -#endif
  -                            {
  -                            if (lc -> xCurrNode)
  -				{
  -				if (r -> Component.pOutputSV)
  -				    {
  -				    STRLEN len ;
  -				    char * p = SvPV (r -> Component.pOutputSV, len) ;
  -				    lc -> xCurrNode = Node_insertAfter_CDATA (r -> pApp, p, len, 0, DomTree_self (lc -> xCurrDomTree), lc -> xCurrNode, lc -> nCurrRepeatLevel) ;
  -				    }
  -				else if (pDomTree -> xDocument)
  -				    {
  -				    lc -> xCurrNode = Node_insertAfter (r -> pApp, pDomTree, pDomTree -> xDocument, 0, DomTree_self (lc -> xCurrDomTree), lc -> xCurrNode, lc -> nCurrRepeatLevel) ;
  -				    }
  -				}
  -                            }
  -			}
  -		    }
  -#endif
  -		}
  -            else
  -		{
  -                oCommit (r, NULL) ;
  -#ifdef EP2
  -		if (!bError && !r -> Component.Config.bEP1Compat && !r -> Component.pImportStash 
  -#ifdef EP2OLDXSLT
  -		    && !bXSLT
  -#endif
  -		    )
  -		    {
  -		    if (r -> Component.pOutputSV)
  -			{
  -			STRLEN l ;
  -			char * p = SvPV (r -> Component.pOutputSV, l) ;
  -			owrite (r, p, l) ;
  -			}
  -		    else
  -			{
  -			tDomTree * pDomTree = DomTree_self (r -> Component.xCurrDomTree) ;
  -			Node_toString (r, pDomTree, pDomTree -> xDocument, 0) ;
  -			oputs (r, "\r\n") ;
  -			}
  -		    }
  -#endif
  -		}
  +    {
  +    epTHX_
  +    oCommit (r, NULL) ;
  +    if (!r -> bError && !r -> Component.pImportStash) 
  +	{
  +	if (r -> Component.pOutputSV)
  +	    {
  +	    STRLEN l ;
  +	    char * p = SvPV (r -> Component.pOutputSV, l) ;
  +	    owrite (r, p, l) ;
   	    }
  -        }
  -    else
  -        {
  -        oRollbackOutput (r, NULL) ;
  -        if (bOutToMem)
  -            sv_setsv (pOut, &sv_undef) ;
  -#ifdef EP2
  -	else if (!r -> Component.Config.bEP1Compat)
  +	else
   	    {
   	    tDomTree * pDomTree = DomTree_self (r -> Component.xCurrDomTree) ;
   	    Node_toString (r, pDomTree, pDomTree -> xDocument, 0) ;
  +	    oputs (r, "\r\n") ;
   	    }
  -#endif
  -        }    
  +	}
  +    return ok ;
  +    }
  +
  +/* ---------------------------------------------------------------------------- */
  +/*                                                                              */
  +/* Append tree to upper tree                                                    */
  +/*                                                                              */
  +/* ---------------------------------------------------------------------------- */
   
   
  +static int AppendToUpperTree (/*i/o*/ register req * r)
  +
  +    {
  +    epTHX_
  +    tDomTree * pDomTree = DomTree_self (r -> Component.xCurrDomTree) ;
  +    tComponent * lc = r -> Component.pPrev ;
  +    if (lc -> xCurrNode)
  +	{
  +	if (r -> Component.pOutputSV)
  +	    {
  +	    STRLEN len ;
  +	    char * p = SvPV (r -> Component.pOutputSV, len) ;
  +	    lc -> xCurrNode = Node_insertAfter_CDATA (r -> pApp, p, len, 0, DomTree_self (lc -> xCurrDomTree), lc -> xCurrNode, lc -> nCurrRepeatLevel) ;
  +	    }
  +	else if (pDomTree -> xDocument)
  +	    {
  +	    lc -> xCurrNode = Node_insertAfter (r -> pApp, pDomTree, pDomTree -> xDocument, 0, DomTree_self (lc -> xCurrDomTree), lc -> xCurrNode, lc -> nCurrRepeatLevel) ;
  +	    }
  +	}
       return ok ;
       }
  +
  +/* ---------------------------------------------------------------------------- */
  +/*                                                                              */
  +/* End the output stream                                                        */
  +/*                                                                              */
  +/* ---------------------------------------------------------------------------- */
  +
  +
  +static int EndOutput (/*i/o*/ register req * r,
  +		      /*in*/ int    rc,
  +                      /*in*/ SV *   pOutData) 
  +                      
  +
  +    {
  +    epTHX_
  +
  +    
  +    r -> Component.bEscModeSet = 0 ;
  +
  +    if (rc != ok ||  r -> bError)
  +        { /* --- generate error page if necessary --- */
  +        GenerateErrorPage (r) ;
  +        if (r -> bExit)
  +            return ok ;
  +        }
  +
  +    if (!(r -> Component.Config.bOptions & optEarlyHttpHeader) && 
  +        (r -> Component.Config.bOptions & optSendHttpHeader) && !r -> Component.Param.pOutput)
  +        SendHttpHeader (r) ;
  +
  +    if (r -> Component.Param.pOutput)
  +        return OutputToMem (r) ;
       
  +    return OutputToFile (r) ;
  +    }
  +
   
   
   /* ---------------------------------------------------------------------------- */
  @@ -1481,6 +1399,11 @@
       return ok ;
       }
   
  +/* ---------------------------------------------------------------------------- */
  +/*                                                                              */
  +/* Run Request                                                                  */
  +/*                                                                              */
  +/* ---------------------------------------------------------------------------- */
   
   
   int     embperl_RunRequest  (/*in*/ pTHX_
  @@ -1503,6 +1426,11 @@
       }
       
   
  +/* ---------------------------------------------------------------------------- */
  +/*                                                                              */
  +/* Run Component                                                                */
  +/*                                                                              */
  +/* ---------------------------------------------------------------------------- */
   
   int     embperl_RunComponent(/*in*/ tReq *           r,
                                /*in*/ SV *             pPerlParam)
  @@ -1537,10 +1465,17 @@
           LEAVE;
           r -> Component.bReqRunning = 0 ;
   
  -        /* --- send http header and data to the browser if not already done --- */
  -        if ((rc = EndOutput (r, rc, r -> Component.Param.pOutput)) != ok)
  -            LogError (r, rc) ;
   
  +        if (!r -> bError)
  +            {
  +            if (r -> Component.Param.pOutput)
  +                OutputToMem (r) ;
  +            else if (r -> Component.pOutput == r -> Component.pPrev -> pOutput)
  +                AppendToUpperTree (r) ;
  +            else
  +                OutputToFile (r) ;
  +            }
  +        
           embperl_CleanupComponent  (r, pComponent) ;
           }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: embperl-cvs-unsubscribe@perl.apache.org
For additional commands, e-mail: embperl-cvs-help@perl.apache.org