AP_DECLARE(int) ap_scan_script_header_err_brigade(request_rec *r, apr_bucket_brigade *bb, char *buffer) { return ap_scan_script_header_err_core(r, buffer, getsfunc_BRIGADE, bb); }
AP_DECLARE(int) ap_scan_script_header_err(request_rec *r, apr_file_t *f, char *buffer) { return ap_scan_script_header_err_core(r, buffer, getsfunc_FILE, f); }
API_EXPORT(int) ap_scan_script_header_err_buff(request_rec *r, BUFF *fb, char *buffer) { return ap_scan_script_header_err_core(r, buffer, getsfunc_BUFF, fb); }
/* The normal CGI module passes the returned data through * ap_scan_script_header(). We can't do that directly, since we don't * have a constant stream of data, so we buffer the header into our own * structure, and call ap_scan_script_header_err_core() with our own * getline() function to walk the header buffer we have. We could * probably get some speed improvement by keeping the header buffer * between runs, instead of growing it every time... for later. Also, * we currently don't use the pool allocation routines here, so we have * to be very careful not to leak. We could probably at least use the * ap_register_cleanup() function to make sure we clean up our mess... */ static int wrap_write (void *data, const char *buf, size_t len) { WRAPPER_DATA *wrap = (WRAPPER_DATA *)data; int wl; int ret; #if ECS_DEBUG>1 fprintf (stderr, "wrap_write (%s, %d)\n", buf, len); #endif if (!wrap->end_of_header) { wl = header_write (&(wrap->hbuf), buf, len); if (wl == 0) { return len; } wrap->end_of_header = 1; wrap->hbuf.loc = 0; #if ECS_DEBUG>1 fprintf (stderr, "ap_scan_script_header_err_core\n%s\n", wrap->hbuf.buf); #endif wrap->returns = ap_scan_script_header_err_core(wrap->r, NULL, h_getline, (void *)&(wrap->hbuf)); #if ECS_DEBUG>1 fprintf (stderr, "ap_scan_script_header_err_core.. done\n"); #endif if (len >= wl) { len = len - wl; buf = buf + wl; } if (wrap->returns == OK) { const char* location = ap_table_get (wrap->r->headers_out, "Location"); if (location && location[0] == '/' && wrap->r->status == 200) { wrap->returns = INTERNAL_REDIRECT; } else if (location && wrap->r->status == 200) { /* XX Note that if a script wants to produce its own Redirect * body, it now has to explicitly *say* "Status: 302" */ wrap->returns = REDIRECT; } else { #ifdef ECS_DEBUG fprintf (stderr, "ap_send_http_header\n"); #endif ap_send_http_header(wrap->r); #ifdef ECS_DEBUG fprintf (stderr, "ap_send_http_header.. done\n"); #endif } } } /* if header didn't return OK, ignore the rest */ if ((wrap->returns != OK) || wrap->r->header_only) { return len; } #if ECS_DEBUG>1 fprintf (stderr, "ap_rwrite(%s,%d)\n", buf, len); #endif ret = ap_rwrite (buf, len, wrap->r); #if ECS_DEBUG>1 fprintf (stderr, "ap_rwrite.. done\n"); #endif return ret; }
API_EXPORT(int) ap_scan_script_header_err(request_rec *r, FILE *f, char *buffer) { return ap_scan_script_header_err_core(r, buffer, getsfunc_FILE, f); }