[Java] Add ability to configure headers (#3090)

This commit is contained in:
Mikael Mengistu 2018-10-11 11:52:10 -07:00 committed by GitHub
parent 9049bf709c
commit e08774b6f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 78 additions and 6 deletions

View File

@ -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<String> accessTokenProvider;
private Duration handshakeResponseTimeout;
private Map<String, String> headers;
HttpHubConnectionBuilder(String url) {
this.url = url;
@ -61,7 +64,20 @@ public class HttpHubConnectionBuilder {
return this;
}
public HttpHubConnectionBuilder withHeaders(Map<String, String> 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);
}
}

View File

@ -72,7 +72,8 @@ public class HubConnection {
this.tickRate = tickRate;
}
HubConnection(String url, Transport transport, boolean skipNegotiate, Logger logger, HttpClient httpClient, Single<String> accessTokenProvider, Duration handshakeResponseTimeout) {
HubConnection(String url, Transport transport, boolean skipNegotiate, Logger logger, HttpClient httpClient,
Single<String> accessTokenProvider, Duration handshakeResponseTimeout, Map<String, String> 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) -> {

View File

@ -1037,7 +1037,7 @@ class HubConnectionTest {
}
@Test
public void accessTokenProviderIsOverriddenFromRedirectNegotiate() {
public void accessTokenProviderIsOverriddenFromRedirectNegotiate() {
AtomicReference<String> 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<String> 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<String> 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")

View File

@ -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;