Re: [MP2] : REDIRECT_ERROR_NOTES not set on errordocument redirect

[prev] [thread] [next] [Date index for 2005/05/22]

From: Mark
Subject: Re: [MP2] : REDIRECT_ERROR_NOTES not set on errordocument redirect
Date: 17:46 on 22 May 2005
Stas Bekman wrote:
> Mark wrote:
> 
>> Stas Bekman wrote:
>>
>>> Mark wrote:
>>>
>>>> -------------8<---------- Start Bug Report ------------8<----------
>>>> 1. Problem Description:
>>>>
>>>> $ENV{REDIRECT_ERROR_NOTES} not working with MP2
>>>>
>>>> Using latest everything (modperl 2 RC5).
>>>>
>>>>
>>>> To illustrate, I simply configure Apache with an errordocument:
>>>>
>>>>    ErrorDocument 500 /cgi/printenv
>>>>
>>>> I have a perl-scripts configured like this:
>>>>
>>>>   <Directory "/usr/local/apache2/perl">
>>>>     Options ExecCGI
>>>>     SetHandler perl-script
>>>>     PerlResponseHandler ModPerl::Registry
>>>>     PerlOptions +ParseHeaders
>>>>   </Directory>
>>>>
>>>> And a script the generates an error:
>>>>
>>>>   #/usr/bin/perl
>>>>   barf();
>>>>
>>>>
>>>> The errordocument 'printenv' output shows REDIRECT_ERROR_NOTES empty.
>>>>
>>>> When the identical barf script is run under CGI (script-alias), 
>>>> REDIRECT_ERROR_NOTES
>>>> has an error message.
>>>>
>>>>
>>>> I fooled around with more complex examples, accessing ARP table 
>>>> 'error-notes' and
>>>> that is also empty.
>>>
>>>
>>>
>>>
>>> because you are in the sub request. the value is set in $r->main 
>>> 'error-notes' table. I wonder why the sub-request doesn't see it.
>>>
>>> Also I wonder if we should adjust in ModPerl::RegistryCooker:
>>>
>>>  sub log_error {
>>>      my($self, $msg) = @_;
>>>      my $class = ref $self;
>>>
>>> -    $self->{REQ}->log_error($msg);
>>> -    $self->{REQ}->notes->set('error-notes' => $msg);
>>> +    $self->{REQ}->log_rerror($msg);
>>>      $@{$self->{URI}} = $msg;
>>>  }
>>>
>>> which is supposed to do that same in one call. Any difference with 
>>> the above change?
>>
>>
>>
>> OK, I installed RC6 (no change with that) and poked around a little more.
>>
>> $r->prev->notes->get('error-notes') is definitely empty in the 
>> errordocument
>> handler, despite being set in ModPerl::RegistryCooker as shown above.
>>
>> However, as a test, I changed 'error-notes' to 'error-notice' in
>> RegistryCooker::log_error, and voila $r->prev->notes->get('error-notice')
>> does contain the proper error message.
>>
>> This suggests 'error-notes' is being wiped out (re-initialized?) 
>> somewhere
>> after RegistryCooker.  Someone with more knowledge than I can probably
>> guess where this might be happening?
> 
> 
> Could it possibly come from here?
> 
> src/modules/perl/modperl_callback.c
> 
>     if (status == HTTP_INTERNAL_SERVER_ERROR) {
>         if (r && r->notes) {
>             apr_table_set(r->notes, "error-notes", SvPV_nolen(ERRSV));
>         }
>     }
> 
> And we should check whether error-notes is already set and append the 
> error instead?

Yes, this appears to be the culprit.  Based on my glance at apr_tables.h,
I concluded this was the right thing to do, and it works:

- apr_table_set(r->notes, "error-notes", SvPV_nolen(ERRSV));
+ apr_table_mergen(r->notes, "error-notes", SvPV_nolen(ERRSV));

(I did this on 2.0.0 release)

Thanks.

Mark

Re: [MP2] : REDIRECT_ERROR_NOTES not set on errordocument redirect
Mark 17:46 on 22 May 2005

Generated at 15:53 on 25 May 2005 by mariachi v0.52