in buckets/fcgi_buckets.c [163:210]
static apr_status_t serf_fcgi_unframe_read(serf_bucket_t *bucket,
apr_size_t requested,
const char **data,
apr_size_t *len)
{
fcgi_unframe_ctx_t *ctx = bucket->data;
apr_status_t status;
status = serf__bucket_fcgi_unframe_read_info(bucket, NULL, NULL);
if (status)
{
*len = 0;
return (status == SERF_ERROR_EMPTY_READ) ? APR_SUCCESS : status;
}
if (requested > ctx->payload_remaining)
requested = ctx->payload_remaining;
if (requested == ctx->payload_remaining && ctx->pad_remaining)
requested += ctx->pad_remaining;
status = serf_bucket_read(ctx->stream, requested, data, len);
if (!SERF_BUCKET_READ_ERROR(status)) {
if (*len >= ctx->payload_remaining) {
ctx->pad_remaining -= (*len - ctx->payload_remaining);
*len = ctx->payload_remaining;
ctx->payload_remaining = 0;
}
else {
ctx->payload_remaining -= *len;
}
if (!ctx->payload_remaining && !ctx->pad_remaining) {
if (ctx->end_of_frame) {
status = (*ctx->end_of_frame)(ctx->end_of_frame_baton,
bucket);
ctx->end_of_frame = NULL;
}
if (!SERF_BUCKET_READ_ERROR(status))
status = APR_EOF;
}
else if (APR_STATUS_IS_EOF(status))
status = SERF_ERROR_TRUNCATED_STREAM;
}
return status;
}