You are viewing a plain text version of this content. The canonical link for it is here.
Posted to embperl@perl.apache.org by Gerald Richter <ri...@ecos.de> on 2003/02/05 05:38:54 UTC
Re: Patch to specify HTTP status for Location redirects
> The attached patch against Embperl-2.0b8 adds the ability to specify
> an HTTP status when setting the HTTP Location header.
Thanks for the patch, I will put it in 2.0b9
Gerald
> Currently in
> Embperl when using:
>
> $http_headers_out{Location} = "/newlocation.html";
>
> the HTTP status is set to the default value of 301. With this patch,
> however, it is possible to specify a two element array, the second
> element of which gives the desired HTTP status:
>
> $http_headers_out{Location} = [ "/newlocation.html", 303 ];
>
> This produces the following response from Apache:
>
> HTTP/1.1 303 See Other
> Date: Fri, 31 Jan 2003 00:12:51 GMT
> Server: Apache/1.3.22 (Unix) (Red-Hat/Linux) Embperl/2.0b8 mod_ssl/2.8.5
OpenSSL/0.9.6 mod_perl/1.24_01
> location: /newlocation.html
> Connection: close
> Content-Type: text/html
>
> The old behavior is unchanged when $http_headers_out{Location} is a
> scalar or a one-element array.
>
> I made a stab at doing the appropriate thing for the non-Apache branch
> as well. This doesn't (can't?) set the HTTP status, but ignores the
> second element of the array if it is given.
>
> I hope that someone other than me finds this useful.
> --
> David Hull
>
> ------------------------------------------------------------------------
>
> diff -u -r Embperl-2.0b8.orig/epmain.c Embperl-2.0b8.safe/epmain.c
> --- Embperl-2.0b8.orig/epmain.c Mon Jun 24 12:22:52 2002
> +++ Embperl-2.0b8.safe/epmain.c Fri Jan 31 10:50:12 2003
> @@ -828,8 +828,10 @@
> /* loc = 0 => no location header found
> * loc = 1 => location header found
> * loc = 2 => location header + value found
> + * loc = 3 => location header + value + status found
> */
> I32 loc;
> + I32 loc_status = 301;
>
> hv_iterinit (r -> pThread -> pHeaderHash) ;
> while ((pEntry = hv_iternext (r -> pThread -> pHeaderHash)))
> @@ -868,14 +870,16 @@
> for (i = 0; i <= len; i++)
> {
> svp = av_fetch(arr, i, 0);
> + if (loc == 2)
> + {
> + loc = 3;
> + loc_status = SvIV(*svp);
> + break;
> + }
> p = SvPV(*svp, ldummy);
> apr_table_add( r->pApacheReq->headers_out,
apr_pstrdup(r->pApacheReq->pool, pKey),
> apr_pstrdup(r->pApacheReq->pool, p ) );
> - if (loc == 1)
> - {
> - loc = 2;
> - break;
> - }
> + if (loc == 1) loc = 2;
> }
> }
> else
> @@ -885,7 +889,7 @@
> if (loc == 1) loc = 2;
> }
>
> - if (loc == 2) r->pApacheReq->status = 301;
> + if (loc >= 2) r->pApacheReq->status = loc_status;
> }
> }
>
> @@ -928,6 +932,11 @@
> char * pContentType = "text/html";
> STRLEN ldummy ;
>
> + /* loc = 0 => no location header found
> + * loc = 1 => location header found
> + */
> + I32 loc;
> +
> r -> Component.pOutput -> nMarker = 0 ; /* output directly */
>
> hv_iterinit (r -> pThread -> pHeaderHash) ;
> @@ -935,9 +944,12 @@
> {
> 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 (SvROK(pHeader) && SvTYPE(SvRV(pHeader)) == SVt_PVAV )
> {
> AV * arr = (AV *)SvRV(pHeader);
> @@ -954,6 +966,7 @@
> oputs (r, "\n") ;
> if (r -> Component.Config.bDebug & dbgHeadersIn)
> lprintf (r -> pApp, "[%d]HDR: %s: %s\n", r ->
pThread -> nPid, pKey, p) ;
> + if (loc == 1) break;
> }
> }
> else
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: embperl-unsubscribe@perl.apache.org
> For additional commands, e-mail: embperl-help@perl.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: embperl-unsubscribe@perl.apache.org
For additional commands, e-mail: embperl-help@perl.apache.org