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.annotation.ThreadSafe;
35 import org.apache.http.entity.ContentType;
36 import org.apache.http.nio.ContentDecoder;
37 import org.apache.http.nio.IOControl;
38 import org.apache.http.nio.entity.ContentBufferEntity;
39 import org.apache.http.nio.util.HeapByteBufferAllocator;
40 import org.apache.http.nio.util.SimpleInputBuffer;
41 import org.apache.http.protocol.HttpContext;
42
43
44
45
46
47
48
49
50 @ThreadSafe
51 public class BasicAsyncResponseConsumer extends AbstractAsyncResponseConsumer<HttpResponse> {
52
53 private volatile HttpResponse response;
54 private volatile SimpleInputBuffer buf;
55
56 public BasicAsyncResponseConsumer() {
57 super();
58 }
59
60 @Override
61 protected void onResponseReceived(final HttpResponse response) throws IOException {
62 this.response = response;
63 }
64
65 @Override
66 protected void onEntityEnclosed(
67 final HttpEntity entity, final ContentType contentType) throws IOException {
68 long len = entity.getContentLength();
69 if (len > Integer.MAX_VALUE) {
70 throw new ContentTooLongException("Entity content is too long: " + len);
71 }
72 if (len < 0) {
73 len = 4096;
74 }
75 this.buf = new SimpleInputBuffer((int) len, new HeapByteBufferAllocator());
76 this.response.setEntity(new ContentBufferEntity(entity, this.buf));
77 }
78
79 @Override
80 protected void onContentReceived(
81 final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
82 if (this.buf == null) {
83 throw new IllegalStateException("Content buffer is null");
84 }
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 }