summaryrefslogtreecommitdiff
path: root/buckets/response_buckets.c
diff options
context:
space:
mode:
Diffstat (limited to 'buckets/response_buckets.c')
-rw-r--r--buckets/response_buckets.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/buckets/response_buckets.c b/buckets/response_buckets.c
index 975fedc..cb6a19c 100644
--- a/buckets/response_buckets.c
+++ b/buckets/response_buckets.c
@@ -249,8 +249,8 @@ static apr_status_t run_machine(serf_bucket_t *bkt, response_context_t *ctx)
if (errno == ERANGE) {
return APR_FROM_OS_ERROR(ERANGE);
}
- ctx->body = serf_bucket_limit_create(ctx->body, length,
- bkt->allocator);
+ ctx->body = serf_bucket_response_body_create(
+ ctx->body, length, bkt->allocator);
}
else {
v = serf_bucket_headers_get(ctx->headers, "Transfer-Encoding");
@@ -385,13 +385,15 @@ static apr_status_t serf_response_read(serf_bucket_t *bucket,
}
rv = serf_bucket_read(ctx->body, requested, data, len);
+ if (SERF_BUCKET_READ_ERROR(rv))
+ return rv;
+
if (APR_STATUS_IS_EOF(rv)) {
if (ctx->chunked) {
ctx->state = STATE_TRAILERS;
/* Mask the result. */
rv = APR_SUCCESS;
- }
- else {
+ } else {
ctx->state = STATE_DONE;
}
}
@@ -414,6 +416,39 @@ static apr_status_t serf_response_readline(serf_bucket_t *bucket,
return serf_bucket_readline(ctx->body, acceptable, found, data, len);
}
+apr_status_t serf_response_full_become_aggregate(serf_bucket_t *bucket)
+{
+ response_context_t *ctx = bucket->data;
+ serf_bucket_t *bkt;
+ char buf[256];
+ int size;
+
+ serf_bucket_aggregate_become(bucket);
+
+ /* Add reconstructed status line. */
+ size = apr_snprintf(buf, 256, "HTTP/%d.%d %d ",
+ SERF_HTTP_VERSION_MAJOR(ctx->sl.version),
+ SERF_HTTP_VERSION_MINOR(ctx->sl.version),
+ ctx->sl.code);
+ bkt = serf_bucket_simple_copy_create(buf, size,
+ bucket->allocator);
+ serf_bucket_aggregate_append(bucket, bkt);
+ bkt = serf_bucket_simple_copy_create(ctx->sl.reason, strlen(ctx->sl.reason),
+ bucket->allocator);
+ serf_bucket_aggregate_append(bucket, bkt);
+ bkt = SERF_BUCKET_SIMPLE_STRING_LEN("\r\n", 2,
+ bucket->allocator);
+ serf_bucket_aggregate_append(bucket, bkt);
+
+ /* Add headers and stream buckets in order. */
+ serf_bucket_aggregate_append(bucket, ctx->headers);
+ serf_bucket_aggregate_append(bucket, ctx->stream);
+
+ serf_bucket_mem_free(bucket->allocator, ctx);
+
+ return APR_SUCCESS;
+}
+
/* ### need to implement */
#define serf_response_peek NULL