diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java index 23220316c4..3f13af45bb 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java @@ -166,6 +166,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; @@ -493,7 +494,14 @@ public UnaryCallable createUnaryCalla private static HeaderProvider headerProviderWithUserAgentFrom(HeaderProvider headerProvider) { final Map headersWithUserAgent = new HashMap<>(headerProvider.getHeaders()); - final String userAgent = headersWithUserAgent.get(USER_AGENT_KEY); + String userAgent = null; + for (Entry entry : headersWithUserAgent.entrySet()) { + if (entry.getKey().equalsIgnoreCase(USER_AGENT_KEY)) { + userAgent = entry.getValue(); + headersWithUserAgent.remove(entry.getKey()); + break; + } + } headersWithUserAgent.put( USER_AGENT_KEY, userAgent == null ? DEFAULT_USER_AGENT : userAgent + " " + DEFAULT_USER_AGENT); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java index 30737dcf71..71f988fb39 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java @@ -509,27 +509,29 @@ public void testDefaultUserAgent() { @Test public void testCustomUserAgent() { - final HeaderProvider userAgentHeaderProvider = - new HeaderProvider() { - @Override - public Map getHeaders() { - final Map headers = new HashMap<>(); - headers.put("user-agent", "test-agent"); - return headers; - } - }; - final SpannerOptions options = - createSpannerOptions().toBuilder().setHeaderProvider(userAgentHeaderProvider).build(); - try (Spanner spanner = options.getService()) { - final DatabaseClient databaseClient = - spanner.getDatabaseClient(DatabaseId.of("[PROJECT]", "[INSTANCE]", "[DATABASE]")); + for (String headerId : new String[] {"user-agent", "User-Agent", "USER-AGENT"}) { + final HeaderProvider userAgentHeaderProvider = + new HeaderProvider() { + @Override + public Map getHeaders() { + final Map headers = new HashMap<>(); + headers.put(headerId, "test-agent"); + return headers; + } + }; + final SpannerOptions options = + createSpannerOptions().toBuilder().setHeaderProvider(userAgentHeaderProvider).build(); + try (Spanner spanner = options.getService()) { + final DatabaseClient databaseClient = + spanner.getDatabaseClient(DatabaseId.of("[PROJECT]", "[INSTANCE]", "[DATABASE]")); + + try (final ResultSet rs = databaseClient.singleUse().executeQuery(SELECT1AND2)) { + rs.next(); + } - try (final ResultSet rs = databaseClient.singleUse().executeQuery(SELECT1AND2)) { - rs.next(); + assertThat(seenHeaders.get(Key.of("user-agent", Metadata.ASCII_STRING_MARSHALLER))) + .contains("test-agent " + defaultUserAgent); } - - assertThat(seenHeaders.get(Key.of("user-agent", Metadata.ASCII_STRING_MARSHALLER))) - .contains("test-agent " + defaultUserAgent); } }