Skip to content

Commit

Permalink
fix: prepend uri paths of entity requests with a slash
Browse files Browse the repository at this point in the history
Co-authored-by: Sebastian Heid <sebastian.heid@sap.com>
  • Loading branch information
pk-work and s4heid committed Jul 15, 2021
1 parent 608ec39 commit ae31b86
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 12 deletions.
Expand Up @@ -138,8 +138,8 @@ static ODataRequest mapToODataRequest(RoutingContext routingContext, String sche
/* @formatter:off *//*
* The OData request is awaiting the following fields:
*
* rawRequestUri = http://localhost/my%20service/sys1/Employees?$format=json,$top=10
* rawBaseUri = http://localhost/my%20service
* rawRequestUri = http://localhost/odata/sys1/Employees?$format=json,$top=10
* rawBaseUri = http://localhost/odata/
* rawServiceResolutionUri = sys1
* rawODataPath = /Employees
* rawQueryPath = $format=json,$top=10
Expand Down
@@ -1,7 +1,6 @@
package io.neonbee.endpoint.odatav4.internal.olingo.processor;

import static io.neonbee.entity.EntityVerticle.requestEntity;
import static io.neonbee.internal.helper.StringHelper.EMPTY;

import java.util.Optional;

Expand All @@ -27,8 +26,7 @@ private ProcessorHelper() {}

private static DataQuery odataRequestToQuery(ODataRequest request, DataAction action, Buffer body) {
// the uriPath without /odata root path and without query path
String uriPath =
request.getRawRequestUri().replaceFirst(request.getRawBaseUri(), EMPTY).replaceFirst("\\?.*$", EMPTY);
String uriPath = "/" + request.getRawServiceResolutionUri() + request.getRawODataPath();
// the raw query path
String rawQueryPath = request.getRawQueryPath();
return new DataQuery(action, uriPath, rawQueryPath, request.getAllHeaders(), body).addHeader("X-HTTP-Method",
Expand Down
29 changes: 22 additions & 7 deletions src/test/java/io/neonbee/endpoint/odatav4/ODataV4EndpointTest.java
Expand Up @@ -53,6 +53,9 @@
import io.vertx.junit5.VertxTestContext;

class ODataV4EndpointTest extends ODataEndpointTestBase {

private static final FullQualifiedName TEST_USERS = new FullQualifiedName("Service", "TestUsers");

@Override
protected List<Path> provideEntityModels() {
return List.of(TEST_RESOURCES.resolveRelated("TestService1.csn"),
Expand Down Expand Up @@ -164,16 +167,15 @@ static Stream<Arguments> customStatusCodes() {
@Timeout(value = 2, timeUnit = TimeUnit.SECONDS)
@DisplayName("ODataEndpointHandler must forward custom status codes from DataExceptions to the client")
void testHTTPExceptions(int statusCode, VertxTestContext testContext) {
FullQualifiedName testUsersFQN = new FullQualifiedName("Service", "TestUsers");
Verticle dummyVerticle =
createDummyEntityVerticle(testUsersFQN).withDataAdapter(new DataAdapter<EntityWrapper>() {
createDummyEntityVerticle(TEST_USERS).withDataAdapter(new DataAdapter<EntityWrapper>() {
@Override
public Future<EntityWrapper> retrieveData(DataQuery query, DataContext context) {
return Future.failedFuture(new DataException(statusCode));
}
});

deployVerticle(dummyVerticle).compose(v -> new ODataRequest(testUsersFQN).send(getNeonBee()))
deployVerticle(dummyVerticle).compose(v -> new ODataRequest(TEST_USERS).send(getNeonBee()))
.onComplete(testContext.succeeding(resp -> {
testContext.verify(() -> assertThat(resp.statusCode()).isEqualTo(statusCode));
testContext.completeNow();
Expand All @@ -184,16 +186,29 @@ public Future<EntityWrapper> retrieveData(DataQuery query, DataContext context)
@Timeout(value = 2, timeUnit = TimeUnit.SECONDS)
@DisplayName("Query parameters should be decoded before being forwarded to an EntityVerticle")
void testURLQueryDecoding(VertxTestContext testContext) {
FullQualifiedName testUsersFQN = new FullQualifiedName("Service", "TestUsers");
MultiMap query = MultiMap.caseInsensitiveMultiMap().add("$filter", "description eq ''");
EntityVerticle dummy = createDummyEntityVerticle(testUsersFQN).withDynamicResponse((dataQuery, dataContext) -> {
EntityVerticle dummy = createDummyEntityVerticle(TEST_USERS).withDynamicResponse((dataQuery, dataContext) -> {
testContext.verify(() -> assertThat(dataQuery.getParameters()).isEqualTo(multiMapToMap(query)));
testContext.completeNow();
return new EntityWrapper(testUsersFQN, (Entity) null);
return new EntityWrapper(TEST_USERS, (Entity) null);
});

// requestOData encodes the query parameters before sending them to the ODataV4Endpoint
deployVerticle(dummy).compose(v -> requestOData(new ODataRequest(testUsersFQN).setQuery(query)))
deployVerticle(dummy).compose(v -> requestOData(new ODataRequest(TEST_USERS).setQuery(query)))
.onComplete(testContext.succeeding(v -> {}));
}

@Test
@Timeout(value = 2, timeUnit = TimeUnit.SECONDS)
@DisplayName("Uri path on Entity request must start with a leading slash")
void testURIPathExtraction(VertxTestContext testContext) {
EntityVerticle dummy = createDummyEntityVerticle(TEST_USERS).withDynamicResponse((dataQuery, dataContext) -> {
testContext.verify(() -> assertThat(dataQuery.getUriPath()).isEqualTo("/Service/TestUsers"));
testContext.completeNow();
return new EntityWrapper(TEST_USERS, (Entity) null);
});

deployVerticle(dummy).compose(v -> requestOData(new ODataRequest(TEST_USERS)))
.onComplete(testContext.succeeding(v -> {}));
}

Expand Down

0 comments on commit ae31b86

Please sign in to comment.