1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.http.nio.protocol;
28
29 import java.io.IOException;
30
31 import org.apache.http.ContentTooLongException;
32 import org.apache.http.HttpEntity;
33 import org.apache.http.HttpResponse;
34 import org.apache.http.entity.ContentType;
35 import org.apache.http.nio.ContentDecoder;
36 import org.apache.http.nio.IOControl;
37 import org.apache.http.nio.entity.ContentBufferEntity;
38 import org.apache.http.nio.util.HeapByteBufferAllocator;
39 import org.apache.http.nio.util.SimpleInputBuffer;
40 import org.apache.http.protocol.HttpContext;
41 import org.apache.http.util.Asserts;
42
43
44
45
46
47
48
49
50 public class BasicAsyncResponseConsumer extends AbstractAsyncResponseConsumer<HttpResponse> {
51
52 private static final int MAX_INITIAL_BUFFER_SIZE = 256 * 1024;
53
54 private volatile HttpResponse response;
55 private volatile SimpleInputBuffer buf;
56
57 public BasicAsyncResponseConsumer() {
58 super();
59 }
60
61 @Override
62 protected void onResponseReceived(final HttpResponse response) throws IOException {
63 this.response = response;
64 }
65
66 @Override
67 protected void onEntityEnclosed(
68 final HttpEntity entity, final ContentType contentType) throws IOException {
69 long len = entity.getContentLength();
70 if (len > Integer.MAX_VALUE) {
71 throw new ContentTooLongException("Entity content is too long: %,d", len);
72 }
73 if (len < 0) {
74 len = 4096;
75 }
76 final int initialBufferSize = Math.min((int) len, MAX_INITIAL_BUFFER_SIZE);
77 this.buf = new SimpleInputBuffer(initialBufferSize, new HeapByteBufferAllocator());
78 this.response.setEntity(new ContentBufferEntity(entity, this.buf));
79 }
80
81 @Override
82 protected void onContentReceived(
83 final ContentDecoder decoder, final IOControl ioControl) throws IOException {
84 Asserts.notNull(this.buf, "Content buffer");
85 this.buf.consumeContent(decoder);
86 }
87
88 @Override
89 protected void releaseResources() {
90 this.response = null;
91 this.buf = null;
92 }
93
94 @Override
95 protected HttpResponse buildResult(final HttpContext context) {
96 return this.response;
97 }
98
99 }