Zimtobi has asked for the wisdom of the Perl Monks concerning the following question:

Hello all! I just registered here because I don't find any solution to my PERL problem.

So I want to strip certain tags from HTML in my PERL based Content Management System called Imperia.

I installed HTML::Restrict on the server. It works just fine in a little PERL test program I wrote:

#! /usr/local/bin/perl use strict; use HTML::Restrict; my $value = qq|<html> <head> <title>Dies ist der Titel</title> </head> <body> <p>Hier kommt der Inhalt</p> </body> </html> |; my $hr = HTML::Restrict->new(); my $value = $hr->process($value); print "Ergebnis: ".$value."\n\n";

So now I want to use the module in my CMS. There is an interface called "transform". So I wrote this transform plugin:

#! /bin/false # $Id: Null.pm,v 1.7.2.2 2009/03/26 11:15:04 guido Exp $ # vim: set autoindent shiftwidth=4 tabstop=8: # Imperia AG is the sole owner and producer of its software "Imperia". + For # our software license and copyright information please refer to: Lice +nse.txt # Copyright (C) 1995-2012 Imperia AG. All rights reserved. package Dynamic::Transform::zim_iwe_filtern; use strict; use warnings; use HTML::Restrict; use Carp; sub new { my ($proto, $config) = @_; my $class = ref($proto) || $proto; bless {}, $class; } sub transform { my ($self, $metainfo) = @_; ## fetch all variable names my @keylist = sort $metainfo->keys(); my $count = 0; foreach my $key (@keylist) { ## only change certian variables next unless ( $key =~ m/^eingabe_/ or $key =~ m/^ff_confirm_/ or $key =~ m/^ff_successful_/ or $key =~ m/^map_point/ or $key =~ m/^map_text_/ or $key =~ m/^map_transcript_/ or $key =~ m/^tube_text_/ ); ## test value my $value = qq|<html> <head> <title>Dies ist der Titel</title> </head> <body> <p>Hier kommt der Inhalt</p> </body> </html> |; my $hr = HTML::Restrict->new() or die "Error at HTML::Restrict->ne +w: $!"; $value = $hr->process($value) or die "Error at process: $!"; $metainfo->setValues($key."_DEBUG", $value); } } 1;

But in this environment the command $value = $hr->process($value) won't work. The result on the web interface of the cms is as follows: "Error at process: at /cms/ews-2000/site/modules/core/Dynamic/Transform/zim_iwe_filtern.pm line 55, <DEFAULTDATEI> line 102."

This means that something goes wrong but the error variable $! isn't filled. The httpd error log shows no error either.

I suspect that the module isn't fit to be used inside a package or I just invoke it wrong.

Can anyone help me?

Kind regards,
Tobias from Germany

Replies are listed 'Best First'.
Re: HTML::Restrict works on the command line, but not the web server
by Corion (Patriarch) on Apr 26, 2016 at 11:53 UTC

    Note that one cause for the error might be your addition of ... or die "Error at process: $!". You don't do this in your test script that works from the command line.

    To get a better description of the error (if there is an error raised), I would wrap the offending line in an eval {} block:

    my $ok = eval { $value = $hr->process($value); 1; }; if( ! $ok ) { die $@; # reraise our error };

    If that still leaves an empty value in $value, then maybe the problem is in HTML::Restrict. Maybe you need to pass it some rules as to what is allowed.

      Thanks for the immediate ansswer!

      I have changed the program like you suggested, but now no error shows up and the $value always comes out empty.

      If no rules are passed, all the HTML is filtered in my test script.

        Then maybe something is wrong with either how HTML::Restrict works or with how you inspect the results.

        Have you made sure that Perl loads the correct versions of HTML::Restrict in both cases?

        print $INC{'HTML/Restrict.pm'}; print HTML::Restrict->VERSION;

        Are you certain that your loop even gets entered? You loop over various (submitted form) values, but maybe they are not even there? Maybe retest with a more minimal test package:

        package Dynamic::Transform::zim_iwe_filtern; use strict; use warnings; use HTML::Restrict; use Carp; sub new { my ($proto, $config) = @_; my $class = ref($proto) || $proto; bless {}, $class; } sub transform { my ($self, $metainfo) = @_; ## test value my $value = qq|<html> <head> <title>Dies ist der Titel</title> </head> <body> <p>Hier kommt der Inhalt</p> </body> </html> |; my $hr = HTML::Restrict->new() or die "Error at HTML::Restrict->ne +w: $!"; $value = $hr->process($value) or die "Error at process: $!"; #$metainfo->setValues($key."_DEBUG", $value); warn "Have [$value] after HTML::Restrict"; } 1;

        Also, how certain are you that your CMS actually has reloaded the modified version of your code? The safest way is to restart the HTTP server, but also consider having a version number in your package that you output into a log file to make certain that the code you're looking at is also the code you are running.