matts 2003/01/08 09:09:56
Modified: lib AxKit.pm Log: Fixed pnotes problems with subrequests (triggered by axkit:// urls). Some tidy up. fixed extra output going to browser with axkit:// urls Revision Changes Path 1.33 +66 -17 xml-axkit/lib/AxKit.pm Index: AxKit.pm =================================================================== RCS file: /home/cvs/xml-axkit/lib/AxKit.pm,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- AxKit.pm 4 Jan 2003 18:11:08 -0000 1.32 +++ AxKit.pm 8 Jan 2003 17:09:55 -0000 1.33 @@ -257,6 +257,9 @@ return $provider->decline(); } + # setup global pnotes. + local $AxKit::Apache::PNOTES = $r->pnotes(); + if ($r->notes('axkit_passthru')) { # slow passthru $r->send_http_header('text/xml'); @@ -378,7 +381,7 @@ } sub run_axkit_engine { - my ($r, $provider) = @_; + my ($r, $provider, $no_output) = @_; # get preferred stylesheet and media type my ($preferred, $media) = get_style_and_media(); @@ -428,11 +431,11 @@ # Store in package variable for other modules $AxKit::Cache = $cache; - + # reconsecrate Apache request object (& STDOUT) into our own class bless $r, 'AxKit::Apache'; tie *STDOUT, 'AxKit::Apache', $r; - + if (my $charset = $AxKit::Cfg->OutputCharset) { AxKit::Debug(5, "Different output charset: $charset"); if (!$r->notes('axkit_passthru_type')) { @@ -455,7 +458,12 @@ } # Main grunt of the work done here... - my $return_code = process_request($r, $provider, $AxKit::_CurrentStylesheets); + my $return_code = process_request( + $r, + $provider, + $AxKit::_CurrentStylesheets, + $no_output, + ); save_dependencies($r, $cache); @@ -487,24 +495,39 @@ my $provider = Apache::AxKit::Provider->new_content_provider($r); - my $result_code = run_axkit_engine($r, $provider); + my $result_code = run_axkit_engine( + $r, + $provider, + 1, # no output + ); if ($result_code == OK) { # results now in $r->pnotes('xml_string') - probably... - # warning; missing caching logic here from deliver_to_browser. - if (not $r->pnotes('xml_string') and $r->pnotes('dom_tree')) { - return $r->pnotes('dom_tree')->toString; + if (length($r->pnotes('xml_string'))) { + my $str = $r->pnotes('xml_string'); + AxKit::Debug(10, "get_axkit_uri returning (str): '$str'"); + return $str; + } + elsif ($r->pnotes('dom_tree')) { + my $str = $r->pnotes('dom_tree')->toString; + AxKit::Debug(10, "get_axkit_uri returning (dom): '$str'"); + return $str; } else { - return $r->pnotes('xml_string'); + throw Apache::AxKit::Exception ( + -text => "$uri internal request didn't store anything in dom_tree or xml_string", + ); } } elsif ($result_code == DECLINED) { # probably came from the cache system. Try and read it. + AxKit::Debug(10, "get_axkit_uri cache read"); return $AxKit::Cache->read(); } else { - throw Apache::AxKit::Exception ( -text => "$uri internal request returned unknown result code: ".$result_code); + throw Apache::AxKit::Exception ( + -text => "$uri internal request returned unknown result code: ".$result_code, + ); } } @@ -582,7 +605,7 @@ } sub process_request { - my ($r, $provider, $styles) = @_; + my ($r, $provider, $styles, $no_output) = @_; my $result_code = OK; my $num_styles = 0; @@ -602,6 +625,9 @@ while (@$styles) { my $style = shift @$styles; + + my $num_left = @$styles; + my $output_to_browser = ($num_left == 0 && !$no_output); my $styleprovider = Apache::AxKit::Provider->new_style_provider( $r, @@ -635,7 +661,7 @@ $r, $provider, $styleprovider, - [EMAIL PROTECTED], # any more left? + $output_to_browser, ); AxKit::Debug(5, "$mapto\::handler finished with code $retval"); $result_code = $retval if $retval != OK; @@ -781,10 +807,20 @@ sub deliver_to_browser { my ($r, $result_code) = @_; $result_code ||= OK; + + AxKit::Debug(4, "delivering to browser"); - if (not $r->pnotes('xml_string') and $r->pnotes('dom_tree')) { + if (length($r->pnotes('xml_string'))) { + # ok, data is in xml_string + AxKit::Debug(4, "Delivering xml_string"); + } + elsif ($r->pnotes('dom_tree')) { + AxKit::Debug(4, "Delivering dom_tree"); $r->pnotes('xml_string', $r->pnotes('dom_tree')->toString ); } + else { + AxKit::Debug(5, "Possible cache delivery coming up..."); + } if ($r->content_type eq 'changeme' && !$r->notes('axkit_passthru_type')) { $AxKit::Cfg->AllowOutputCharset(1); @@ -815,8 +851,9 @@ } if ($AxKit::Cache->no_cache() || - lc($r->dir_config('Filter')) eq 'on' || - $r->method() eq 'POST') { + lc($r->dir_config('Filter')) eq 'on' || + $r->method() eq 'POST') + { AxKit::Debug(4, "writing xml string to browser"); my ($transformer, $doit) = get_output_transformer(); if ($AxKit::Cfg->DoGzip) { @@ -938,7 +975,7 @@ ######################################################################### package AxKit::Apache; -use vars qw/@ISA/; +use vars qw/@ISA $PNOTES/; use Apache; use Fcntl qw(:DEFAULT); @ISA = ('Apache'); @@ -1004,6 +1041,18 @@ $self->notes('headers_sent', 1); $self->SUPER::send_http_header; +} + +sub pnotes { + my $self = shift; + if ([EMAIL PROTECTED]) { + return $PNOTES; + } + my $key = shift; + if (@_) { + return $PNOTES->{$key} = $_[0]; + } + return $PNOTES->{$key}; } 1;