Skip to content

Commit

Permalink
modify to use URLEncodedUtils per version per Classpath
Browse files Browse the repository at this point in the history
  • Loading branch information
AntCode97 committed May 30, 2024
1 parent 2a4b9b5 commit d874336
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,13 @@

package org.opensearch.client.transport.endpoints;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.Map;
import java.util.function.Function;
import org.opensearch.client.json.JsonpDeserializer;
import org.opensearch.client.opensearch._types.ErrorResponse;
import org.opensearch.client.transport.JsonEndpoint;
import org.opensearch.client.util.PathEncoder;

public class SimpleEndpoint<RequestT, ResponseT> implements JsonEndpoint<RequestT, ResponseT, ErrorResponse> {

Expand Down Expand Up @@ -134,6 +133,6 @@ public static RuntimeException noPathTemplateFound(String what) {
}

public static void pathEncode(String src, StringBuilder dest) {
dest.append(URLEncoder.encode(src, StandardCharsets.UTF_8));
dest.append(PathEncoder.encode(src));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package org.opensearch.client.util;

/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Collections;

public class PathEncoder {

private final static String httpClient4UtilClassName = "org.apache.http.client.utils.URLEncodedUtils";
private final static String httpClient5UtilClassName = "org.apache.hc.core5.net.URLEncodedUtils";
private static final boolean isHttpClient5UtilPresent = isPresent(httpClient5UtilClassName);

public static String encode(String uri) {
if (isHttpClient5UtilPresent) {
return encodeByUtilClass(uri, httpClient5UtilClassName);
} else {
return encodeByUtilClass(uri, httpClient4UtilClassName);
}
}

private static String encodeByUtilClass(String uri, String className) {
try {
Method formatSegments = Class.forName(className).getMethod("formatSegments", Iterable.class, Charset.class);
String invoke = (String) formatSegments.invoke(null, Collections.singletonList(uri), StandardCharsets.UTF_8);
return invoke.substring(1);
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException("Failed to encode URI using " + className, e);
}
}

private static boolean isPresent(String className) {
try {
Class.forName(className);
return true;
} catch (ClassNotFoundException e) {
return false;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,19 @@ public void testArrayPathParameter() {
assertEquals("/a/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));

req = RefreshRequest.of(b -> b.index("a", "b"));
assertEquals("/a%2Cb/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));
if (isHttpClient5Present()) {
assertEquals("/a%2Cb/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));

} else {
assertEquals("/a,b/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));
}

req = RefreshRequest.of(b -> b.index("a", "b", "c"));
assertEquals("/a%2Cb%2Cc/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));
if (isHttpClient5Present()) {
assertEquals("/a%2Cb%2Cc/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));
} else {
assertEquals("/a,b,c/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));
}
}

@Test
Expand All @@ -65,7 +74,11 @@ public void testPathEncoding() {
assertEquals("/a%2Fb/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));

req = RefreshRequest.of(b -> b.index("a/b", "c/d"));
assertEquals("/a%2Fb%2Cc%2Fd/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));
if (isHttpClient5Present()) {
assertEquals("/a%2Fb%2Cc%2Fd/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));
} else {
assertEquals("/a%2Fb,c%2Fd/_refresh", RefreshRequest._ENDPOINT.requestUrl(req));
}

}

Expand All @@ -84,4 +97,13 @@ public void testArrayQueryParameter() {
req = RefreshRequest.of(b -> b.expandWildcards(ExpandWildcard.All, ExpandWildcard.Closed));
assertEquals("all,closed", RefreshRequest._ENDPOINT.queryParameters(req).get("expand_wildcards"));
}

private static boolean isHttpClient5Present() {
try {
Class.forName("org.apache.hc.core5.net.URLEncodedUtils");
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.opensearch.client.util;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class PathEncoderTest {

@Test
public void testEncode() {
// Test with a simple string
String simpleString = "test";
String encodedSimpleString = PathEncoder.encode(simpleString);
assertEquals(simpleString, encodedSimpleString);

// Test with a string that contains special characters
String specialString = "a/b";
String encodedSpecialString = PathEncoder.encode(specialString);
assertEquals("a%2Fb", encodedSpecialString);

// Test with a string that contains alphanumeric characters
String alphanumericString = "abc123";
String encodedAlphanumericString = PathEncoder.encode(alphanumericString);
assertEquals("abc123", encodedAlphanumericString);

// Test with a string that contains multiple segments
String multiSegmentString = "a/b/c/_refresh";
String encodedMultiSegmentString = PathEncoder.encode(multiSegmentString);
assertEquals("a%2Fb%2Fc%2F_refresh", encodedMultiSegmentString);
}
}

0 comments on commit d874336

Please sign in to comment.