从CGI.pm获取自定义代码

时间:2011-08-26 17:17:41

标签: linux perl ubuntu-10.04

我们有一个用Perl编写的自定义网站,它使用稍微修改过的CGI.pm版本。在服务器更新期间,CGI.pm可能会在更新时被覆盖。我的目标是能够在不影响网站的情况下更新服务器 - 即更改依赖于修改后的CGI.pm的代码。不幸的是,我不熟悉Perl语法或最佳实践。

以下是修改过的CGI.pmn的差异(行号与最新版本的CGI.pm不同):

--- CGI.pm.orig Tue Nov  7 12:14:09 2006
+++ CGI.pm      Tue Nov  7 12:13:29 2006
@@ -3386,7 +3386,7 @@ sub read_multipart {
               if (defined $self->{'.upload_hook'})
                {
                   $totalbytes += length($data);
-                   &{$self->{'.upload_hook'}}($filename ,$data, $totalbytes, $self->{'.upload_data'});
+                   &{$self->{'.upload_hook'}}($filename ,$data, $totalbytes, $self->{'.upload_data'}, $param, $header{'Content-Type'});
               }
               print $filehandle $data if ($self->{'use_tempfile'});
           }

依赖于此差异的代码如下:

my %file_hash = ();
my $page = new CGI(\&file_reader, \%file_hash, 0);

my $session = &get_session($page);


foreach my $param_name (keys %file_hash) {
        my $notes_param = $param_name . "_notes";
        &store_file($file_hash{$param_name}, $page->param($notes_param),
                    &get_session_name($session));
}

如果没有diff,则在存储文件时,$ param_name变量似乎为空。

处理此问题的最佳方法是什么?正如我之前所说,我的主要目标是简化服务器的更新;是否有某种方法

a)(最好)获取%file_hash以便在没有修改版本的CGI.pm的情况下正常工作 b)阻止更新CGI.pm(这是一个坏主意)

2 个答案:

答案 0 :(得分:6)

您是否尝试过将其提交给CGI RT作为理想的改进?将$param\%header(而不是$header{'Content-Type'})传递给回调似乎是合理的。

要回答您的问题,您可以在本地目录中安装CGI。首先搜索PERL5LIB env var中的目录,这样就可以找到你的CGI版本而不是Ubuntu安装的版本。

答案 1 :(得分:0)

我是CGI.pm维护者。我认为有一个比使用CGI.pm的本地副本更好的选择。相反,创建一个子类,并在您的应用程序中使用我的子类。它看起来像这样:

package My::CGI;
use parent 'CGI';

sub my_sub_that_modified {
  ...
}

1;

因此,您只需要复制您修改过的子程序。然后,当您升级CGI.pm时,您可能不需要触摸您的应用程序,除非您修改的子例程发生更改。

使用“本地lib”选项,您仍然需要手动将安全更新和您可能想要的其他更改合并到本地副本中。子类路线最小化了这一点。

这种方法的一个例子是Bugzilla::CGI,它在子类中进行了一些更改。