50
50
import java .io .InputStreamReader ;
51
51
import java .io .OutputStream ;
52
52
import java .io .Reader ;
53
- import java .io .UnsupportedEncodingException ;
54
53
import java .net .URLDecoder ;
55
54
import java .nio .charset .StandardCharsets ;
56
55
import java .util .Collection ;
@@ -71,7 +70,8 @@ final class DialogueFeignClient implements feign.Client {
71
70
private static final String REQUEST_URL_PATH_PARAM = "request-url" ;
72
71
private static final Splitter PATH_SPLITTER = Splitter .on ('/' );
73
72
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 );
75
75
76
76
private final ConjureRuntime runtime ;
77
77
private final Channel channel ;
@@ -143,11 +143,7 @@ private static boolean includeRequestHeader(String headerName) {
143
143
}
144
144
145
145
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 );
151
147
}
152
148
153
149
private static Optional <RequestBody > requestBody (Request request ) {
@@ -364,6 +360,7 @@ private final class FeignEndpoint implements Endpoint {
364
360
}
365
361
366
362
@ Override
363
+ @ SuppressWarnings ("CyclomaticComplexity" )
367
364
public void renderPath (ListMultimap <String , String > params , UrlBuilder url ) {
368
365
List <String > requestUrls = params .get (REQUEST_URL_PATH_PARAM );
369
366
Preconditions .checkState (
@@ -395,14 +392,21 @@ public void renderPath(ListMultimap<String, String> params, UrlBuilder url) {
395
392
if (queryParamsStart != -1 ) {
396
393
String querySegments = trailing .substring (queryParamsStart + 1 );
397
394
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 );
400
405
throw new SafeIllegalStateException (
401
406
"Expected two parameters" ,
402
407
SafeArg .of ("parameters" , keyValuePair .size ()),
403
408
UnsafeArg .of ("values" , keyValuePair ));
404
409
}
405
- url .queryParam (urlDecode (keyValuePair .get (0 )), urlDecode (keyValuePair .get (1 )));
406
410
}
407
411
}
408
412
}
0 commit comments