dougm 01/05/08 14:08:55
Modified: lib/ModPerl Code.pm
src/modules/perl mod_perl.c modperl_config.c
modperl_filter.c modperl_types.h
t/modules cgi.t
t/response/TestModules cgi.pm
xs/Apache/Response Apache__Response.h
Added: t/apache scanhdrs.t
t/response/TestApache scanhdrs.pm
Log:
implement "PerlOptions +ParseHeaders" and add tests
Revision Changes Path
1.65 +1 -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.64
retrieving revision 1.65
diff -u -r1.64 -r1.65
--- Code.pm 2001/05/08 18:55:34 1.64
+++ Code.pm 2001/05/08 21:08:18 1.65
@@ -93,7 +93,7 @@
my %flags = (
Srv => ['NONE', @ithread_opts, qw(ENABLED AUTOLOAD MERGE_HANDLERS),
@hook_flags, 'UNSET'],
- Dir => [qw(NONE SEND_HEADER SETUP_ENV MERGE_HANDLERS GLOBAL_REQUEST UNSET)],
+ Dir => [qw(NONE PARSE_HEADERS SETUP_ENV MERGE_HANDLERS GLOBAL_REQUEST UNSET)],
Req => [qw(NONE SET_GLOBAL_REQUEST)],
Interp => [qw(NONE IN_USE PUTBACK CLONED BASE)],
Handler => [qw(NONE PARSED METHOD OBJECT ANON AUTOLOAD DYNAMIC)],
1.56 +6 -0 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.55
retrieving revision 1.56
diff -u -r1.55 -r1.56
--- mod_perl.c 2001/05/08 04:25:49 1.55
+++ mod_perl.c 2001/05/08 21:08:24 1.56
@@ -390,6 +390,8 @@
int modperl_response_handler_cgi(request_rec *r)
{
+ MP_dDCFG;
+ MP_dRCFG;
GV *h_stdin, *h_stdout;
int retval;
#ifdef USE_ITHREADS
@@ -405,6 +407,10 @@
interp = modperl_interp_select(r, r->connection, r->server);
aTHX = interp->perl;
#endif
+
+ if (MpDirPARSE_HEADERS(dcfg)) {
+ rcfg->wbucket.header_parse = 1;
+ }
h_stdout = modperl_io_tie_stdout(aTHX_ r);
h_stdin = modperl_io_tie_stdin(aTHX_ r);
1.32 +2 -0 modperl-2.0/src/modules/perl/modperl_config.c
Index: modperl_config.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- modperl_config.c 2001/04/06 02:18:15 1.31
+++ modperl_config.c 2001/05/08 21:08:26 1.32
@@ -55,6 +55,8 @@
modperl_config_req_t *rcfg =
(modperl_config_req_t *)apr_pcalloc(r->pool, sizeof(*rcfg));
+ rcfg->wbucket.r = r;
+
MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)rcfg);
return rcfg;
1.20 +26 -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.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- modperl_filter.c 2001/05/07 02:05:00 1.19
+++ modperl_filter.c 2001/05/08 21:08:27 1.20
@@ -5,9 +5,33 @@
MP_INLINE apr_status_t modperl_wbucket_pass(modperl_wbucket_t *wb,
const char *buf, apr_ssize_t len)
{
- apr_bucket_brigade *bb = apr_brigade_create(wb->pool);
- apr_bucket *bucket = apr_bucket_transient_create(buf, len);
+ apr_bucket_brigade *bb;
+ apr_bucket *bucket;
+
+ if (wb->header_parse) {
+ request_rec *r = wb->r;
+ const char *bodytext = NULL;
+ int status = modperl_cgi_header_parse(r, (char *)buf, &bodytext);
+
+ if (status != OK) {
+ ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO,
+ 0, r->server, "%s did not send an HTTP header",
+ r->uri);
+ }
+ else if (!bodytext) {
+ return APR_SUCCESS;
+ }
+
+ if (bodytext) {
+ len -= (bodytext - buf);
+ buf = bodytext;
+ }
+ }
+
+ bb = apr_brigade_create(wb->pool);
+ bucket = apr_bucket_transient_create(buf, len);
APR_BRIGADE_INSERT_TAIL(bb, bucket);
+
return ap_pass_brigade(wb->filters, bb);
}
1.40 +2 -0 modperl-2.0/src/modules/perl/modperl_types.h
Index: modperl_types.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_types.h,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- modperl_types.h 2001/04/30 04:38:35 1.39
+++ modperl_types.h 2001/05/08 21:08:30 1.40
@@ -169,6 +169,8 @@
char outbuf[MP_IOBUFSIZE];
apr_pool_t *pool;
ap_filter_t *filters;
+ int header_parse;
+ request_rec *r;
} modperl_wbucket_t;
typedef enum {
1.1 modperl-2.0/t/apache/scanhdrs.t
Index: scanhdrs.t
===================================================================
use strict;
use warnings FATAL => 'all';
use Apache::Test;
use Apache::TestRequest;
plan tests => 4, \&have_lwp;
my $module = 'TestApache::scanhdrs';
my $location = "/$module";
my $res = GET $location;
ok $res->content eq "1..1\nok 1\n";
ok $res->header('Content-type') eq 'text/test-output';
ok $res->header('X-Perl-Module') eq $module;
ok $res->message =~ /beer/;
1.3 +11 -3 modperl-2.0/t/modules/cgi.t
Index: cgi.t
===================================================================
RCS file: /home/cvs/modperl-2.0/t/modules/cgi.t,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- cgi.t 2001/05/08 05:08:52 1.2
+++ cgi.t 2001/05/08 21:08:42 1.3
@@ -4,13 +4,15 @@
use Apache::Test;
use Apache::TestRequest;
-plan tests => 4, \&have_lwp;
+plan tests => 6, \&have_lwp;
-my $location = "/TestModules::cgi";
+my $module = 'TestModules::cgi';
+my $location = "/$module";
ok 1;
-my $str = GET_BODY "$location?PARAM=2";
+my $res = GET "$location?PARAM=2";
+my $str = $res->content;
print $str;
$str = POST_BODY $location, content => 'PARAM=%33';
@@ -18,3 +20,9 @@
$str = UPLOAD_BODY $location, content => 4;
print $str;
+
+$Test::ntest += 3;
+
+ok $res->header('Content-type') =~ m:^text/test-output:;
+
+ok $res->header('X-Perl-Module') eq $module;
1.1 modperl-2.0/t/response/TestApache/scanhdrs.pm
Index: scanhdrs.pm
===================================================================
package TestApache::scanhdrs;
use strict;
use warnings FATAL => 'all';
use Apache::compat ();
use Apache::Test;
sub handler {
my $r = shift;
print "Status: 200 Bottles of beer on the wall\n";
print 'X-Perl-Module', ': ', __PACKAGE__;
print "\r\n";
print "Content-type: text/test-";
print "output\n";
print "\n";
plan $r, tests => 1;
print "ok 1\n";
Apache::OK;
}
1;
__END__
SetHandler perl-script
PerlOptions +ParseHeaders
1.4 +2 -2 modperl-2.0/t/response/TestModules/cgi.pm
Index: cgi.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/response/TestModules/cgi.pm,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- cgi.pm 2001/05/08 20:15:54 1.3
+++ cgi.pm 2001/05/08 21:08:49 1.4
@@ -14,8 +14,8 @@
my $param = $cgi->param('PARAM');
my $httpupload = $cgi->param('HTTPUPLOAD');
- print $cgi->header('-type' => 'text/plain',
- '-X-Perl-Script' => 'cgi.pm');
+ print $cgi->header('-type' => 'text/test-output',
+ '-X-Perl-Module' => __PACKAGE__);
print "ok $param\n" if $param;
1.3 +2 -0 modperl-2.0/xs/Apache/Response/Apache__Response.h
Index: Apache__Response.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/Apache/Response/Apache__Response.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Apache__Response.h 2001/05/08 20:15:13 1.2
+++ Apache__Response.h 2001/05/08 21:08:53 1.3
@@ -6,7 +6,9 @@
*/
#define mpxs_Apache__RequestRec_send_cgi_header(r, sv) \
{ \
+ MP_dRCFG; \
STRLEN len; \
const char *bodytext; \
modperl_cgi_header_parse(r, SvPV(sv,len), &bodytext); \
+ rcfg->wbucket.header_parse = 0; \
}