Skip to content

Commit

Permalink
Fixes delivery of events to Response.CompleteListeners. (#10102)
Browse files Browse the repository at this point in the history
In case of `request.onComplete(Response.CompleteListener l)`, only the complete event should be delivered to `l`, not all the events (in case `l` implements other listener interfaces).

Only `Response.CompleteListener` passed to `request.send(Response.CompleteListener)` should receive all events.

Signed-off-by: Simone Bordet <[email protected]>
  • Loading branch information
sbordet authored Jul 13, 2023
1 parent a08e953 commit 190af29
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public void send(Request request, Response.CompleteListener listener)

httpRequest.sent();
if (listener != null)
responseListeners.addCompleteListener(listener);
responseListeners.addCompleteListener(listener, true);

HttpExchange exchange = new HttpExchange(getHttpDestination(), httpRequest);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,7 @@ public Request onPush(BiFunction<Request, Request, Response.CompleteListener> pu
@Override
public Request onComplete(Response.CompleteListener listener)
{
responseListeners.addCompleteListener(listener);
responseListeners.addCompleteListener(listener, false);
return this;
}

Expand Down Expand Up @@ -674,7 +674,7 @@ public void send(Response.CompleteListener listener)
void sendAsync(HttpDestination destination, Response.CompleteListener listener)
{
if (listener != null)
responseListeners.addCompleteListener(listener);
responseListeners.addCompleteListener(listener, true);
destination.send(this);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -308,12 +308,7 @@ private static void notifyFailure(Response.FailureListener listener, Response re
}
}

public boolean addCompleteListener(Response.CompleteListener listener)
{
return addCompleteListener(listener, true);
}

private boolean addCompleteListener(Response.CompleteListener listener, boolean includeOtherEvents)
public boolean addCompleteListener(Response.CompleteListener listener, boolean includeOtherEvents)
{
if (listener == null)
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1013,7 +1013,7 @@ public void testResponseListenerForMultipleEventsIsInvokedOncePerEvent(Scenario
start(scenario, new EmptyServerHandler());

AtomicInteger counter = new AtomicInteger();
CountDownLatch latch = new CountDownLatch(1);
CountDownLatch latch = new CountDownLatch(2);
Response.Listener listener = new Response.Listener()
{
@Override
Expand Down Expand Up @@ -1079,12 +1079,13 @@ public void onComplete(Result result)
.onResponseContentAsync(listener)
.onResponseSuccess(listener)
.onResponseFailure(listener)
.onComplete(listener)
.send(listener);

assertTrue(latch.await(5, TimeUnit.SECONDS));
int expectedEventsTriggeredByOnResponseXXXListeners = 3;
int expectedEventsTriggeredByCompletionListener = 4;
int expected = expectedEventsTriggeredByOnResponseXXXListeners + expectedEventsTriggeredByCompletionListener;
int expectedEventsTriggeredByResponseListeners = 4;
int expectedEventsTriggeredBySendListener = 4;
int expected = expectedEventsTriggeredByResponseListeners + expectedEventsTriggeredBySendListener;
assertEquals(expected, counter.get());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
if (listener != null)
{
HttpChannelOverHTTP2 pushChannel = getHttpChannel().getHttpConnection().acquireHttpChannel();
pushRequest.getResponseListeners().addCompleteListener(listener);
pushRequest.getResponseListeners().addCompleteListener(listener, true);
HttpExchange pushExchange = new HttpExchange(getHttpDestination(), pushRequest);
pushChannel.associate(pushExchange);
pushChannel.setStream(stream);
Expand Down

0 comments on commit 190af29

Please sign in to comment.