static apr_status_t serf_split_read()

in buckets/split_buckets.c [87:149]


static apr_status_t serf_split_read(serf_bucket_t *bucket,
                                    apr_size_t requested,
                                    const char **data,
                                    apr_size_t *len)
{
    split_stream_ctx_t *sctx = bucket->data;
    split_context_t *ctx = sctx->ctx;
    apr_status_t status;

    if (! ctx || sctx->at_eof) {
        split_detach_head(sctx);
        *data = NULL;
        *len = 0;
        return APR_EOF;
    }
    else if (sctx->prev) {
        /* Not the current head */
        *data = NULL;
        *len = 0;
        if (sctx->prev->prev || !sctx->prev->at_eof)
            return APR_EAGAIN; /* Not ready soon */

        return APR_SUCCESS; /* Most likely ready at next read */
    }

    if (sctx->max_size != SERF_READ_ALL_AVAIL
        && requested > (sctx->max_size - sctx->read_size))
    {
      requested = (sctx->max_size - sctx->read_size);
    }

    status = serf_bucket_read(ctx->stream, requested, data, len);

    if (!SERF_BUCKET_READ_ERROR(status)) {
        sctx->cant_read = (*len != 0);
        sctx->read_size += *len;

        if (sctx->min_size != SERF_READ_ALL_AVAIL
            && sctx->read_size >= sctx->min_size) {
            /* We read enough. Fix the final length now */
            sctx->at_eof = true;
            sctx->fixed_size = sctx->max_size = sctx->read_size;
            status = APR_EOF;
        }
        else if (APR_STATUS_IS_EOF(status)) {
            sctx->at_eof = true;

            if (sctx->fixed_size && sctx->read_size != sctx->fixed_size) {
                /* We promised more data via get_remaining() than we can
                   deliver. -> BAD get_remaining()  */
                status = SERF_ERROR_TRUNCATED_STREAM;
            }
            else {
                /* Ok, then this is our size */
                sctx->max_size = sctx->fixed_size = sctx->read_size;
            }
        }
    }
    else
      sctx->cant_read = false;

    return status;
}