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.hc.client5.http.async.methods;
28
29 import java.io.IOException;
30 import java.io.UnsupportedEncodingException;
31 import java.nio.charset.Charset;
32 import java.nio.charset.StandardCharsets;
33 import java.nio.charset.UnsupportedCharsetException;
34
35 import org.apache.hc.core5.concurrent.FutureCallback;
36 import org.apache.hc.core5.http.ContentType;
37 import org.apache.hc.core5.http.EntityDetails;
38 import org.apache.hc.core5.http.HttpException;
39 import org.apache.hc.core5.http.HttpResponse;
40 import org.apache.hc.core5.http.config.CharCodingConfig;
41 import org.apache.hc.core5.http.nio.AsyncResponseConsumer;
42 import org.apache.hc.core5.http.nio.entity.AbstractCharDataConsumer;
43 import org.apache.hc.core5.http.protocol.HttpContext;
44
45
46
47
48
49
50
51
52 public abstract class AbstractCharResponseConsumer<T> extends AbstractCharDataConsumer implements AsyncResponseConsumer<T> {
53
54 private volatile FutureCallback<T> resultCallback;
55 private final Charset defaultCharset;
56
57 public AbstractCharResponseConsumer() {
58 this.defaultCharset = StandardCharsets.UTF_8;
59 }
60
61 protected AbstractCharResponseConsumer(final int bufSize,
62 final CharCodingConfig charCodingConfig) {
63 super(bufSize, charCodingConfig);
64 this.defaultCharset = charCodingConfig != null && charCodingConfig.getCharset() != null
65 ? charCodingConfig.getCharset() : StandardCharsets.UTF_8;
66 }
67
68
69
70
71
72
73
74
75 protected abstract void start(HttpResponse response, ContentType contentType) throws HttpException, IOException;
76
77
78
79
80
81
82 protected abstract T buildResult() throws IOException;
83
84 @Override
85 public void informationResponse(
86 final HttpResponse response,
87 final HttpContext context) throws HttpException, IOException {
88 }
89
90 @Override
91 public final void consumeResponse(
92 final HttpResponse response,
93 final EntityDetails entityDetails,
94 final HttpContext context,
95 final FutureCallback<T> resultCallback) throws HttpException, IOException {
96 this.resultCallback = resultCallback;
97 if (entityDetails != null) {
98 final ContentType contentType;
99 try {
100 contentType = ContentType.parse(entityDetails.getContentType());
101 } catch (final UnsupportedCharsetException ex) {
102 throw new UnsupportedEncodingException(ex.getMessage());
103 }
104 Charset charset = contentType != null ? contentType.getCharset() : null;
105 if (charset == null) {
106 charset = defaultCharset;
107 }
108 setCharset(charset);
109 start(response, contentType != null ? contentType : ContentType.DEFAULT_TEXT);
110 } else {
111 start(response, null);
112 completed();
113 }
114 }
115
116 @Override
117 protected final void completed() throws IOException {
118 resultCallback.completed(buildResult());
119 }
120
121 @Override
122 public void failed(final Exception cause) {
123 }
124
125 }