You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axkit-dev@xml.apache.org by ma...@apache.org on 2004/01/31 20:28:32 UTC

cvs commit: xml-axkit/t/provider 01post.t

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 (!@styles) {
  -        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 \@styles;
   }
   
  +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