From e08774b6f0b3ecd5b7b64f81bf1cd5675d6008ea Mon Sep 17 00:00:00 2001 From: Mikael Mengistu Date: Thu, 11 Oct 2018 11:52:10 -0700 Subject: [PATCH] [Java] Add ability to configure headers (#3090) --- .../signalr/HttpHubConnectionBuilder.java | 18 +++++- .../com/microsoft/signalr/HubConnection.java | 7 ++- .../microsoft/signalr/HubConnectionTest.java | 57 ++++++++++++++++++- .../signalr/NegotiateResponseTest.java | 2 - 4 files changed, 78 insertions(+), 6 deletions(-) diff --git a/clients/java/signalr/src/main/java/com/microsoft/signalr/HttpHubConnectionBuilder.java b/clients/java/signalr/src/main/java/com/microsoft/signalr/HttpHubConnectionBuilder.java index 9d059ab8ba..38df0572a9 100644 --- a/clients/java/signalr/src/main/java/com/microsoft/signalr/HttpHubConnectionBuilder.java +++ b/clients/java/signalr/src/main/java/com/microsoft/signalr/HttpHubConnectionBuilder.java @@ -4,6 +4,8 @@ package com.microsoft.signalr; import java.time.Duration; +import java.util.HashMap; +import java.util.Map; import io.reactivex.Single; @@ -15,6 +17,7 @@ public class HttpHubConnectionBuilder { private boolean skipNegotiate; private Single accessTokenProvider; private Duration handshakeResponseTimeout; + private Map headers; HttpHubConnectionBuilder(String url) { this.url = url; @@ -61,7 +64,20 @@ public class HttpHubConnectionBuilder { return this; } + public HttpHubConnectionBuilder withHeaders(Map headers) { + this.headers = headers; + return this; + } + + public HttpHubConnectionBuilder withHeader(String name, String value) { + if (headers == null) { + this.headers = new HashMap<>(); + } + this.headers.put(name, value); + return this; + } + public HubConnection build() { - return new HubConnection(url, transport, skipNegotiate, logger, httpClient, accessTokenProvider, handshakeResponseTimeout); + return new HubConnection(url, transport, skipNegotiate, logger, httpClient, accessTokenProvider, handshakeResponseTimeout, headers); } } \ No newline at end of file diff --git a/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java b/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java index df17a9421f..b4378c7d0c 100644 --- a/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java +++ b/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java @@ -72,7 +72,8 @@ public class HubConnection { this.tickRate = tickRate; } - HubConnection(String url, Transport transport, boolean skipNegotiate, Logger logger, HttpClient httpClient, Single accessTokenProvider, Duration handshakeResponseTimeout) { + HubConnection(String url, Transport transport, boolean skipNegotiate, Logger logger, HttpClient httpClient, + Single accessTokenProvider, Duration handshakeResponseTimeout, Map headers) { if (url == null || url.isEmpty()) { throw new IllegalArgumentException("A valid url is required."); } @@ -106,6 +107,10 @@ public class HubConnection { this.handshakeResponseTimeout = handshakeResponseTimeout; } + if (headers != null) { + this.headers.putAll(headers); + } + this.skipNegotiate = skipNegotiate; this.callback = (payload) -> { diff --git a/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java b/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java index 14417b2193..a57401e6f0 100644 --- a/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java +++ b/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java @@ -1037,7 +1037,7 @@ class HubConnectionTest { } @Test - public void accessTokenProviderIsOverriddenFromRedirectNegotiate() { + public void accessTokenProviderIsOverriddenFromRedirectNegotiate() { AtomicReference token = new AtomicReference<>(); TestHttpClient client = new TestHttpClient() .on("POST", "http://example.com/negotiate", (req) -> CompletableFuture.completedFuture(new HttpResponse(200, "", "{\"url\":\"http://testexample.com/\",\"accessToken\":\"newToken\"}"))) @@ -1098,7 +1098,60 @@ class HubConnectionTest { } @Test - public void hubConnectionCanBeStartedAfterBeingStopped() { + public void headersAreSetAndSentThroughBuilder() { + AtomicReference header = new AtomicReference<>(); + TestHttpClient client = new TestHttpClient() + .on("POST", "http://example.com/negotiate", + (req) -> { + header.set(req.getHeaders().get("ExampleHeader")); + return CompletableFuture + .completedFuture(new HttpResponse(200, "", "{\"connectionId\":\"bVOiRPG8-6YiJ6d7ZcTOVQ\",\"" + + "availableTransports\":[{\"transport\":\"WebSockets\",\"transferFormats\":[\"Text\",\"Binary\"]}]}")); + }); + + + MockTransport transport = new MockTransport(); + HubConnection hubConnection = HubConnectionBuilder.create("http://example.com") + .withTransport(transport) + .withHttpClient(client) + .withHeader("ExampleHeader", "ExampleValue") + .build(); + + hubConnection.start().blockingAwait(1000, TimeUnit.MILLISECONDS); + assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); + hubConnection.stop(); + assertEquals("ExampleValue", header.get()); + } + + @Test + public void sameHeaderSetTwiceGetsOverwritten() { + AtomicReference header = new AtomicReference<>(); + TestHttpClient client = new TestHttpClient() + .on("POST", "http://example.com/negotiate", + (req) -> { + header.set(req.getHeaders().get("ExampleHeader")); + return CompletableFuture + .completedFuture(new HttpResponse(200, "", "{\"connectionId\":\"bVOiRPG8-6YiJ6d7ZcTOVQ\",\"" + + "availableTransports\":[{\"transport\":\"WebSockets\",\"transferFormats\":[\"Text\",\"Binary\"]}]}")); + }); + + + MockTransport transport = new MockTransport(); + HubConnection hubConnection = HubConnectionBuilder.create("http://example.com") + .withTransport(transport) + .withHttpClient(client) + .withHeader("ExampleHeader", "ExampleValue") + .withHeader("ExampleHeader", "New Value") + .build(); + + hubConnection.start().blockingAwait(1000, TimeUnit.MILLISECONDS); + assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); + hubConnection.stop(); + assertEquals("New Value", header.get()); + } + + @Test + public void hubConnectionCanBeStartedAfterBeingStopped() throws Exception { MockTransport transport = new MockTransport(); HubConnection hubConnection = HubConnectionBuilder .create("http://example.com") diff --git a/clients/java/signalr/src/test/java/com/microsoft/signalr/NegotiateResponseTest.java b/clients/java/signalr/src/test/java/com/microsoft/signalr/NegotiateResponseTest.java index 1bef3278e5..9ba6fc556e 100644 --- a/clients/java/signalr/src/test/java/com/microsoft/signalr/NegotiateResponseTest.java +++ b/clients/java/signalr/src/test/java/com/microsoft/signalr/NegotiateResponseTest.java @@ -5,8 +5,6 @@ package com.microsoft.signalr; import static org.junit.jupiter.api.Assertions.*; -import java.io.IOException; - import org.junit.jupiter.api.Test;