Skip to content

Commit f5456a5

Browse files
committed
Pass ByteBuffer bodies instead of byte[], close AsyncHttpClient#827
1 parent 9cc73fd commit f5456a5

File tree

5 files changed

+119
-8
lines changed

5 files changed

+119
-8
lines changed

api/src/main/java/org/asynchttpclient/util/AsyncHttpProviderUtils.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.io.IOException;
1919
import java.io.UnsupportedEncodingException;
20+
import java.nio.ByteBuffer;
2021
import java.nio.charset.Charset;
2122
import java.util.List;
2223

@@ -155,8 +156,8 @@ private static StringBuilder urlEncodeFormParams0(List<Param> params) {
155156
return sb;
156157
}
157158

158-
public static byte[] urlEncodeFormParams(List<Param> params, Charset charset) {
159-
return StringUtils.charSequence2Bytes(urlEncodeFormParams0(params), charset);
159+
public static ByteBuffer urlEncodeFormParams(List<Param> params, Charset charset) {
160+
return StringUtils.charSequence2ByteBuffer(urlEncodeFormParams0(params), charset);
160161
}
161162

162163
private static void encodeAndAppendFormParam(final StringBuilder sb, final CharSequence name, final CharSequence value) {

providers/netty3/src/main/java/org/asynchttpclient/providers/netty3/request/NettyRequestFactory.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,15 @@
4545
import org.asynchttpclient.providers.netty3.request.body.NettyBody;
4646
import org.asynchttpclient.providers.netty3.request.body.NettyBodyBody;
4747
import org.asynchttpclient.providers.netty3.request.body.NettyByteArrayBody;
48+
import org.asynchttpclient.providers.netty3.request.body.NettyByteBufferBody;
4849
import org.asynchttpclient.providers.netty3.request.body.NettyCompositeByteArrayBody;
4950
import org.asynchttpclient.providers.netty3.request.body.NettyDirectBody;
5051
import org.asynchttpclient.providers.netty3.request.body.NettyFileBody;
5152
import org.asynchttpclient.providers.netty3.request.body.NettyInputStreamBody;
5253
import org.asynchttpclient.providers.netty3.request.body.NettyMultipartBody;
5354
import org.asynchttpclient.spnego.SpnegoEngine;
5455
import org.asynchttpclient.uri.Uri;
56+
import org.asynchttpclient.util.StringUtils;
5557
import org.jboss.netty.buffer.ChannelBuffer;
5658
import org.jboss.netty.handler.codec.http.DefaultHttpRequest;
5759
import org.jboss.netty.handler.codec.http.HttpHeaders;
@@ -218,7 +220,7 @@ else if (request.getCompositeByteData() != null)
218220
nettyBody = new NettyCompositeByteArrayBody(request.getCompositeByteData());
219221

220222
else if (request.getStringData() != null)
221-
nettyBody = new NettyByteArrayBody(request.getStringData().getBytes(bodyCharset));
223+
nettyBody = new NettyByteBufferBody(StringUtils.charSequence2ByteBuffer(request.getStringData(), bodyCharset));
222224

223225
else if (request.getStreamData() != null)
224226
nettyBody = new NettyInputStreamBody(request.getStreamData());
@@ -229,8 +231,7 @@ else if (isNonEmpty(request.getFormParams())) {
229231
if (!request.getHeaders().containsKey(HttpHeaders.Names.CONTENT_TYPE))
230232
contentType = HttpHeaders.Values.APPLICATION_X_WWW_FORM_URLENCODED;
231233

232-
// FIXME could this be done with Netty's ByteBuf?
233-
nettyBody = new NettyByteArrayBody(urlEncodeFormParams(request.getFormParams(), bodyCharset), contentType);
234+
nettyBody = new NettyByteBufferBody(urlEncodeFormParams(request.getFormParams(), bodyCharset), contentType);
234235

235236
} else if (isNonEmpty(request.getParts()))
236237
nettyBody = new NettyMultipartBody(request.getParts(), request.getHeaders(), nettyConfig);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright (c) 2015 AsyncHttpClient Project. All rights reserved.
3+
*
4+
* This program is licensed to you under the Apache License Version 2.0,
5+
* and you may not use this file except in compliance with the Apache License Version 2.0.
6+
* You may obtain a copy of the Apache License Version 2.0 at
7+
* http://www.apache.org/licenses/LICENSE-2.0.
8+
*
9+
* Unless required by applicable law or agreed to in writing,
10+
* software distributed under the Apache License Version 2.0 is distributed on an
11+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
13+
*/
14+
package org.asynchttpclient.providers.netty3.request.body;
15+
16+
import org.jboss.netty.buffer.ChannelBuffer;
17+
import org.jboss.netty.buffer.ChannelBuffers;
18+
19+
import java.nio.ByteBuffer;
20+
21+
public class NettyByteBufferBody extends NettyDirectBody {
22+
23+
private final ByteBuffer bb;
24+
private final String contentType;
25+
private final long length;
26+
27+
public NettyByteBufferBody(ByteBuffer bb) {
28+
this(bb, null);
29+
}
30+
31+
public NettyByteBufferBody(ByteBuffer bb, String contentType) {
32+
this.bb = bb;
33+
length = bb.remaining();
34+
bb.mark();
35+
this.contentType = contentType;
36+
}
37+
38+
@Override
39+
public long getContentLength() {
40+
return length;
41+
}
42+
43+
@Override
44+
public String getContentType() {
45+
return contentType;
46+
}
47+
48+
@Override
49+
public ChannelBuffer channelBuffer() {
50+
// for retry
51+
bb.reset();
52+
return ChannelBuffers.wrappedBuffer(bb);
53+
}
54+
}

providers/netty4/src/main/java/org/asynchttpclient/providers/netty4/request/NettyRequestFactory.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,15 @@
5252
import org.asynchttpclient.providers.netty4.request.body.NettyBody;
5353
import org.asynchttpclient.providers.netty4.request.body.NettyBodyBody;
5454
import org.asynchttpclient.providers.netty4.request.body.NettyByteArrayBody;
55+
import org.asynchttpclient.providers.netty4.request.body.NettyByteBufferBody;
5556
import org.asynchttpclient.providers.netty4.request.body.NettyCompositeByteArrayBody;
5657
import org.asynchttpclient.providers.netty4.request.body.NettyDirectBody;
5758
import org.asynchttpclient.providers.netty4.request.body.NettyFileBody;
5859
import org.asynchttpclient.providers.netty4.request.body.NettyInputStreamBody;
5960
import org.asynchttpclient.providers.netty4.request.body.NettyMultipartBody;
6061
import org.asynchttpclient.spnego.SpnegoEngine;
6162
import org.asynchttpclient.uri.Uri;
63+
import org.asynchttpclient.util.StringUtils;
6264

6365
public final class NettyRequestFactory {
6466

@@ -218,7 +220,7 @@ else if (request.getCompositeByteData() != null)
218220
nettyBody = new NettyCompositeByteArrayBody(request.getCompositeByteData());
219221

220222
else if (request.getStringData() != null)
221-
nettyBody = new NettyByteArrayBody(request.getStringData().getBytes(bodyCharset));
223+
nettyBody = new NettyByteBufferBody(StringUtils.charSequence2ByteBuffer(request.getStringData(), bodyCharset));
222224

223225
else if (request.getStreamData() != null)
224226
nettyBody = new NettyInputStreamBody(request.getStreamData());
@@ -229,8 +231,7 @@ else if (isNonEmpty(request.getFormParams())) {
229231
if (!request.getHeaders().containsKey(HttpHeaders.Names.CONTENT_TYPE))
230232
contentType = HttpHeaders.Values.APPLICATION_X_WWW_FORM_URLENCODED;
231233

232-
// FIXME could this be done with Netty's ByteBuf?
233-
nettyBody = new NettyByteArrayBody(urlEncodeFormParams(request.getFormParams(), bodyCharset), contentType);
234+
nettyBody = new NettyByteBufferBody(urlEncodeFormParams(request.getFormParams(), bodyCharset), contentType);
234235

235236
} else if (isNonEmpty(request.getParts()))
236237
nettyBody = new NettyMultipartBody(request.getParts(), request.getHeaders(), nettyConfig);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright (c) 2015 AsyncHttpClient Project. All rights reserved.
3+
*
4+
* This program is licensed to you under the Apache License Version 2.0,
5+
* and you may not use this file except in compliance with the Apache License Version 2.0.
6+
* You may obtain a copy of the Apache License Version 2.0 at
7+
* http://www.apache.org/licenses/LICENSE-2.0.
8+
*
9+
* Unless required by applicable law or agreed to in writing,
10+
* software distributed under the Apache License Version 2.0 is distributed on an
11+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
13+
*/
14+
package org.asynchttpclient.providers.netty4.request.body;
15+
16+
import io.netty.buffer.ByteBuf;
17+
import io.netty.buffer.Unpooled;
18+
19+
import java.nio.ByteBuffer;
20+
21+
public class NettyByteBufferBody extends NettyDirectBody {
22+
23+
private final ByteBuffer bb;
24+
private final String contentType;
25+
private final long length;
26+
27+
public NettyByteBufferBody(ByteBuffer bb) {
28+
this(bb, null);
29+
}
30+
31+
public NettyByteBufferBody(ByteBuffer bb, String contentType) {
32+
this.bb = bb;
33+
length = bb.remaining();
34+
bb.mark();
35+
this.contentType = contentType;
36+
}
37+
38+
@Override
39+
public long getContentLength() {
40+
return length;
41+
}
42+
43+
@Override
44+
public String getContentType() {
45+
return contentType;
46+
}
47+
48+
@Override
49+
public ByteBuf byteBuf() {
50+
// for retry
51+
bb.reset();
52+
return Unpooled.wrappedBuffer(bb);
53+
}
54+
}

0 commit comments

Comments
 (0)