mach 2004/01/31 11:28:32
Modified: . AxKit.xs MANIFEST lib/Apache/AxKit Provider.pm t/conf extra.last.conf.in Added: lib/Apache/AxKit/Provider POST.pm t/htdocs/style/provider 01.xsl t/provider 01post.t Log: Fix for get_strref being called twice. Revision Changes Path 1.7 +13 -16 xml-axkit/AxKit.xs Index: AxKit.xs =================================================================== RCS file: /home/cvs/xml-axkit/AxKit.xs,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- AxKit.xs 5 Jun 2002 23:59:19 -0000 1.6 +++ AxKit.xs 31 Jan 2004 19:28:32 -0000 1.7 @@ -373,26 +373,22 @@ ret = -1; error_str = newSVpv("", 0); - xmlInitParser(); xmlDoValidityCheckingDefaultValue = 0; xmlSubstituteEntitiesDefaultValue = 0; xmlLoadExtDtdDefaultValue = 0; - read_length = read_perl(ioref, buffer, 4); - if (read_length > 0) { - ctxt = xmlCreatePushParserCtxt(axkitSAXHandler, - NULL, buffer, read_length, "filename"); - ctxt->userData = (void*)&results; - - while(read_length = read_perl(ioref, buffer, BUFSIZE)) { - xmlParseChunk(ctxt, buffer, read_length, 0); - } - ret = xmlParseChunk(ctxt, buffer, 0, 1); - - xmlFreeParserCtxt(ctxt); - } + read_length = 0; + ctxt = xmlCreatePushParserCtxt(axkitSAXHandler, + &results, buffer, read_length, "filename"); + + while(read_length = read_perl(ioref, buffer, BUFSIZE)) { + xmlParseChunk(ctxt, buffer, read_length, 0); + } + ret = xmlParseChunk(ctxt, buffer, 0, 1); + + xmlFreeParserCtxt(ctxt); sv_2mortal(error_str); @@ -406,11 +402,12 @@ STRLEN len; croak("xmlParse returned error: %d, %s", ret, SvPV(error_str, len)); } - + return_array = newAV(); av_push(return_array, newRV_noinc((SV*)results.xml_stylesheet)); av_push(return_array, newSVpv(results.start_element, 0)); av_push(return_array, newRV_noinc((SV*)results.start_attribs)); + if (results.dtd != NULL) { av_push(return_array, newSVpv(results.dtd, 0)); 1.21 +3 -1 xml-axkit/MANIFEST Index: MANIFEST =================================================================== RCS file: /home/cvs/xml-axkit/MANIFEST,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- MANIFEST 19 Oct 2003 16:09:36 -0000 1.20 +++ MANIFEST 31 Jan 2004 19:28:32 -0000 1.21 @@ -157,6 +157,7 @@ lib/Apache/AxKit/Provider/FileWrite.pm lib/Apache/AxKit/Provider/Filter.pm lib/Apache/AxKit/Provider/Scalar.pm +lib/Apache/AxKit/Provider/POST.pm lib/Apache/AxKit/StyleChooser/Cookie.pm lib/Apache/AxKit/StyleChooser/FileSuffix.pm lib/Apache/AxKit/StyleChooser/PathInfo.pm @@ -208,5 +209,6 @@ t/htdocs/uri/axkit/subrequest.xml t/htdocs/style/uri/axkit/01.xsl t/htdocs/style/uri/axkit/subrequest.xsl - +t/provider/01post.t +t/htdocs/style/provider/01.xsl typemap 1.19 +139 -84 xml-axkit/lib/Apache/AxKit/Provider.pm Index: Provider.pm =================================================================== RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/Provider.pm,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- Provider.pm 3 Oct 2003 18:38:38 -0000 1.18 +++ Provider.pm 31 Jan 2004 19:28:32 -0000 1.19 @@ -5,6 +5,7 @@ use Apache::AxKit::Exception; use Apache::Constants qw(OK DECLINED); +use AxKit; # use vars qw/$COUNT/; @@ -130,6 +131,7 @@ ); } + sub get_dom { my $self = shift; require Apache::AxKit::LibXMLSupport; @@ -142,21 +144,33 @@ $XML::LibXML::read_cb, $XML::LibXML::close_cb); Apache::AxKit::LibXMLSupport->reset($parser); + my $r = $self->apache_request(); + my $xml_doc; - eval { - my $fh = $self->get_fh(); - AxKit::Debug(8, "Provider::get_dom/parse_fh($fh, ", $self->{apache}->uri(), ")"); - $xml_doc = $parser->parse_fh($fh, $self->{apache}->uri()); - }; - if ($@) { - use bytes; - my $xmlstring = ${$self->get_strref()}; - AxKit::Debug(8, "Provider::get_dom/parse_string($xmlstring, ", $self->{apache}->uri(), ")"); - $xml_doc = $parser->parse_string($xmlstring, $self->{apache}->uri()) || + my $str; + if($str = $r->pnotes('xml_string')) { + use bytes; + AxKit::Debug(8, "Provider::get_dom/parse_string($str, ", $self->{apache}->uri(), ")"); + $xml_doc = $parser->parse_string($str, $self->{apache}->uri()) || throw Apache::AxKit::Exception::Error( -text => "XML::LibXML->parse_string returned nothing!" ); - } + } else { + eval { + my $fh = $self->get_fh(); + AxKit::Debug(8, "Provider::get_dom/parse_fh($fh, ", $self->{apache}->uri(), ")"); + $xml_doc = $parser->parse_fh($fh, $self->{apache}->uri()); + }; + if ($@) { + use bytes; + my $xmlstring = ${$self->get_strref()}; + AxKit::Debug(8, "Provider::get_dom/parse_string($xmlstring, ", $self->{apache}->uri(), ")"); + $xml_doc = $parser->parse_string($xmlstring, $self->{apache}->uri()) || + throw Apache::AxKit::Exception::Error( + -text => "XML::LibXML->parse_string returned nothing!" + ); + } + } return $xml_doc; } @@ -228,9 +242,7 @@ undef $pref_style; } - my $xml_styles = []; - my $vals = []; - + my @styles; my $key = $self->key(); # need to extract the following from the XML file: @@ -238,68 +250,25 @@ # DTD filename # Root element name (including namespace) # use three element array @$vals + + my ($doctype, $dtd, $root, $xml_styles) = $self->get_xml_info( $media, $pref_style ); + + $xml_styles = [] if $AxKit::Cfg->IgnoreStylePI(); + + foreach my $style (@$xml_styles) { + $style->{title} ||= '#default'; + } + + # Let GetMatchingProcessors to process the @$styles array + { + local $^W; # suppress "Use of uninitialized value" warnings + AxKit::Debug(4, "Calling GetMatchingProcessors with ($media, $pref_style, $doctype, $dtd, $root)"); + } - if (defined &Apache::AxKit::Provider::xs_get_styles_fh) { - AxKit::Debug(2, "using XS get_styles (libxml2)"); - my ($xs_styles, $doctype, $dtd, $root) = - $self->xs_get_styles($media, $pref_style); - @$xml_styles = @$xs_styles unless $AxKit::Cfg->IgnoreStylePI(); - @$vals = ($doctype, $dtd, $root); - } - else { - require XML::Parser; - - AxKit::Debug(4, "get_styles: creating XML::Parser"); - - my $handlers = { - Start => \&parse_start, - Doctype => \&parse_dtd, - $AxKit::Cfg->IgnoreStylePI() ? () : (Proc => \&parse_pi), - }; - - my $xml_parser = XML::Parser->new( - Namespaces => 1, - ErrorContext => 2, - Handlers => $handlers, - ); + @styles = $AxKit::Cfg->GetMatchingProcessors($media, $pref_style, $doctype, $dtd, $root, $xml_styles, $self); - my $to_parse; - eval { - $to_parse = $self->get_fh(); - }; - if ($@) { - $to_parse = ${ $self->get_strref(); }; - } - - AxKit::Debug(4, "get_styles: calling XML::Parser->parse('$key')"); - $xml_parser->parse( - $to_parse, - XMLStyle_preferred => $pref_style, - XMLStyle_media => $media, - XMLStyle_style => $xml_styles, - XMLStyle_vals => $vals, - XMLStyle_style_screen => [], - ); - - AxKit::Debug(4, "get_styles: parse returned successfully"); - } - - foreach my $style (@$xml_styles) { - $style->{title} ||= '#default'; - } - - # Let GetMatchingProcessors to process the @$styles array - { - local $^W; # suppress "Use of uninitialized value" warnings - AxKit::Debug(4, "Calling GetMatchingProcessors with ($media, $pref_style, $vals->[0], $vals->[1], $vals->[2])"); - } - my @styles = $AxKit::Cfg->GetMatchingProcessors($media, - $pref_style, @$vals[0 .. 2], $xml_styles, $self); - if ([EMAIL PROTECTED]) { - throw Apache::AxKit::Exception::Declined( - reason => "No styles defined for '$key'" - ); + throw Apache::AxKit::Exception::Declined( reason => "No styles defined for '$key'" ); } # get mime-type => module mapping @@ -331,20 +300,105 @@ return [EMAIL PROTECTED]; } +sub get_xml_info{ + my ($self, $media, $pref_style ) = @_; + + # This is where the sniffing of the xml content happens. + + my $r = $self->apache_request(); + my @ret; + eval{ + my $fh = $self->get_fh(); + my $pos = eval { tell $fh; }; + if($@) { + # fh is not seekable, thus we must slurp file at this point. + undef $@; + local($/) = undef; + my $string = <$fh>; + $r->pnotes('xml_string', $string); + @ret = parse_xml_info( $r, undef, \$string, $media, $pref_style); + } else { + # seekable. + @ret = parse_xml_info( $r, $fh, undef, $media, $pref_style); + seek $fh, 0, $pos; + } + }; + if($@) { + my $str_ref = $self->get_strref(); + $r->pnotes('xml_string', ${$str_ref}); + @ret = parse_xml_info( $r, undef, $str_ref, $media, $pref_style); + } + return @ret; +} + +sub parse_xml_info{ + my ($r, $fh, $str_ref, $media, $pref_style) = @_; + + if ($pref_style eq '#default') { + undef $pref_style; + } + + my $xml_styles = []; + my $vals = []; + my @styles; + + if (defined &Apache::AxKit::Provider::xs_get_styles_fh) { + AxKit::Debug(2, "using XS get_styles (libxml2)"); + my ($xs_styles, $doctype, $dtd, $root) = xs_get_styles($r, $fh, $str_ref, $media, $pref_style); + @$xml_styles = @$xs_styles unless $AxKit::Cfg->IgnoreStylePI(); + @$vals = ($doctype, $dtd, $root); + } + else { + require XML::Parser; + + AxKit::Debug(4, "get_styles: creating XML::Parser"); + + my $handlers = { + Start => \&parse_start, + Doctype => \&parse_dtd, + $AxKit::Cfg->IgnoreStylePI() ? () : (Proc => \&parse_pi), + }; + + my $xml_parser = XML::Parser->new( + Namespaces => 1, + ErrorContext => 2, + Handlers => $handlers, + ); + + my $to_parse = $fh || ${$str_ref}; + #eval { + # $to_parse = $provider->get_fh(); + #}; + #if ($@) { + # $to_parse = ${ $provider->get_strref(); }; + #} + + AxKit::Debug(4, "get_styles: calling XML::Parser->parse()"); + $xml_parser->parse( + $to_parse, + XMLStyle_preferred => $pref_style, + XMLStyle_media => $media, + XMLStyle_style => $xml_styles, + XMLStyle_vals => $vals, + XMLStyle_style_screen => [], + ); + + AxKit::Debug(4, "get_styles: parse returned successfully"); + } + + return (@$vals, $xml_styles); +} + sub xs_get_styles { - my $self = shift; - my ($media, $pref_style) = @_; + my ($r, $fh, $strref, $media, $pref_style) = @_; my $bits; - eval { - my $fh = $self->get_fh(); + if(defined($fh)) { AxKit::Debug(4, "calling xs_get_styles_fh()"); - $bits = xs_get_styles_fh($self->apache_request, $fh); - }; - if ($@) { - my $strref = $self->get_strref(); + $bits = xs_get_styles_fh($r, $fh); + } else { AxKit::Debug(4, "calling xs_get_styles_str()"); - $bits = xs_get_styles_str($self->apache_request, $$strref); + $bits = xs_get_styles_str($r, $$strref); } my @xml_stylesheet = @{$bits->[0]}; @@ -366,7 +420,7 @@ XMLStyle_style_screen => [], XMLStyle_preferred => $pref_style, XMLStyle_media => $media, - }; + }; foreach my $pi (@xml_stylesheet) { parse_pi($e, "xml-stylesheet", $pi); @@ -536,6 +590,7 @@ } } } + 1; __END__ 1.2 +132 -0 xml-axkit/lib/Apache/AxKit/Provider/POST.pm 1.8 +8 -0 xml-axkit/t/conf/extra.last.conf.in Index: extra.last.conf.in =================================================================== RCS file: /home/cvs/xml-axkit/t/conf/extra.last.conf.in,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- extra.last.conf.in 19 Oct 2003 16:09:36 -0000 1.7 +++ extra.last.conf.in 31 Jan 2004 19:28:32 -0000 1.8 @@ -135,3 +135,11 @@ AxAddProcessor text/xsl /style/uri/axkit/subrequest.xsl </Location> +<Location "/provider/post"> + Sethandler axkit + AxResetProcessors + AxContentProvider Apache::AxKit::Provider::POST + AxAddRootProcessor text/xsl /style/provider/01.xsl root +</Location> + + 1.2 +9 -0 xml-axkit/t/htdocs/style/provider/01.xsl 1.2 +20 -0 xml-axkit/t/provider/01post.t