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.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 import org.apache.http.util.Asserts;
43
44
45
46
47
48
49
50
51 public class BasicAsyncRequestConsumer extends AbstractAsyncRequestConsumer<HttpRequest> {
52
53 private static final int MAX_INITIAL_BUFFER_SIZE = 256 * 1024;
54
55 private volatile HttpRequest request;
56 private volatile SimpleInputBuffer buf;
57
58 public BasicAsyncRequestConsumer() {
59 super();
60 }
61
62 @Override
63 protected void onRequestReceived(final HttpRequest request) throws IOException {
64 this.request = request;
65 }
66
67 @Override
68 protected void onEntityEnclosed(
69 final HttpEntity entity, final ContentType contentType) throws IOException {
70 long len = entity.getContentLength();
71 if (len > Integer.MAX_VALUE) {
72 throw new ContentTooLongException("Entity content is too long: %,d", len);
73 }
74 if (len < 0) {
75 len = 4096;
76 }
77 final int initialBufferSize = Math.min((int) len, MAX_INITIAL_BUFFER_SIZE);
78 this.buf = new SimpleInputBuffer(initialBufferSize, new HeapByteBufferAllocator());
79 ((HttpEntityEnclosingRequest) this.request).setEntity(
80 new ContentBufferEntity(entity, this.buf));
81 }
82
83 @Override
84 protected void onContentReceived(
85 final ContentDecoder decoder, final IOControl ioControl) throws IOException {
86 Asserts.notNull(this.buf, "Content buffer");
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 }