Skip to content

Commit a24039e

Browse files
committed
#12 - ENH: Support multiple RequestListeners
1 parent 921fffc commit a24039e

File tree

5 files changed

+67
-7
lines changed

5 files changed

+67
-7
lines changed

client/src/main/java/io/avaje/http/client/DHttpClientContextBuilder.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ class DHttpClientContextBuilder implements HttpClientContext.Builder {
2020

2121
private BodyAdapter bodyAdapter;
2222

23-
private RequestListener requestListener;
24-
2523
private CookieHandler cookieHandler = new CookieManager();
2624

2725
private HttpClient.Redirect redirect = HttpClient.Redirect.NORMAL;
@@ -32,6 +30,7 @@ class DHttpClientContextBuilder implements HttpClientContext.Builder {
3230
private AuthTokenProvider authTokenProvider;
3331

3432
private final List<RequestIntercept> interceptors = new ArrayList<>();
33+
private final List<RequestListener> listeners = new ArrayList<>();
3534

3635
DHttpClientContextBuilder() {
3736
}
@@ -62,7 +61,7 @@ public HttpClientContext.Builder withBodyAdapter(BodyAdapter adapter) {
6261

6362
@Override
6463
public HttpClientContext.Builder withRequestListener(RequestListener requestListener) {
65-
this.requestListener = requestListener;
64+
this.listeners.add(requestListener);
6665
return this;
6766
}
6867

@@ -109,7 +108,17 @@ public HttpClientContext build() {
109108
if (client == null) {
110109
client = defaultClient();
111110
}
112-
return new DHttpClientContext(client, baseUrl, requestTimeout, bodyAdapter, requestListener, authTokenProvider, buildIntercept());
111+
return new DHttpClientContext(client, baseUrl, requestTimeout, bodyAdapter, buildListener(), authTokenProvider, buildIntercept());
112+
}
113+
114+
private RequestListener buildListener() {
115+
if (listeners.isEmpty()) {
116+
return null;
117+
} else if (listeners.size() == 1) {
118+
return listeners.get(0);
119+
} else {
120+
return new DRequestListeners(listeners);
121+
}
113122
}
114123

115124
private RequestIntercept buildIntercept() {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.avaje.http.client;
2+
3+
import java.util.List;
4+
5+
class DRequestListeners implements RequestListener {
6+
7+
private final RequestListener[] listeners;
8+
9+
DRequestListeners(List<RequestListener> reqListeners) {
10+
this.listeners = reqListeners.toArray(new RequestListener[0]);
11+
}
12+
13+
@Override
14+
public void response(Event event) {
15+
for (RequestListener listener : listeners) {
16+
listener.response(event);
17+
}
18+
}
19+
}

client/src/main/java/io/avaje/http/client/HttpClientContext.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,17 @@ interface Builder {
160160
Builder withBodyAdapter(BodyAdapter adapter);
161161

162162
/**
163-
* Add a request listener. Note that {@link RequestLogger} is an
163+
* Add a request listener. Multiple listeners may be added, when
164+
* do so they will process events in the order they were added.
165+
* <p>
166+
* Note that {@link RequestLogger} is an
164167
* implementation for debug logging request/response headers and
165168
* content.
166169
*/
167170
Builder withRequestListener(RequestListener requestListener);
168171

169172
/**
170-
* Add a request interceptor.
173+
* Add a request interceptor. Multiple interceptors may be added.
171174
*/
172175
Builder withRequestIntercept(RequestIntercept requestIntercept);
173176

client/src/test/java/io/avaje/http/client/DRequestInterceptorsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
class DRequestInterceptorsTest {
1212

13-
private StringBuilder buffer = new StringBuilder();
13+
private final StringBuilder buffer = new StringBuilder();
1414

1515
@Test
1616
void intercept_reverse_after() {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.avaje.http.client;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.mockito.Mockito;
5+
6+
import java.util.Arrays;
7+
import java.util.List;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
class DRequestListenersTest {
12+
13+
private final StringBuilder buffer = new StringBuilder();
14+
15+
@Test
16+
void response() {
17+
18+
DRequestListeners listeners = new DRequestListeners(listeners());
19+
20+
listeners.response(Mockito.mock(RequestListener.Event.class));
21+
22+
assertThat(buffer.toString()).isEqualTo("one|two|");
23+
}
24+
25+
private List<RequestListener> listeners() {
26+
return Arrays.asList(event -> buffer.append("one|"), event -> buffer.append("two|"));
27+
}
28+
29+
}

0 commit comments

Comments
 (0)