Skip to content

Commit 16f38e4

Browse files
authored
Encode uri in HttpGateway (#958)
1 parent 54a44c4 commit 16f38e4

File tree

4 files changed

+53
-15
lines changed

4 files changed

+53
-15
lines changed

services-gateway/src/main/java/io/scalecube/services/gateway/http/HttpGatewayAcceptor.java

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import io.scalecube.services.routing.StaticAddressRouter;
3131
import io.scalecube.services.transport.api.DataCodec;
3232
import java.io.IOException;
33+
import java.net.URI;
3334
import java.net.URLDecoder;
3435
import java.nio.charset.StandardCharsets;
3536
import java.util.Arrays;
@@ -231,16 +232,16 @@ private static ServiceMessage toMessage(
231232

232233
// Copy HTTP query params to service message
233234

234-
final var uri = httpRequest.uri();
235-
final var queryParams = matchQueryParams(uri);
235+
final var uri = URI.create(httpRequest.uri());
236+
final var queryParams = matchQueryParams(uri.getQuery());
236237
queryParams.forEach((param, value) -> builder.header("http.query." + param, value));
237238

238239
// Add HTTP method to service message (used by REST services)
239240

240241
builder
241242
.header("http.method", httpRequest.method().name())
242243
.header(HEADER_REQUEST_METHOD, httpRequest.method().name())
243-
.qualifier(stripQueryParams(uri.substring(1)));
244+
.qualifier(uri.getPath().substring(1));
244245

245246
if (consumer != null) {
246247
consumer.accept(builder);
@@ -249,12 +250,11 @@ private static ServiceMessage toMessage(
249250
return builder.build();
250251
}
251252

252-
private static Map<String, String> matchQueryParams(String uri) {
253-
final var index = uri.indexOf('?');
254-
if (index < 0 || index == uri.length() - 1) {
253+
private static Map<String, String> matchQueryParams(String queryString) {
254+
if (queryString == null) {
255255
return Collections.emptyMap(); // no query params
256256
}
257-
return Arrays.stream(uri.substring(index + 1).split("&"))
257+
return Arrays.stream(queryString.split("&"))
258258
.map(s -> s.split("=", 2))
259259
.filter(parts -> parts.length == 2)
260260
.collect(
@@ -263,14 +263,6 @@ private static Map<String, String> matchQueryParams(String uri) {
263263
parts -> URLDecoder.decode(parts[1], StandardCharsets.UTF_8)));
264264
}
265265

266-
private static String stripQueryParams(String uri) {
267-
final var index = uri.indexOf('?');
268-
if (index < 0) {
269-
return uri; // no query params
270-
}
271-
return uri.substring(0, index);
272-
}
273-
274266
private static Mono<ServiceMessage> emptyMessage(ServiceMessage message) {
275267
return Mono.just(ServiceMessage.builder().qualifier(message.qualifier()).build());
276268
}

services-gateway/src/test/java/io/scalecube/services/gateway/rest/RestGatewayTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
import io.scalecube.services.routing.StaticAddressRouter;
2525
import io.scalecube.services.transport.rsocket.RSocketServiceTransport;
2626
import io.scalecube.transport.netty.websocket.WebsocketTransportFactory;
27+
28+
import java.net.URLEncoder;
29+
import java.nio.charset.StandardCharsets;
2730
import java.time.Duration;
2831
import org.hamcrest.Matchers;
2932
import org.junit.jupiter.api.AfterAll;
@@ -423,5 +426,29 @@ void testNoMatchWithoutRestMethod() {
423426
.verify(Duration.ofSeconds(3));
424427
}
425428
}
429+
430+
@Test
431+
void testUrlEncoding() {
432+
final var param = "user|1234";
433+
StepVerifier.create(
434+
serviceCall.requestOne(
435+
ServiceMessage.builder()
436+
.header("http.method", "GET")
437+
.qualifier(encodeUri("v1/restService/encoding/" + param) + "?" +
438+
encodeUri("x=test|1234&y=foo#bar&orderBy[direction]=Asc"))
439+
.build(),
440+
SomeResponse.class))
441+
.assertNext(
442+
message -> {
443+
final var someResponse = message.<SomeResponse>data();
444+
assertNotNull(someResponse, "data");
445+
assertEquals(param, someResponse.name(), "someResponse.name");
446+
})
447+
.verifyComplete();
448+
}
449+
450+
private static String encodeUri(String uri) {
451+
return URLEncoder.encode(uri, StandardCharsets.UTF_8);
452+
}
426453
}
427454
}

services-gateway/src/test/java/io/scalecube/services/gateway/rest/RestService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,8 @@ public interface RestService {
3939
@RestMethod("GET")
4040
@ServiceMethod("queryParams")
4141
Mono<SomeResponse> queryParams();
42+
43+
@RestMethod("GET")
44+
@ServiceMethod("encoding/:foo")
45+
Mono<SomeResponse> encoding();
4246
}

services-gateway/src/test/java/io/scalecube/services/gateway/rest/RestServiceImpl.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,19 @@ public Mono<SomeResponse> queryParams() {
187187
return new SomeResponse().name(UUID.randomUUID().toString());
188188
});
189189
}
190+
191+
@Override
192+
public Mono<SomeResponse> encoding() {
193+
return RequestContext.deferContextual()
194+
.map(
195+
context -> {
196+
final var pathParams = context.pathParams();
197+
final var foo = pathParams.getString("foo");
198+
final var queryParams = context.headerParams("http.query");
199+
assertEquals("test|1234", queryParams.getString("x"));
200+
assertEquals("foo#bar", queryParams.getString("y"));
201+
assertEquals("Asc", queryParams.getString("orderBy[direction]"));
202+
return new SomeResponse().name(foo);
203+
});
204+
}
190205
}

0 commit comments

Comments
 (0)