in buckets/event_buckets.c [104:153]
static apr_status_t serf_event_read_iovec(serf_bucket_t *bucket,
apr_size_t requested,
int vecs_size,
struct iovec *vecs,
int *vecs_used)
{
event_context_t *ctx = bucket->data;
apr_status_t status;
if (ctx->start_cb) {
status = ctx->start_cb(ctx->baton, ctx->bytes_read);
ctx->start_cb = NULL;
if (SERF_BUCKET_READ_ERROR(status))
return status;
}
if (ctx->stream && !ctx->at_eof) {
status = serf_bucket_read_iovec(ctx->stream, requested, vecs_size,
vecs, vecs_used);
}
else {
status = APR_EOF;
*vecs_used = 0;
if (ctx->at_eof && ctx->stream) {
serf_bucket_destroy(ctx->stream);
ctx->stream = NULL;
}
}
if (!SERF_BUCKET_READ_ERROR(status)) {
int i;
for (i = 0; i < *vecs_used; i++)
ctx->bytes_read += vecs[i].iov_len;
if (APR_STATUS_IS_EOF(status)) {
ctx->at_eof = true;
if (ctx->eof_cb) {
status = ctx->eof_cb(ctx->baton, ctx->bytes_read);
ctx->eof_cb = NULL;
status = SERF_BUCKET_READ_ERROR(status) ? status : APR_EOF;
}
}
}
return status;
}