Don't think that works, though. The only way I can get a cookie being
delivered to the browser is by explicitly returning a html page
containting a meta refresh tag using a subroutine like this:

sub doRefresh {
   my ( $url, $delay, $cookie ) = @_;
   my $name = $cookie->name;
   my $value = $cookie->value;
   my $path  = $cookie->path;

   return <<EOT
<html>
<head>
<meta http-equiv="refresh" content="$delay, url=$url">
<meta http-equiv="Set-Cookie" content="$name=$value; expires=1; path=$path">
</head>
<body>
</body>
</html>
EOT
}

Clearly, there must be a better (nicer) way to do this, don't you think?

Regards,
Marc

James Smith wrote:

Marc,

You will need to get the cookie sent back to the browser,
if you redirect to a URL with no domain in it - Apache
"cleverly" notices this and performs the second request
without going back to the browser. To force return to the
browser include the domain in the URL
 $r->headers_out->set( Location => "http://my.dn.org/login?redirect=1"; );

On Sun, 14 Aug 2005, Marc Lambrichs wrote:

I'm trying to build a mp2 handler to login using mod_auth_tkt2. I like the idea 
of probing if
the client can support cookies, so tried to rebuild it. According to the cgi 
example there
is some problem with setting the cookie on a redirect. The same problem - no 
probe cookie is set
during the redirect - occurs when I use the following method, and I can't see 
why.

#-------------------------------------------------------------------------
sub login: method
#-------------------------------------------------------------------------
{
   my ( $class, $r ) = @_;

   #$r->print('sub run ', B::Deparse->new->coderef2text( \&run ));
   my $apr = Apache2::Request->new($r);

   ### Check if there are any cookies defined
   my $jar = Apache2::Cookie::Jar->new( $r );
   my $cookie = $jar->cookies( 'tkt' );
   my $probe  = $jar->cookies( 'probe' );
   my $has_cookies = $cookie ||
                     $probe  || '';
   if ( ! $has_cookies ){
      ### if this is a self redirect warn the user about cookie support
      if ( $apr->param( 'redirect' ) ) {
         my @remarks = ( 'Your browser does not appear to support cookies.',
                         'This site requires cookies - please turn cookie 
support' );
         my $detail = join '&', map { sprintf "detail=%s", $_ } @remarks;
         $r->internal_redirect_handler( "/error?type=400&$detail" );
         return Apache2::Const::OK;
      }
      ### If no cookies and not a redirect, redirect to self to test cookies.
      else {
         $cookie = Apache2::Cookie->new( $r,
                                         -name   => "probe",
                                         -domain => 'my.domain',
                                         -value  => 1 );
         $cookie->path("/");
         $cookie->bake( $r );
         $r->headers_out->set( Location => "/login?redirect=1" );

         return Apache2::Const::REDIRECT;
      }
   }
}




Reply via email to