stas 2003/03/08 01:15:16
Modified: lib/Apache compat.pm lib/ModPerl Code.pm src/modules/perl mod_perl.c modperl_filter.c xs/Apache/RequestRec Apache__RequestRec.h . Changes Log: When PerlOptions +ParseHeaders is an effect, the CGI headers parsing won't be done if any *mod_perl* handler, from the header_parser phase and upto and including the response phase, sets $r->content_type. (similar behavior to mp1's send_http_header() Revision Changes Path 1.83 +7 -1 modperl-2.0/lib/Apache/compat.pm Index: compat.pm =================================================================== RCS file: /home/cvs/modperl-2.0/lib/Apache/compat.pm,v retrieving revision 1.82 retrieving revision 1.83 diff -u -r1.82 -r1.83 --- compat.pm 4 Mar 2003 00:56:26 -0000 1.82 +++ compat.pm 8 Mar 2003 09:15:16 -0000 1.83 @@ -171,7 +171,13 @@ sub send_http_header { my ($r, $type) = @_; - $r->content_type($type) if defined $type; + + # since send_http_header() in mp1 was telling mod_perl not to + # parse headers and in mp2 one must call $r->content_type($type) to + # perform the same, we make sure that this happens + $type = $r->content_type || 'text/html' unless defined $type; + + $r->content_type($type); } #to support $r->server_root_relative 1.94 +2 -1 modperl-2.0/lib/ModPerl/Code.pm Index: Code.pm =================================================================== RCS file: /home/cvs/modperl-2.0/lib/ModPerl/Code.pm,v retrieving revision 1.93 retrieving revision 1.94 diff -u -r1.93 -r1.94 --- Code.pm 1 Mar 2003 00:53:20 -0000 1.93 +++ Code.pm 8 Mar 2003 09:15:16 -0000 1.94 @@ -105,7 +105,8 @@ Srv => ['NONE', @ithread_opts, qw(ENABLE AUTOLOAD MERGE_HANDLERS), @hook_flags, 'UNSET'], Dir => [qw(NONE PARSE_HEADERS SETUP_ENV MERGE_HANDLERS GLOBAL_REQUEST UNSET)], - Req => [qw(NONE SET_GLOBAL_REQUEST SETUP_ENV CLEANUP_REGISTERED)], + Req => [qw(NONE SET_GLOBAL_REQUEST PARSE_HEADERS SETUP_ENV + CLEANUP_REGISTERED)], Interp => [qw(NONE IN_USE PUTBACK CLONED BASE)], Handler => [qw(NONE PARSED METHOD OBJECT ANON AUTOLOAD DYNAMIC)], ); 1.155 +11 -2 modperl-2.0/src/modules/perl/mod_perl.c Index: mod_perl.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.c,v retrieving revision 1.154 retrieving revision 1.155 diff -u -r1.154 -r1.155 --- mod_perl.c 3 Mar 2003 03:39:06 -0000 1.154 +++ mod_perl.c 8 Mar 2003 09:15:16 -0000 1.155 @@ -550,6 +550,16 @@ static int modperl_hook_header_parser(request_rec *r) { + MP_dDCFG; + + /* set the default for cgi header parsing On (if applicable) as + * early as possible so $r->content_type in any phase after + * header_parser could turn it off */ + if (MpDirPARSE_HEADERS(dcfg)) { + MP_dRCFG; + MpReqPARSE_HEADERS_On(rcfg); + } + /* if 'PerlOptions +GlobalRequest' is inside a container */ modperl_global_request_cfg_set(r); @@ -718,7 +728,6 @@ void modperl_response_init(request_rec *r) { MP_dRCFG; - MP_dDCFG; modperl_wbucket_t *wb; if (!rcfg->wbucket) { @@ -733,7 +742,7 @@ wb->pool = r->pool; wb->filters = &r->output_filters; wb->outcnt = 0; - wb->header_parse = MpDirPARSE_HEADERS(dcfg) ? 1 : 0; + wb->header_parse = MpReqPARSE_HEADERS(rcfg) ? 1 : 0; wb->r = r; } 1.55 +2 -2 modperl-2.0/src/modules/perl/modperl_filter.c Index: modperl_filter.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v retrieving revision 1.54 retrieving revision 1.55 diff -u -r1.54 -r1.55 --- modperl_filter.c 3 Mar 2003 03:39:06 -0000 1.54 +++ modperl_filter.c 8 Mar 2003 09:15:16 -0000 1.55 @@ -54,8 +54,8 @@ apr_bucket_brigade *bb; apr_bucket *bucket; const char *work_buf = buf; - - if (wb->header_parse && !wb->r->content_type) { + + if (wb->header_parse) { request_rec *r = wb->r; const char *bodytext = NULL; int status; 1.5 +14 -0 modperl-2.0/xs/Apache/RequestRec/Apache__RequestRec.h Index: Apache__RequestRec.h =================================================================== RCS file: /home/cvs/modperl-2.0/xs/Apache/RequestRec/Apache__RequestRec.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- Apache__RequestRec.h 21 May 2002 02:50:16 -0000 1.4 +++ Apache__RequestRec.h 8 Mar 2003 09:15:16 -0000 1.5 @@ -5,9 +5,23 @@ const char *retval = r->content_type; if (type) { + MP_dRCFG; STRLEN len; const char *val = SvPV(type, len); ap_set_content_type(r, apr_pmemdup(r->pool, val, len+1)); + + /* turn off cgi header parsing, similar to what + * send_http_header did in mp1 */ + MpReqPARSE_HEADERS_Off(rcfg); + if (rcfg->wbucket) { + /* in case we are already inside + * modperl_callback_per_dir(MP_RESPONSE_HANDLER, r); + * but haven't sent any data yet, it's too late to change + * MpReqPARSE_HEADERS, so change the wbucket's private + * flag directly + */ + rcfg->wbucket->header_parse = 0; + } } return retval; 1.145 +5 -0 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.144 retrieving revision 1.145 diff -u -r1.144 -r1.145 --- Changes 8 Mar 2003 03:58:59 -0000 1.144 +++ Changes 8 Mar 2003 09:15:16 -0000 1.145 @@ -10,6 +10,11 @@ =item 1.99_09-dev +When PerlOptions +ParseHeaders is an effect, the CGI headers parsing +won't be done if any *mod_perl* handler, from the header_parser phase +and upto and including the response phase, sets $r->content_type. +(similar behavior to mp1's send_http_header() [Stas] + Registry: make sure that $r is not in the scope when the script is compiled [Stas]