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;
}
}
}