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
76
77 protected abstract void start(HttpResponse response, ContentType contentType) throws HttpException, IOException;
78
79
80
81
82
83
84 protected abstract T buildResult() throws IOException;
85
86 @Override
87 public void informationResponse(
88 final HttpResponse response,
89 final HttpContext context) throws HttpException, IOException {
90 }
91
92 @Override
93 public final void consumeResponse(
94 final HttpResponse response,
95 final EntityDetails entityDetails,
96 final HttpContext context,
97 final FutureCallback<T> resultCallback) throws HttpException, IOException {
98 this.resultCallback = resultCallback;
99 if (entityDetails != null) {
100 final ContentType contentType;
101 try {
102 contentType = ContentType.parse(entityDetails.getContentType());
103 } catch (final UnsupportedCharsetException ex) {
104 throw new UnsupportedEncodingException(ex.getMessage());
105 }
106 Charset charset = contentType != null ? contentType.getCharset() : null;
107 if (charset == null) {
108 charset = defaultCharset;
109 }
110 setCharset(charset);
111 start(response, contentType != null ? contentType : ContentType.DEFAULT_TEXT);
112 } else {
113 start(response, null);
114 completed();
115 }
116 }
117
118 @Override
119 protected final void completed() throws IOException {
120 resultCallback.completed(buildResult());
121 }
122
123 @Override
124 public void failed(final Exception cause) {
125 }
126
127 }