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
28 package org.apache.http.nio.entity;
29
30 import java.io.IOException;
31 import java.io.InputStream;
32 import java.nio.ByteBuffer;
33 import java.nio.channels.Channels;
34 import java.nio.channels.ReadableByteChannel;
35
36 import org.apache.http.HttpEntity;
37 import org.apache.http.nio.ContentEncoder;
38 import org.apache.http.nio.IOControl;
39 import org.apache.http.util.Args;
40
41
42
43
44
45
46
47
48 public class EntityAsyncContentProducer implements HttpAsyncContentProducer {
49
50 private final HttpEntity entity;
51 private final ByteBuffer buffer;
52 private ReadableByteChannel channel;
53
54 public EntityAsyncContentProducer(final HttpEntity entity) {
55 super();
56 Args.notNull(entity, "HTTP entity");
57 this.entity = entity;
58 this.buffer = ByteBuffer.allocate(4096);
59 }
60
61 @Override
62 public void produceContent(
63 final ContentEncoder encoder, final IOControl ioControl) throws IOException {
64 if (this.channel == null) {
65 this.channel = Channels.newChannel(this.entity.getContent());
66 }
67 final int i = this.channel.read(this.buffer);
68 this.buffer.flip();
69 encoder.write(this.buffer);
70 final boolean buffering = this.buffer.hasRemaining();
71 this.buffer.compact();
72 if (i == -1 && !buffering) {
73 encoder.complete();
74 close();
75 }
76 }
77
78 @Override
79 public boolean isRepeatable() {
80 return this.entity.isRepeatable();
81 }
82
83 @Override
84 public void close() throws IOException {
85 final ReadableByteChannel local = this.channel;
86 this.channel = null;
87 if (local != null) {
88 local.close();
89 }
90 if (this.entity.isStreaming()) {
91 final InputStream inStream = this.entity.getContent();
92 inStream.close();
93 }
94 }
95
96 @Override
97 public String toString() {
98 return this.entity.toString();
99 }
100
101 }