Can someone with more brane power than me go over these patches for
sanity?
--
<!-- Matt -->
<:->get a SMart net</:->
Spam trap - do not mail: [EMAIL PROTECTED]
---------- Forwarded message ----------
Date: Mon, 27 Jan 2003 17:04:28 +0100 (CET)
From: Michael Kroell <[EMAIL PROTECTED]>
To: "[EMAIL PROTECTED]" <[EMAIL PROTECTED]>
Subject: AxKit.pm/Cache.pm next one
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
matt,
forget the two diffs hansjoerg and i sent to you this morning
this time i tweaked a little more. those two patches change the following:
* cache is saved transformed
* $cache->deliver is no more, content is delivered by AxKit::deliver_to_browser
* caching works, and does not croak with "Cannot call method no_cache on an
undefined value"
concerns:
* memory, performance (<- copying to $xmlstring from pnotes)
* error handling (<- not tested, i.e what happens during processing errors)
rfc,
michael
- --
IT Services
University of Innsbruck
-----BEGIN PGP SIGNATURE-----
Version: PGP 6.5.8
iQA/AwUBPjVYj3jN0CNeKmaIEQJ4AQCfWNbW8iiJTRcgINEnxc+Q9/mxJn8AoKAN
gyzk7Tl+0Za8MWZ6QSm5a0Ug
=WhIy
-----END PGP SIGNATURE-----
--- /mp_sie2/ci00/src/webserver/axkit/perl/apachecvs/xml-axkit/lib/AxKit.pm
Mon Jan 27 10:29:11 2003
+++ AxKit.pm Mon Jan 27 16:42:46 2003
@@ -1,4 +1,4 @@
-# $Id: AxKit.pm,v 1.36 2003/01/26 17:37:42 matts Exp $
+# $Id: AxKit.pm,v 1.34 2003/01/21 16:11:57 matts Exp $
package AxKit;
use strict;
@@ -109,7 +109,7 @@
$func = sub {
my $map = Apache::AxKit::CharsetConv->new("utf-8", $charset)
- || die "Charset $charset not supported by Iconv";
+ || die "Charset $charset not supported by Iconv";
return map { $map->convert( $_ ) } ($outputfunc->(@_));
};
@@ -313,7 +313,7 @@
}
elsif ($E->isa('Apache::AxKit::Exception::Retval')) {
my $code = $E->{return_code};
- AxKit::Debug(5, "aborting with code $code");
+ AxKit::Debug(5, "aborting with code $code");
return $code;
}
@@ -422,15 +422,16 @@
$AxKit::Charset = $AxKit::Cfg->OutputCharset();
+ # Store in package variable for other modules
+ $AxKit::Cache = $cache;
+
if (!$recreate) {
AxKit::Debug(1, "delivering cached copy - all conditions met");
- return $cache->deliver();
+ return OK;
}
AxKit::Debug(1, "some condition failed. recreating output");
- # Store in package variable for other modules
- $AxKit::Cache = $cache;
# reconsecrate Apache request object (& STDOUT) into our own class
bless $r, 'AxKit::Apache';
@@ -468,7 +469,7 @@
save_dependencies($r, $cache);
return $return_code;
-
+
}
sub get_axkit_uri {
@@ -478,31 +479,12 @@
my $apache = AxKit::Apache->request;
my $r;
- if ($uri =~ m|^axkit:(/.*)$|) {
- my $blurb = $1;
- # got "axkit:/..."
- # first check if it's actually "axkit://host[:port]/..."
- if ($blurb =~ m|^//(?:([\w\.-]+)(:\d+)?)?(/.*)$|) {
- my $host = $1;
- my $port = $2;
- my $abs_uri = $3;
- if ($host) {
- throw Apache::AxKit::Exception (
- -text => "axkit://host[:port]/ requests not supported
($uri)"
- );
- }
- AxKit::Debug(4, "get_axkit_uri looking up abs (host): '$abs_uri'");
- $r = $apache->lookup_uri(AxKit::FromUTF8($abs_uri));
- }
- else {
- my $abs_uri = $blurb;
- AxKit::Debug(4, "get_axkit_uri looking up abs: '$abs_uri'");
- $r = $apache->lookup_uri(AxKit::FromUTF8($abs_uri));
- }
+ if ($uri =~ /^axkit:\/(\/.*)$/) {
+ my $abs_uri = $1;
+ $r = $apache->lookup_uri(AxKit::FromUTF8($abs_uri));
}
elsif ($uri =~ /^axkit:(.*)$/) {
my $rel_uri = $1;
- AxKit::Debug(4, "get_axkit_uri looking up '$rel_uri'");
$r = $apache->lookup_uri(AxKit::FromUTF8($rel_uri));
}
else {
@@ -514,47 +496,11 @@
my $provider = Apache::AxKit::Provider->new_content_provider($r);
- my $result_code = eval {
- run_axkit_engine(
- $r,
- $provider,
- 1, # no output
- );
- };
- if ($@) {
- my $E = $@;
- if ($E->isa('Apache::AxKit::Exception::Declined')) {
- if ($AxKit::Cfg && $AxKit::Cfg->LogDeclines()) {
- $r->log->warn("[AxKit] [DECLINED] $E->{reason}")
- if $E->{reason};
- }
- AxKit::Debug(4, "[DECLINED] From: $E->{-file} : $E->{-line}");
-
- my $str = '';
- eval {
- my $fh = $provider->get_fh;
- local $/;
- $str = <$fh>;
- $r->pnotes('xml_string', $str);
- $result_code = OK;
- };
- if ($@) {
- eval {
- my $pstr = $provider->get_strref;
- $str = $$pstr;
- $r->pnotes('xml_string', $str);
- $result_code = OK;
- };
- if ($@) {
- $result_code = 'provider_declined';
- }
- }
- }
- else {
- # Some other type of exception
- $E->throw;
- }
- }
+ my $result_code = run_axkit_engine(
+ $r,
+ $provider,
+ 1, # no output
+ );
if ($result_code == OK) {
# results now in $r->pnotes('xml_string') - probably...
@@ -720,7 +666,7 @@
$styleprovider,
$output_to_browser,
);
- AxKit::Debug(5, "$mapto\::handler finished with code $retval");
+ AxKit::Debug(5, "$mapto\::handler finished with code $retval");
$result_code = $retval if $retval != OK;
}
else {
@@ -864,100 +810,88 @@
sub deliver_to_browser {
my ($r, $result_code) = @_;
$result_code ||= OK;
-
- AxKit::Debug(4, "delivering to browser");
+ my $got_cached;
+ my $xmlstring;
if (length($r->pnotes('xml_string'))) {
# ok, data is in xml_string
- AxKit::Debug(4, "Delivering xml_string");
+ AxKit::Debug(5, "Delivering from xml_string pnote");
+ $xmlstring = $r->pnotes('xml_string');
}
elsif ($r->pnotes('dom_tree')) {
- AxKit::Debug(4, "Delivering dom_tree");
- $r->pnotes('xml_string', $r->pnotes('dom_tree')->toString );
+ AxKit::Debug(5, "Delivering from dom_tree pnote");
+ $xmlstring = $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);
- $r->content_type('text/html; charset=' . ($AxKit::Cfg->OutputCharset
|| "UTF-8"));
- }
- elsif ($r->notes('axkit_passthru_type')) {
- $r->content_type($AxKit::OrigType);
- }
-
- if (my $charset = $AxKit::Cfg->OutputCharset()) {
- my $ct = $r->content_type;
- $ct =~ s/charset=.*?(;|$)/charset=$charset/i;
- $r->content_type($ct);
+ AxKit::Debug(5, "Cache delivery coming up...");
+ $xmlstring = $AxKit::Cache->read();
+ $got_cached++;
}
- if ($result_code != OK && $result_code != 200) {
- # no caching - probably makes no sense, and will be turned off
- # anyways, as currently only XSP pages allow to send custom responses
- AxKit::Debug(4,"sending custom response: $result_code");
- my ($transformer, $doit) = get_output_transformer();
- if ($doit) {
-
$r->custom_response($result_code,$transformer->($r->pnotes('xml_string') ||
''));
+ if (!$got_cached) {
+ if ($r->content_type eq 'changeme' &&
!$r->notes('axkit_passthru_type')) {
+ $AxKit::Cfg->AllowOutputCharset(1);
+ $r->content_type('text/html; charset=' .
($AxKit::Cfg->OutputCharset || "UTF-8"));
}
- else {
- $r->custom_response($result_code,$r->pnotes('xml_string') || '');
+ elsif ($r->notes('axkit_passthru_type')) {
+ $r->content_type($AxKit::OrigType);
}
- return $result_code;
- }
- if ($AxKit::Cache->no_cache() ||
- 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) {
- AxKit::Debug(4, 'Sending gzipped xml string to browser');
- AxKit::Apache::send_http_header($r);
- if ($doit) {
- $r->print( unpack($]>5.00555?"U0A*":"A*",
Compress::Zlib::memGzip(
- $transformer->( $r->pnotes('xml_string') )
- ) ) );
- }
- else {
- $r->print( unpack($]>5.00555?"U0A*":"A*",
Compress::Zlib::memGzip( $r->pnotes('xml_string') ) ) );
- }
+ if (my $charset = $AxKit::Cfg->OutputCharset()) {
+ my $ct = $r->content_type;
+ $ct =~ s/charset=.*?(;|$)/charset=$charset/i;
+ $r->content_type($ct);
}
- else {
- AxKit::Apache::send_http_header($r);
+
+ if ($result_code != OK && $result_code != 200) {
+ # no caching - probably makes no sense, and will be turned off
+ # anyways, as currently only XSP pages allow to send custom
responses
+ AxKit::Debug(4,"Sending custom response: $result_code");
+ my ($transformer, $doit) = get_output_transformer();
if ($doit) {
- $r->print(
- $transformer->( $r->pnotes('xml_string') )
- );
+ $r->custom_response($result_code,$transformer->($xmlstring ||
''));
}
else {
- $r->print( $r->pnotes('xml_string') );
+ $r->custom_response($result_code,$xmlstring || '');
}
+ return $result_code;
}
- return OK;
- }
- else {
- AxKit::Debug(4, "writing xml string to cache and delivering to
browser");
- my $retval = eval {
- $AxKit::Cache->write($r->pnotes('xml_string'));
- $AxKit::Cache->deliver();
- };
- if (my $E = $@) {
- if ($E->isa('Apache::AxKit::Exception::IO')) {
- AxKit::Debug(1, "WARNING: Unable to write to AxCacheDir or
.xmlstyle_cache");
- AxKit::Apache::send_http_header($r);
- $r->print( $r->pnotes('xml_string') );
- }
- else {
- throw $E;
+
+ my ($transformer, $doit) = get_output_transformer();
+
+ if ($doit) {
+ $xmlstring = join('', $transformer->($xmlstring)); # hmmmmmm, not
good
+ }
+
+ if ($AxKit::Cache->no_cache() ||
+ lc($r->dir_config('Filter')) eq 'on' ||
+ $r->method() eq 'POST')
+ {
+ if ($AxKit::Cfg->DoGzip) {
+ AxKit::Debug(4, 'Sending gzipped xml string to browser');
+ $xmlstring = unpack($]>5.00555?"U0A*":"A*",
Compress::Zlib::memGzip($xmlstring) );
}
}
else {
- return $retval;
+ AxKit::Debug(4, "Writing xml string to cache");
+ eval {
+ $AxKit::Cache->write($xmlstring);
+ };
+ if (my $E = $@) {
+ if ($E->isa('Apache::AxKit::Exception::IO')) {
+ AxKit::Debug(1, "WARNING: Unable to write to AxCacheDir or
.xmlstyle_cache");
+ }
+ else {
+ throw $E;
+ }
+ }
}
}
+
+ AxKit::Debug(4, "Delivering to browser");
+ AxKit::Apache::send_http_header($r);
+ $r->print($xmlstring);
+ return OK;
}
sub prep_exception {
---
/mp_sie2/ci00/src/webserver/axkit/perl/apachecvs/xml-axkit/lib/Apache/AxKit/Cache.pm
Thu Jan 23 09:35:08 2003
+++ Apache/AxKit/Cache.pm Mon Jan 27 15:22:22 2003
@@ -197,56 +197,6 @@
return '';
}
-sub deliver {
- my $self = shift;
- return SERVER_ERROR if $self->{no_cache};
- my $r = $self->{apache};
-
- {
- # get content-type
- AxKit::Debug(4, "Cache: Getting content-type");
- if (my $type = $self->get_type) {
- AxKit::Debug(4, "Cache: setting content-type: $type");
- $r->content_type($type);
- }
- }
-
- if ($r->content_type eq 'changeme' && !$r->notes('axkit_passthru_type')) {
- $AxKit::Cfg->AllowOutputCharset(1);
- $r->content_type('text/html; charset=' . ($AxKit::Cfg->OutputCharset
|| "UTF-8"));
- }
- elsif ($r->notes('axkit_passthru_type')) {
- $r->content_type($AxKit::OrigType);
- }
-
-
- my ($transformer, $doit) = AxKit::get_output_transformer();
-
- if ($doit) {
- AxKit::Debug(4, "Cache: Transforming content and printing to browser");
- $r->pnotes('xml_string',$self->read());
- return OK; # upstream deliver_to_browser should handle the rest
- }
- else {
- AxKit::Debug(4, "Cache: Sending untransformed content to browser");
-
- # Make sure we unset PATH_INFO or wierd things can happen!
- $ENV{PATH_INFO} = '';
- $r->path_info('');
-
- if ($self->{gzip} && $AxKit::Cfg->DoGzip) {
- AxKit::Debug(4, 'Cache: Delivering gzipped output');
- $r->filename($self->{file}.'.gz');
- }
- else {
- $r->filename($self->{file});
- }
-
- return DECLINED;
- }
-
-}
-
sub reset {
my $self = shift;
unlink $self->{file};