Получение собственного кода из CGI.pm - PullRequest
1 голос
/ 26 августа 2011

У нас есть собственный сайт, написанный на 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 б) предотвратить обновление CGI.pm (и это плохая идея)

Ответы [ 2 ]

6 голосов
/ 26 августа 2011

Вы пытались отправить это в CGI RT как желаемое улучшение?Представляется разумным передать $param и \%header (вместо $header{'Content-Type'}) обратному вызову.

Чтобы ответить на ваш вопрос, вы можете установить CGI в локальном каталоге.Каталоги в PERL5LIB env var ищутся первыми, поэтому будет найдена ваша версия CGI вместо той, которая установлена ​​Ubuntu.

0 голосов
/ 19 апреля 2012

Я сопровождающий CGI.pm. Я думаю, что есть лучший вариант, чем использовать локальную копию CGI.pm. Вместо этого создайте подкласс и используйте мой подкласс в своем приложении. Это будет выглядеть так:

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

sub my_sub_that_modified {
  ...
}

1;

Итак, вам просто нужно скопировать в подпрограмму, которую вы изменили. Затем, когда вы обновляете CGI.pm, вам, скорее всего, не нужно трогать ваше приложение, если только ваша измененная подпрограмма не изменится.

С опцией «local lib» вам все равно придется вручную объединять обновления безопасности и другие изменения, которые вы, возможно, захотите внести в локальную копию. Маршрут подкласса минимизирует это.

Примером такого подхода является Bugzilla :: CGI , который вносит несколько изменений в свой подкласс.

...