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.HttpEntityEnclosingRequest;
34 import org.apache.http.HttpRequest;
35 import org.apache.http.annotation.ThreadSafe;
36 import org.apache.http.entity.ContentType;
37 import org.apache.http.nio.ContentDecoder;
38 import org.apache.http.nio.IOControl;
39 import org.apache.http.nio.entity.ContentBufferEntity;
40 import org.apache.http.nio.util.HeapByteBufferAllocator;
41 import org.apache.http.nio.util.SimpleInputBuffer;
42 import org.apache.http.protocol.HttpContext;
43
44
45
46
47
48
49
50
51 @ThreadSafe
52 public class BasicAsyncRequestConsumer extends AbstractAsyncRequestConsumer<HttpRequest> {
53
54 private volatile HttpRequest request;
55 private volatile SimpleInputBuffer buf;
56
57 public BasicAsyncRequestConsumer() {
58 super();
59 }
60
61 @Override
62 protected void onRequestReceived(final HttpRequest request) throws IOException {
63 this.request = request;
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: " + len);
72 }
73 if (len < 0) {
74 len = 4096;
75 }
76 this.buf = new SimpleInputBuffer((int) len, new HeapByteBufferAllocator());
77 ((HttpEntityEnclosingRequest) this.request).setEntity(
78 new ContentBufferEntity(entity, this.buf));
79 }
80
81 @Override
82 protected void onContentReceived(
83 final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
84 if (this.buf == null) {
85 throw new IllegalStateException("Content buffer is null");
86 }
87 this.buf.consumeContent(decoder);
88 }
89
90 @Override
91 protected void releaseResources() {
92 this.request = null;
93 this.buf = null;
94 }
95
96 @Override
97 protected HttpRequest buildResult(final HttpContext context) {
98 return this.request;
99 }
100
101 }