stas 2003/08/20 16:10:09
Modified: src/modules/perl modperl_filter.c
Log:
- more tracing to help io debugging
- prevent segfaults when tracing, need to check whether the filter is a
mod_perl one, before trying to retrieve the perl callback function name
Revision Changes Path
1.66 +29 -18 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.65
retrieving revision 1.66
diff -u -r1.65 -r1.66
--- modperl_filter.c 11 Aug 2003 20:34:22 -0000 1.65
+++ modperl_filter.c 20 Aug 2003 23:10:09 -0000 1.66
@@ -5,11 +5,15 @@
#define MP_FILTER_NAME_FORMAT " %s\n\n\t"
#define MP_FILTER_NAME(f) \
- ((modperl_filter_ctx_t *)f->ctx)->handler->name
+ (is_modperl_filter(f) \
+ ? ((modperl_filter_ctx_t *)(f)->ctx)->handler->name \
+ : (f)->frec->name)
#define MP_FILTER_TYPE(filter) \
- ((modperl_filter_ctx_t *)filter->f->ctx)->handler->attrs & \
- MP_FILTER_CONNECTION_HANDLER ? "connection" : "request"
+ (is_modperl_filter(filter->f) \
+ ? ((modperl_filter_ctx_t *)(filter)->f->ctx)->handler->attrs & \
+ MP_FILTER_CONNECTION_HANDLER ? "connection" : "request" \
+ : "unknown")
#define MP_FILTER_MODE(filter) \
(filter->mode == MP_INPUT_FILTER_MODE ? "input" : "output")
@@ -17,7 +21,7 @@
#define MP_FILTER_POOL(f) f->r ? f->r->pool : f->c->pool
/* this function is for tracing only, it's not optimized for performance */
-static const char* next_filter_name(ap_filter_t *f)
+static int is_modperl_filter(ap_filter_t *f)
{
const char *name = f->frec->name;
@@ -26,13 +30,14 @@
!strcasecmp(name, MP_FILTER_CONNECTION_OUTPUT_NAME) ||
!strcasecmp(name, MP_FILTER_REQUEST_INPUT_NAME) ||
!strcasecmp(name, MP_FILTER_REQUEST_OUTPUT_NAME) ) {
- return ((modperl_filter_ctx_t *)f->ctx)->handler->name;
+ return 1;
}
else {
- return name;
+ return 0;
}
}
+
MP_INLINE static apr_status_t send_input_eos(modperl_filter_t *filter)
{
apr_bucket_alloc_t *ba = filter->f->c->bucket_alloc;
@@ -110,6 +115,10 @@
work_buf = (char *)apr_pcalloc(wb->pool, sizeof(char*)*len);
memcpy((void*)work_buf, buf, len);
}
+
+ MP_TRACE_f(MP_FUNC, "\n\n\tparsing headers: %d bytes [%s]\n", len,
+ apr_pstrmemdup(wb->pool, work_buf, len));
+
status = modperl_cgi_header_parse(r, (char *)work_buf, &bodytext);
wb->header_parse = 0; /* only once per-request */
@@ -147,18 +156,21 @@
MP_TRACE_f(MP_FUNC, "\n\n\twrite out: %d bytes\n"
"\t\tfrom %s\n\t\tto %s filter handler\n",
len,
- (wb->r && wb->filters == &wb->r->output_filters)
- ? "response handler" : "current filter handler",
- next_filter_name(*(wb->filters)));
+ ((wb->r && wb->filters == &wb->r->output_filters)
+ ? "response handler" : "current filter handler"),
+ MP_FILTER_NAME(*(wb->filters)));
return ap_pass_brigade(*(wb->filters), bb);
}
-/* if add_flush_bucket is TRUE
- * and there is data to flush,
- * a flush bucket is added to the tail of bb with data
- * otherwise
- * a flush bucket is sent in its own bb
+/* flush data if any,
+ * if add_flush_bucket is TRUE
+ * if there is data to flush
+ * a flush bucket is added to the tail of bb with data
+ * else
+ * a flush bucket is sent in its own bb
+ * else
+ * nothing is sent
*/
MP_INLINE apr_status_t modperl_wbucket_flush(modperl_wbucket_t *wb,
int add_flush_bucket)
@@ -173,7 +185,7 @@
else if (add_flush_bucket) {
rv = send_output_flush(*(wb->filters));
}
-
+
return rv;
}
@@ -184,8 +196,6 @@
apr_size_t len = *wlen;
*wlen = 0;
- MP_TRACE_f(MP_FUNC, "\n\n\tbuffer out: %d bytes\n", len);
-
if ((len + wb->outcnt) > sizeof(wb->outbuf)) {
apr_status_t rv;
if ((rv = modperl_wbucket_flush(wb, FALSE)) != APR_SUCCESS) {
@@ -239,7 +249,8 @@
MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
"new: %s %s filter (0x%lx)\n",
MP_FILTER_NAME(f),
- MP_FILTER_TYPE(filter), MP_FILTER_MODE(filter),
+ MP_FILTER_TYPE(filter),
+ MP_FILTER_MODE(filter),
(unsigned long)filter);
return filter;