Skip to content

Commit b31bfda

Browse files
authored
Merge pull request #735 from pierredavidbelanger/731
A minimal test (failing) to show that a Netty buffer is not accessible
2 parents 1ef2c40 + e69d1ba commit b31bfda

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.jooby.issues;
2+
3+
import org.jooby.test.ServerFeature;
4+
import org.junit.Test;
5+
6+
import java.util.concurrent.Executors;
7+
8+
public class Issue731 extends ServerFeature {
9+
10+
{
11+
12+
executor("worker1", Executors.newSingleThreadExecutor());
13+
14+
post("/", deferred("worker1", req -> req.body(String.class)));
15+
16+
}
17+
18+
@Test
19+
public void appShouldBeAbleToReadTheRequestBodyWhenDeferred() throws Exception {
20+
request()
21+
.post("/")
22+
.body("HelloWorld!", "text/plain")
23+
.expect(200)
24+
.expect("HelloWorld!");
25+
}
26+
}

jooby-netty/src/main/java/org/jooby/internal/netty/NettyRequest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.google.common.collect.Multimap;
4444

4545
import io.netty.buffer.ByteBuf;
46+
import io.netty.buffer.ByteBufHolder;
4647
import io.netty.buffer.ByteBufInputStream;
4748
import io.netty.channel.Channel;
4849
import io.netty.channel.ChannelHandlerContext;
@@ -63,6 +64,7 @@
6364
import io.netty.handler.codec.http.websocketx.WebSocketServerHandshakerFactory;
6465
import io.netty.handler.codec.http2.HttpConversionUtil;
6566
import io.netty.util.AttributeKey;
67+
import io.netty.util.ReferenceCounted;
6668

6769
public class NettyRequest implements NativeRequest {
6870

@@ -242,7 +244,15 @@ public void startAsync(final Executor executor, final Runnable runnable) {
242244
channel.attr(NEED_FLUSH).set(false);
243245
channel.attr(ASYNC).set(true);
244246

245-
executor.execute(runnable);
247+
ReferenceCounted referenceCounted = ((ByteBufHolder) req).content();
248+
referenceCounted.retain();
249+
executor.execute(() -> {
250+
try {
251+
runnable.run();
252+
} finally {
253+
referenceCounted.release();
254+
}
255+
});
246256
}
247257

248258
private org.jooby.Cookie cookie(final Cookie c) {

0 commit comments

Comments
 (0)