Skip to content

Commit 00fa9bc

Browse files
committed
Optimize query parameter key/value parsing
1 parent 1537545 commit 00fa9bc

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

conjure-java-jaxrs-client/src/main/java/com/palantir/conjure/java/client/jaxrs/DialogueFeignClient.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import java.io.InputStreamReader;
5151
import java.io.OutputStream;
5252
import java.io.Reader;
53-
import java.io.UnsupportedEncodingException;
5453
import java.net.URLDecoder;
5554
import java.nio.charset.StandardCharsets;
5655
import java.util.Collection;
@@ -71,7 +70,8 @@ final class DialogueFeignClient implements feign.Client {
7170
private static final String REQUEST_URL_PATH_PARAM = "request-url";
7271
private static final Splitter PATH_SPLITTER = Splitter.on('/');
7372
private static final Splitter QUERY_SPLITTER = Splitter.on('&').omitEmptyStrings();
74-
private static final Splitter QUERY_VALUE_SPLITTER = Splitter.on('=');
73+
private static final char QUERY_KEY_VALUE_SEPARATOR = '=';
74+
private static final Splitter QUERY_KEY_VALUE_SPLITTER = Splitter.on(QUERY_KEY_VALUE_SEPARATOR);
7575

7676
private final ConjureRuntime runtime;
7777
private final Channel channel;
@@ -143,11 +143,7 @@ private static boolean includeRequestHeader(String headerName) {
143143
}
144144

145145
private static String urlDecode(String input) {
146-
try {
147-
return URLDecoder.decode(input, "UTF-8");
148-
} catch (UnsupportedEncodingException e) {
149-
throw new SafeUncheckedIoException("Failed to decode path segment", e, UnsafeArg.of("encoded", input));
150-
}
146+
return URLDecoder.decode(input, StandardCharsets.UTF_8);
151147
}
152148

153149
private static Optional<RequestBody> requestBody(Request request) {
@@ -364,6 +360,7 @@ private final class FeignEndpoint implements Endpoint {
364360
}
365361

366362
@Override
363+
@SuppressWarnings("CyclomaticComplexity")
367364
public void renderPath(ListMultimap<String, String> params, UrlBuilder url) {
368365
List<String> requestUrls = params.get(REQUEST_URL_PATH_PARAM);
369366
Preconditions.checkState(
@@ -395,14 +392,21 @@ public void renderPath(ListMultimap<String, String> params, UrlBuilder url) {
395392
if (queryParamsStart != -1) {
396393
String querySegments = trailing.substring(queryParamsStart + 1);
397394
for (String querySegment : QUERY_SPLITTER.split(querySegments)) {
398-
List<String> keyValuePair = QUERY_VALUE_SPLITTER.splitToList(querySegment);
399-
if (keyValuePair.size() != 2) {
395+
int equalsIndex = querySegment.indexOf(QUERY_KEY_VALUE_SEPARATOR);
396+
if (equalsIndex > -1) {
397+
String key = querySegment.substring(0, equalsIndex);
398+
int valueStart = equalsIndex + 1;
399+
if (querySegment.indexOf(QUERY_KEY_VALUE_SEPARATOR, valueStart) == -1) {
400+
String value = querySegment.substring(valueStart);
401+
url.queryParam(urlDecode(key), urlDecode(value));
402+
}
403+
} else {
404+
List<String> keyValuePair = QUERY_KEY_VALUE_SPLITTER.splitToList(querySegment);
400405
throw new SafeIllegalStateException(
401406
"Expected two parameters",
402407
SafeArg.of("parameters", keyValuePair.size()),
403408
UnsafeArg.of("values", keyValuePair));
404409
}
405-
url.queryParam(urlDecode(keyValuePair.get(0)), urlDecode(keyValuePair.get(1)));
406410
}
407411
}
408412
}

0 commit comments

Comments
 (0)