Skip to content

Commit adc88ee

Browse files
committed
Defer creation of composite buffer until the body is needed.
1 parent b161d8e commit adc88ee

File tree

1 file changed

+41
-22
lines changed

1 file changed

+41
-22
lines changed

providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/GrizzlyResponse.java

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,13 @@
4545
* @since 1.7.0
4646
*/
4747
public class GrizzlyResponse extends ResponseBase {
48-
private final Buffer responseBody;
48+
4949
private final Boolean rfc6265Enabled;
5050

51+
private Buffer responseBody;
52+
private boolean initialized;
53+
54+
5155
// ------------------------------------------------------------ Constructors
5256

5357

@@ -57,35 +61,19 @@ public GrizzlyResponse(final HttpResponseStatus status,
5761
final boolean rfc6265Enabled) {
5862
super(status, headers, bodyParts);
5963
this.rfc6265Enabled = rfc6265Enabled;
60-
if (isNonEmpty(bodyParts)) {
61-
if (bodyParts.size() == 1) {
62-
responseBody = ((GrizzlyResponseBodyPart) bodyParts.get(0)).getBodyBuffer();
63-
} else {
64-
final Buffer firstBuffer = ((GrizzlyResponseBodyPart) bodyParts.get(0)).getBodyBuffer();
65-
final MemoryManager<?> mm = MemoryManager.DEFAULT_MEMORY_MANAGER;
66-
Buffer constructedBodyBuffer = firstBuffer;
67-
for (int i = 1, len = bodyParts.size(); i < len; i++) {
68-
constructedBodyBuffer =
69-
Buffers.appendBuffers(mm,
70-
constructedBodyBuffer,
71-
((GrizzlyResponseBodyPart) bodyParts.get(i)).getBodyBuffer());
72-
}
73-
responseBody = constructedBodyBuffer;
74-
}
75-
} else {
76-
responseBody = Buffers.EMPTY_BUFFER;
77-
}
7864
}
7965

8066

67+
68+
8169
// --------------------------------------------------- Methods from Response
8270

8371
/**
8472
* {@inheritDoc}
8573
*/
8674
public InputStream getResponseBodyAsStream() throws IOException {
8775

88-
return new BufferInputStream(responseBody);
76+
return new BufferInputStream(getResponseBody0());
8977

9078
}
9179

@@ -95,6 +83,7 @@ public InputStream getResponseBodyAsStream() throws IOException {
9583
*/
9684
public String getResponseBodyExcerpt(int maxLength, String charset) throws IOException {
9785
charset = calculateCharset(charset);
86+
final Buffer responseBody = getResponseBody0();
9887
final int len = Math.min(responseBody.remaining(), maxLength);
9988
final int pos = responseBody.position();
10089
return responseBody.toStringContent(getCharset(charset), pos, len + pos);
@@ -107,7 +96,7 @@ public String getResponseBodyExcerpt(int maxLength, String charset) throws IOExc
10796
*/
10897
public String getResponseBody(String charset) throws IOException {
10998

110-
return responseBody.toStringContent(getCharset(charset));
99+
return getResponseBody0().toStringContent(getCharset(charset));
111100

112101
}
113102

@@ -149,7 +138,7 @@ public String getResponseBody() throws IOException {
149138
*/
150139
@SuppressWarnings("UnusedDeclaration")
151140
public Buffer getResponseBodyAsBuffer() {
152-
return responseBody;
141+
return getResponseBody0();
153142
}
154143

155144
/**
@@ -215,4 +204,34 @@ private Charset getCharset(final String charset) {
215204
return Charsets.lookupCharset(charsetLocal);
216205

217206
}
207+
208+
private synchronized Buffer getResponseBody0() {
209+
if (!initialized) {
210+
if (isNonEmpty(bodyParts)) {
211+
if (bodyParts.size() == 1) {
212+
responseBody = ((GrizzlyResponseBodyPart) bodyParts.get(
213+
0)).getBodyBuffer();
214+
} else {
215+
final Buffer firstBuffer =
216+
((GrizzlyResponseBodyPart) bodyParts.get(
217+
0)).getBodyBuffer();
218+
final MemoryManager<?> mm =
219+
MemoryManager.DEFAULT_MEMORY_MANAGER;
220+
Buffer constructedBodyBuffer = firstBuffer;
221+
for (int i = 1, len = bodyParts.size(); i < len; i++) {
222+
constructedBodyBuffer =
223+
Buffers.appendBuffers(mm,
224+
constructedBodyBuffer,
225+
((GrizzlyResponseBodyPart) bodyParts
226+
.get(i)).getBodyBuffer());
227+
}
228+
responseBody = constructedBodyBuffer;
229+
}
230+
} else {
231+
responseBody = Buffers.EMPTY_BUFFER;
232+
}
233+
initialized = true;
234+
}
235+
return responseBody;
236+
}
218237
}

0 commit comments

Comments
 (0)