5050import java .io .InputStreamReader ;
5151import java .io .OutputStream ;
5252import java .io .Reader ;
53- import java .io .UnsupportedEncodingException ;
5453import java .net .URLDecoder ;
5554import java .nio .charset .StandardCharsets ;
5655import 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