in modules/fcgid/fcgid_bridge.c [213:288]
static int getsfunc_fcgid_BRIGADE(char *buf, int len, void *arg)
{
apr_bucket_brigade *bb = (apr_bucket_brigade *) arg;
const char *dst_end = buf + len - 1; /* leave room for terminating null */
char *dst = buf;
apr_bucket *e = APR_BRIGADE_FIRST(bb);
apr_status_t rv;
int done = 0;
int getLF = 0;
int getColon = 0;
while ((dst < dst_end) && !done && e != APR_BRIGADE_SENTINEL(bb)) {
const char *bucket_data;
apr_size_t bucket_data_len;
const char *src;
const char *src_end;
apr_bucket *next;
rv = apr_bucket_read(e, &bucket_data, &bucket_data_len,
APR_BLOCK_READ);
if (rv != APR_SUCCESS) {
return 0;
}
/* Move on to next bucket if it's fastcgi header bucket */
if (e->type == &ap_bucket_type_fcgid_header
|| e->type == &apr_bucket_type_immortal) {
next = APR_BUCKET_NEXT(e);
apr_bucket_delete(e);
e = next;
if (getLF) {
done = 1;
}
continue;
}
if (bucket_data_len == 0)
return 0;
/* Base on RFC2616 section 4.2 */
src = bucket_data;
src_end = bucket_data + bucket_data_len;
while ((src < src_end) && (dst < dst_end) && !done) {
if (*src == ':')
getColon = 1;
if (getLF && ((*src != ' ' && *src != '\t') || !getColon)) {
done = 1;
getColon = 0;
break;
}
else if (getLF && (*src == ' ' || *src == '\t')) {
*dst++ = '\r';
*dst++ = '\n';
getLF = 0;
}
if (*src == '\n') {
getLF = 1;
}
else if (*src != '\r') {
*dst++ = *src;
}
src++;
}
if (src < src_end) {
apr_bucket_split(e, src - bucket_data);
}
next = APR_BUCKET_NEXT(e);
apr_bucket_delete(e);
e = next;
}
*dst = 0;
return done;
}