Skip to content

Commit 4a66906

Browse files
authored
googleapis: C2P resolver updates on query params handling (#12855)
Since all queries should be dropped entirely rather than just stripping `force-xds`, I have unconditionally set `setRawQuery(null)` in GoogleCloudToProdNameResolver when building the modified target URI.
1 parent aa59e30 commit 4a66906

2 files changed

Lines changed: 58 additions & 21 deletions

File tree

googleapis/src/main/java/io/grpc/googleapis/GoogleCloudToProdNameResolver.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,6 @@ private static synchronized BootstrapInfo getBootstrapInfo(boolean isForcedXds)
135135
QueryParams queryParams = QueryParams.fromRawQuery(grpcUri.getRawQuery());
136136
this.forceXds = checkForceXds(queryParams);
137137
this.schemeOverride = (forceXds || isOnGcp) ? "xds" : "dns";
138-
stripForceXds(queryParams);
139-
String newQuery = queryParams.toRawQuery();
140138

141139
Preconditions.checkArgument(
142140
targetPath.startsWith("/"),
@@ -147,7 +145,7 @@ private static synchronized BootstrapInfo getBootstrapInfo(boolean isForcedXds)
147145
syncContext = checkNotNull(args, "args").getSynchronizationContext();
148146

149147
Uri.Builder modifiedTargetBuilder = grpcUri.toBuilder().setScheme(schemeOverride);
150-
modifiedTargetBuilder.setRawQuery(newQuery);
148+
modifiedTargetBuilder.setRawQuery(null);
151149
if (schemeOverride.equals("xds")) {
152150
modifiedTargetBuilder.setRawAuthority(C2P_AUTHORITY);
153151
}
@@ -180,8 +178,6 @@ private static synchronized BootstrapInfo getBootstrapInfo(boolean isForcedXds)
180178
QueryParams queryParams = QueryParams.fromRawQuery(targetUri.getRawQuery());
181179
this.forceXds = checkForceXds(queryParams);
182180
this.schemeOverride = (forceXds || isOnGcp) ? "xds" : "dns";
183-
stripForceXds(queryParams);
184-
String newQuery = queryParams.toRawQuery();
185181

186182
Preconditions.checkArgument(
187183
targetUri.isPathAbsolute(),
@@ -195,11 +191,7 @@ private static synchronized BootstrapInfo getBootstrapInfo(boolean isForcedXds)
195191
authority = GrpcUtil.checkAuthority(pathSegments.get(0));
196192
syncContext = checkNotNull(args, "args").getSynchronizationContext();
197193
Uri.Builder modifiedTargetBuilder = targetUri.toBuilder().setScheme(schemeOverride);
198-
if (newQuery != null) {
199-
modifiedTargetBuilder.setRawQuery(newQuery);
200-
} else {
201-
modifiedTargetBuilder.setRawQuery(null);
202-
}
194+
modifiedTargetBuilder.setRawQuery(null);
203195

204196
if (schemeOverride.equals("xds")) {
205197
modifiedTargetBuilder.setRawAuthority(C2P_AUTHORITY);
@@ -411,9 +403,7 @@ private static boolean checkForceXds(QueryParams params) {
411403
return false;
412404
}
413405

414-
private static void stripForceXds(QueryParams params) {
415-
params.asList().removeIf(entry -> "force-xds".equals(entry.getKey()));
416-
}
406+
417407

418408
private enum HttpConnectionFactory implements HttpConnectionProvider {
419409
INSTANCE;

googleapis/src/test/java/io/grpc/googleapis/GoogleCloudToProdNameResolverTest.java

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,9 @@ public void notOnGcpButForceXds_DelegateToXds() {
212212
}
213213

214214
@Test
215-
public void notOnGcpButForceXds_KeyValueTrue_DelegateToXds() {
215+
public void notOnGcpButForceXds_WithValue_DelegateToXds() {
216216
GoogleCloudToProdNameResolver.isOnGcp = false;
217-
String target = TARGET_URI + "?force-xds=true";
217+
String target = TARGET_URI + "?force-xds=foo";
218218
resolver = enableRfc3986UrisParam
219219
? new GoogleCloudToProdNameResolver(
220220
Uri.create(target), args, fakeExecutorResource, nsRegistry.asFactory())
@@ -235,6 +235,53 @@ public void notOnGcpButForceXds_KeyValueTrue_DelegateToXds() {
235235
}
236236
}
237237

238+
@Test
239+
public void notOnGcpButForceXds_PercentEncoded_DelegateToXds() {
240+
GoogleCloudToProdNameResolver.isOnGcp = false;
241+
String target = TARGET_URI + "?force%2Dxds";
242+
resolver = enableRfc3986UrisParam
243+
? new GoogleCloudToProdNameResolver(
244+
Uri.create(target), args, fakeExecutorResource, nsRegistry.asFactory())
245+
: new GoogleCloudToProdNameResolver(
246+
URI.create(target), args, fakeExecutorResource, nsRegistry.asFactory());
247+
resolver.start(mockListener);
248+
fakeExecutor.runDueTasks();
249+
assertThat(delegatedResolver.keySet()).containsExactly("xds");
250+
251+
if (enableRfc3986UrisParam) {
252+
Uri delegatedRfcUriValue = delegatedRfcUri.get("xds");
253+
assertThat(delegatedRfcUriValue).isNotNull();
254+
assertThat(delegatedRfcUriValue.getRawQuery()).isNull();
255+
} else {
256+
URI delegatedUriValue = delegatedUri.get("xds");
257+
assertThat(delegatedUriValue).isNotNull();
258+
assertThat(delegatedUriValue.getQuery()).isNull();
259+
}
260+
}
261+
262+
@Test
263+
public void notOnGcpButForceXds_DuplicateKeys_DelegateToXds() {
264+
GoogleCloudToProdNameResolver.isOnGcp = false;
265+
String target = TARGET_URI + "?force-xds=&force-xds=true";
266+
resolver = enableRfc3986UrisParam
267+
? new GoogleCloudToProdNameResolver(
268+
Uri.create(target), args, fakeExecutorResource, nsRegistry.asFactory())
269+
: new GoogleCloudToProdNameResolver(
270+
URI.create(target), args, fakeExecutorResource, nsRegistry.asFactory());
271+
resolver.start(mockListener);
272+
fakeExecutor.runDueTasks();
273+
assertThat(delegatedResolver.keySet()).containsExactly("xds");
274+
275+
if (enableRfc3986UrisParam) {
276+
Uri delegatedRfcUriValue = delegatedRfcUri.get("xds");
277+
assertThat(delegatedRfcUriValue).isNotNull();
278+
assertThat(delegatedRfcUriValue.getRawQuery()).isNull();
279+
} else {
280+
URI delegatedUriValue = delegatedUri.get("xds");
281+
assertThat(delegatedUriValue).isNotNull();
282+
assertThat(delegatedUriValue.getQuery()).isNull();
283+
}
284+
}
238285

239286
@Test
240287
public void notOnGcpButForceXds_WithMultipleParams_DelegateToXds() {
@@ -252,11 +299,11 @@ public void notOnGcpButForceXds_WithMultipleParams_DelegateToXds() {
252299
if (enableRfc3986UrisParam) {
253300
Uri delegatedRfcUriValue = delegatedRfcUri.get("xds");
254301
assertThat(delegatedRfcUriValue).isNotNull();
255-
assertThat(delegatedRfcUriValue.getRawQuery()).isEqualTo("foo=bar&baz=qux");
302+
assertThat(delegatedRfcUriValue.getRawQuery()).isNull();
256303
} else {
257304
URI delegatedUriValue = delegatedUri.get("xds");
258305
assertThat(delegatedUriValue).isNotNull();
259-
assertThat(delegatedUriValue.getQuery()).isEqualTo("foo=bar&baz=qux");
306+
assertThat(delegatedUriValue.getQuery()).isNull();
260307
}
261308
}
262309

@@ -276,11 +323,11 @@ public void notOnGcpButForceXds_WithEncodedAmpersand_DelegateToXds() {
276323
if (enableRfc3986UrisParam) {
277324
Uri delegatedRfcUriValue = delegatedRfcUri.get("xds");
278325
assertThat(delegatedRfcUriValue).isNotNull();
279-
assertThat(delegatedRfcUriValue.getRawQuery()).isEqualTo("foo=bar%26baz");
326+
assertThat(delegatedRfcUriValue.getRawQuery()).isNull();
280327
} else {
281328
URI delegatedUriValue = delegatedUri.get("xds");
282329
assertThat(delegatedUriValue).isNotNull();
283-
assertThat(delegatedUriValue.getRawQuery()).isEqualTo("foo=bar%26baz");
330+
assertThat(delegatedUriValue.getRawQuery()).isNull();
284331
}
285332
}
286333

@@ -299,11 +346,11 @@ public void notOnGcpButForceXds_CaseSensitive_DelegateToDns() {
299346
if (enableRfc3986UrisParam) {
300347
Uri delegatedRfcUriValue = delegatedRfcUri.get("dns");
301348
assertThat(delegatedRfcUriValue).isNotNull();
302-
assertThat(delegatedRfcUriValue.getRawQuery()).isEqualTo("FORCE-XDS");
349+
assertThat(delegatedRfcUriValue.getRawQuery()).isNull();
303350
} else {
304351
URI delegatedUriValue = delegatedUri.get("dns");
305352
assertThat(delegatedUriValue).isNotNull();
306-
assertThat(delegatedUriValue.getQuery()).isEqualTo("FORCE-XDS");
353+
assertThat(delegatedUriValue.getQuery()).isNull();
307354
}
308355
}
309356

0 commit comments

Comments
 (0)