Skip to content

Commit 1a62921

Browse files
authoredMar 24, 2020
Merge pull request #4413 from jansupol/master.followup.1
Sync 3.x with master
2 parents b94138b + e127794 commit 1a62921

File tree

47 files changed

+806
-354
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+806
-354
lines changed
 

‎connectors/netty-connector/src/main/java/org/glassfish/jersey/netty/connector/JerseyClientHandler.java

+42-47
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,14 @@
2121
import java.io.InputStream;
2222
import java.util.Map;
2323
import java.util.concurrent.CompletableFuture;
24-
import java.util.concurrent.LinkedBlockingDeque;
2524

2625
import jakarta.ws.rs.core.Response;
2726

2827
import org.glassfish.jersey.client.ClientRequest;
2928
import org.glassfish.jersey.client.ClientResponse;
30-
import org.glassfish.jersey.client.spi.AsyncConnectorCallback;
3129
import org.glassfish.jersey.netty.connector.internal.NettyInputStream;
3230

3331
import io.netty.buffer.ByteBuf;
34-
import io.netty.buffer.Unpooled;
3532
import io.netty.channel.ChannelHandlerContext;
3633
import io.netty.channel.SimpleChannelInboundHandler;
3734
import io.netty.handler.codec.http.HttpContent;
@@ -40,8 +37,6 @@
4037
import io.netty.handler.codec.http.HttpResponse;
4138
import io.netty.handler.codec.http.HttpUtil;
4239
import io.netty.handler.codec.http.LastHttpContent;
43-
import io.netty.util.concurrent.Future;
44-
import io.netty.util.concurrent.GenericFutureListener;
4540

4641
/**
4742
* Jersey implementation of Netty channel handler.
@@ -50,27 +45,46 @@
5045
*/
5146
class JerseyClientHandler extends SimpleChannelInboundHandler<HttpObject> {
5247

53-
private final NettyConnector connector;
54-
private final LinkedBlockingDeque<ByteBuf> isList = new LinkedBlockingDeque<>();
55-
56-
private final AsyncConnectorCallback asyncConnectorCallback;
5748
private final ClientRequest jerseyRequest;
58-
private final CompletableFuture future;
49+
private final CompletableFuture<ClientResponse> responseAvailable;
50+
private final CompletableFuture<?> responseDone;
51+
52+
private NettyInputStream nis;
53+
private ClientResponse jerseyResponse;
5954

60-
JerseyClientHandler(NettyConnector nettyConnector, ClientRequest request,
61-
AsyncConnectorCallback callback, CompletableFuture future) {
62-
this.connector = nettyConnector;
63-
this.asyncConnectorCallback = callback;
55+
JerseyClientHandler(ClientRequest request,
56+
CompletableFuture<ClientResponse> responseAvailable,
57+
CompletableFuture<?> responseDone) {
6458
this.jerseyRequest = request;
65-
this.future = future;
59+
this.responseAvailable = responseAvailable;
60+
this.responseDone = responseDone;
61+
}
62+
63+
@Override
64+
public void channelReadComplete(ChannelHandlerContext ctx) {
65+
notifyResponse();
66+
}
67+
68+
@Override
69+
public void channelInactive(ChannelHandlerContext ctx) {
70+
// assert: no-op, if channel is closed after LastHttpContent has been consumed
71+
responseDone.completeExceptionally(new IOException("Stream closed"));
72+
}
73+
74+
protected void notifyResponse() {
75+
if (jerseyResponse != null) {
76+
ClientResponse cr = jerseyResponse;
77+
jerseyResponse = null;
78+
responseAvailable.complete(cr);
79+
}
6680
}
6781

6882
@Override
6983
public void channelRead0(ChannelHandlerContext ctx, HttpObject msg) {
7084
if (msg instanceof HttpResponse) {
7185
final HttpResponse response = (HttpResponse) msg;
7286

73-
final ClientResponse jerseyResponse = new ClientResponse(new Response.StatusType() {
87+
jerseyResponse = new ClientResponse(new Response.StatusType() {
7488
@Override
7589
public int getStatusCode() {
7690
return response.status().code();
@@ -90,19 +104,15 @@ public String getReasonPhrase() {
90104
for (Map.Entry<String, String> entry : response.headers().entries()) {
91105
jerseyResponse.getHeaders().add(entry.getKey(), entry.getValue());
92106
}
93-
isList.clear(); // clearing the content - possible leftover from previous request processing.
107+
94108
// request entity handling.
95109
if ((response.headers().contains(HttpHeaderNames.CONTENT_LENGTH) && HttpUtil.getContentLength(response) > 0)
96110
|| HttpUtil.isTransferEncodingChunked(response)) {
97111

98-
ctx.channel().closeFuture().addListener(new GenericFutureListener<Future<? super Void>>() {
99-
@Override
100-
public void operationComplete(Future<? super Void> future) throws Exception {
101-
isList.add(Unpooled.EMPTY_BUFFER);
102-
}
103-
});
112+
nis = new NettyInputStream();
113+
responseDone.whenComplete((_r, th) -> nis.complete(th));
104114

105-
jerseyResponse.setEntityStream(new NettyInputStream(isList));
115+
jerseyResponse.setEntityStream(nis);
106116
} else {
107117
jerseyResponse.setEntityStream(new InputStream() {
108118
@Override
@@ -111,44 +121,29 @@ public int read() throws IOException {
111121
}
112122
});
113123
}
114-
115-
if (asyncConnectorCallback != null) {
116-
connector.executorService.execute(new Runnable() {
117-
@Override
118-
public void run() {
119-
asyncConnectorCallback.response(jerseyResponse);
120-
future.complete(jerseyResponse);
121-
}
122-
});
123-
}
124-
125124
}
126125
if (msg instanceof HttpContent) {
126+
127127
HttpContent httpContent = (HttpContent) msg;
128128

129129
ByteBuf content = httpContent.content();
130+
130131
if (content.isReadable()) {
131132
content.retain();
132-
isList.add(content);
133+
nis.publish(content);
133134
}
134135

135136
if (msg instanceof LastHttpContent) {
136-
isList.add(Unpooled.EMPTY_BUFFER);
137+
responseDone.complete(null);
138+
notifyResponse();
137139
}
138140
}
139141
}
140142

143+
144+
141145
@Override
142146
public void exceptionCaught(ChannelHandlerContext ctx, final Throwable cause) {
143-
if (asyncConnectorCallback != null) {
144-
connector.executorService.execute(new Runnable() {
145-
@Override
146-
public void run() {
147-
asyncConnectorCallback.failure(cause);
148-
}
149-
});
150-
}
151-
future.completeExceptionally(cause);
152-
ctx.close();
147+
responseDone.completeExceptionally(cause);
153148
}
154149
}

0 commit comments

Comments
 (0)