Fixes #4296 - WebSocketClient cannot connect with "%25" in query

Signed-off-by: Joakim Erdfelt <joakim.erdfelt@gmail.com>
This commit is contained in:
Joakim Erdfelt 2019-11-12 10:22:19 -06:00
parent 4825832a53
commit 2d50c92979
No known key found for this signature in database
GPG Key ID: 2D0E1FB8FE4B68B4
2 changed files with 27 additions and 4 deletions

View File

@ -25,6 +25,8 @@ import java.net.ServerSocket;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@ -174,6 +176,27 @@ public class ClientConnectTest
}
}
@Test
public void testUpgradeRequest_PercentEncodedQuery() throws Exception
{
CloseTrackingEndpoint cliSock = new CloseTrackingEndpoint();
client.getPolicy().setIdleTimeout(10000);
URI wsUri = WSURI.toWebsocket(server.getURI().resolve("/echo?name=%25foo"));
ClientUpgradeRequest request = new ClientUpgradeRequest();
request.setSubProtocols("echo");
Future<Session> future = client.connect(cliSock, wsUri);
try (Session sess = future.get(30, TimeUnit.SECONDS))
{
assertThat("Connect.UpgradeRequest", sess.getUpgradeRequest(), notNullValue());
Map<String, List<String>> paramMap = sess.getUpgradeRequest().getParameterMap();
List<String> values = paramMap.get("name");
assertThat("Params[name]", values.get(0), is("%foo"));
assertThat("Connect.UpgradeResponse", sess.getUpgradeResponse(), notNullValue());
}
}
@Test
public void testAltConnect() throws Exception
{

View File

@ -152,19 +152,19 @@ public class ClientUpgradeRequest extends UpgradeRequestAdapter
// parse parameter map
Map<String, List<String>> pmap = new HashMap<>();
String query = uri.getQuery();
String query = uri.getRawQuery();
if (StringUtil.isNotBlank(query))
{
MultiMap<String> params = new MultiMap<String>();
UrlEncoded.decodeTo(uri.getQuery(), params, StandardCharsets.UTF_8);
MultiMap<String> params = new MultiMap<>();
UrlEncoded.decodeTo(query, params, StandardCharsets.UTF_8);
for (String key : params.keySet())
{
List<String> values = params.getValues(key);
if (values == null)
{
pmap.put(key, new ArrayList<String>());
pmap.put(key, new ArrayList<>());
}
else
{