Skip to content

Commit

Permalink
Merge pull request #512 from swisspost/develop
Browse files Browse the repository at this point in the history
PR for release
  • Loading branch information
mcweba committed May 11, 2023
2 parents 84570e5 + 4ee303c commit 20cd390
Show file tree
Hide file tree
Showing 40 changed files with 349 additions and 170 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ jobs:
- name: Install, unit test
run: mvn install -Dmaven.javadoc.skip=true -PpublicRepos -B -V

- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v3

- name: Non UI integration tests
run: mvn install -PnonUiIntegrationTests

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# [\_] Gateleen

[![Build Status](https://travis-ci.com/swisspush/gateleen.svg?branch=master)](https://travis-ci.com/swisspush/gateleen)
[![codecov](https://codecov.io/gh/swisspush/gateleen/branch/master/graph/badge.svg)](https://codecov.io/gh/swisspush/gateleen)
[![codecov](https://codecov.io/gh/swisspost/gateleen/branch/master/graph/badge.svg?token=tBKO08u1C8)](https://codecov.io/gh/swisspost/gateleen)
[![](https://img.shields.io/github/issues-raw/swisspush/gateleen.svg)](https://github.com/swisspush/gateleen/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20)
[![GitHub contributors](https://img.shields.io/github/contributors/swisspush/gateleen.svg)](https://github.com/swisspush/gateleen/graphs/contributors)

Expand Down
2 changes: 1 addition & 1 deletion gateleen-cache/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>org.swisspush.gateleen</groupId>
<artifactId>gateleen</artifactId>
<version>1.3.28-SNAPSHOT</version>
<version>1.3.29-SNAPSHOT</version>
</parent>

<artifactId>gateleen-cache</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion gateleen-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>org.swisspush.gateleen</groupId>
<artifactId>gateleen</artifactId>
<version>1.3.28-SNAPSHOT</version>
<version>1.3.29-SNAPSHOT</version>
</parent>

<artifactId>gateleen-core</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.swisspush.gateleen.core.util;

import io.vertx.core.MultiMap;
import io.vertx.core.http.impl.headers.HeadersMultiMap;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(VertxUnitRunner.class)
public class ExpansionDeltaUtilTest {

@Test
public void testMapToDelimetedString(TestContext context){

MultiMap input = new HeadersMultiMap()
.set("k1", "v1")
.set("k2", "v2")
.set("k3", "v3");

String output = ExpansionDeltaUtil.mapToDelimetedString(input, "+");
context.assertEquals("k1=v1+k2=v2+k3=v3", output);
}

@Test
public void testRemoveFromEndOfString(TestContext context) {
String input = "/some/path/";
String output = ExpansionDeltaUtil.removeFromEndOfString(input, "/");
context.assertEquals("/some/path", output);

output = ExpansionDeltaUtil.removeFromEndOfString(input, "+");
context.assertEquals("/some/path/", output);

output = ExpansionDeltaUtil.removeFromEndOfString(input, null);
context.assertEquals("/some/path/", output);
}

@Test
public void testExtractCollectionFromPath(TestContext context) {
context.assertEquals("foobar", ExpansionDeltaUtil.extractCollectionFromPath("/path/to/collection/foobar/"));
context.assertEquals("foobar", ExpansionDeltaUtil.extractCollectionFromPath("/path/to/collection/foobar"));
context.assertEquals("bar", ExpansionDeltaUtil.extractCollectionFromPath("/path/to/collection/foo/bar"));
}
}
2 changes: 1 addition & 1 deletion gateleen-delegate/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>org.swisspush.gateleen</groupId>
<artifactId>gateleen</artifactId>
<version>1.3.28-SNAPSHOT</version>
<version>1.3.29-SNAPSHOT</version>
</parent>

<artifactId>gateleen-delegate</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion gateleen-delta/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>org.swisspush.gateleen</groupId>
<artifactId>gateleen</artifactId>
<version>1.3.28-SNAPSHOT</version>
<version>1.3.29-SNAPSHOT</version>
</parent>

<artifactId>gateleen-delta</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion gateleen-expansion/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>org.swisspush.gateleen</groupId>
<artifactId>gateleen</artifactId>
<version>1.3.28-SNAPSHOT</version>
<version>1.3.29-SNAPSHOT</version>
</parent>

<artifactId>gateleen-expansion</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion gateleen-hook-js/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.swisspush.gateleen</groupId>
<artifactId>gateleen</artifactId>
<version>1.3.28-SNAPSHOT</version>
<version>1.3.29-SNAPSHOT</version>
</parent>
<artifactId>gateleen-hook-js</artifactId>
<packaging>jar</packaging>
Expand Down
2 changes: 1 addition & 1 deletion gateleen-hook/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>org.swisspush.gateleen</groupId>
<artifactId>gateleen</artifactId>
<version>1.3.28-SNAPSHOT</version>
<version>1.3.29-SNAPSHOT</version>
</parent>

<artifactId>gateleen-hook</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.core.net.ProxyOptions;
import io.vertx.ext.web.RoutingContext;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -491,10 +492,11 @@ public void registerListenerRegistrationHandler(Handler<Void> readyHandler) {
* <li>creating a self request for the original request (if necessary)</li>
* </ul>
*
* @param request request
* @param ctx routing context
* @return true if a request is processed by the handler, otherwise false
*/
public boolean handle(final HttpServerRequest request) {
public boolean handle(final RoutingContext ctx) {
HttpServerRequest request = ctx.request();
boolean consumed = false;

/*
Expand Down Expand Up @@ -526,12 +528,12 @@ public boolean handle(final HttpServerRequest request) {
final List<Listener> listeners = listenerRepository.findListeners(request.uri(), request.method().name(), request.headers());

if (!listeners.isEmpty() && !isRequestAlreadyHooked(request)) {
installBodyHandler(request, listeners);
installBodyHandler(ctx, listeners);
consumed = true;
}

if (!consumed) {
consumed = routeRequestIfNeeded(request);
consumed = routeRequestIfNeeded(ctx);

if (!consumed) {
return createListingIfRequested(request);
Expand Down Expand Up @@ -671,24 +673,24 @@ private String getCollectionName(String url) {
return url.substring(url.lastIndexOf("/") + 1, url.length());
}

private boolean routeRequestIfNeeded(HttpServerRequest request) {
Route route = routeRepository.getRoute(request.uri());
private boolean routeRequestIfNeeded(RoutingContext ctx) {
Route route = routeRepository.getRoute(ctx.request().uri());

if (doMethodsMatch(route, request) && doHeadersMatch(route, request)) {
log.debug("Forward request {}", request.uri());
route.forward(request);
if (doMethodsMatch(route, ctx) && doHeadersMatch(route, ctx)) {
log.debug("Forward request {}", ctx.request().uri());
route.forward(ctx);
return true;
} else {
return false;
}
}

private boolean doMethodsMatch(Route route, HttpServerRequest request) {
private boolean doMethodsMatch(Route route, RoutingContext ctx) {
return route != null &&
(route.getHook().getMethods().isEmpty() || route.getHook().getMethods().contains(request.method().name()));
(route.getHook().getMethods().isEmpty() || route.getHook().getMethods().contains(ctx.request().method().name()));
}

private boolean doHeadersMatch(Route route, HttpServerRequest request) {
private boolean doHeadersMatch(Route route, RoutingContext ctx) {
if (route == null) {
return false;
}
Expand All @@ -698,34 +700,35 @@ private boolean doHeadersMatch(Route route, HttpServerRequest request) {

Pattern headersFilterPattern = route.getHook().getHeadersFilterPattern();
log.debug("Looking for request headers with pattern {}", headersFilterPattern.pattern());
return HttpHeaderUtil.hasMatchingHeader(request.headers(), headersFilterPattern);
return HttpHeaderUtil.hasMatchingHeader(ctx.request().headers(), headersFilterPattern);
}

private void installBodyHandler(final HttpServerRequest request, final List<Listener> listeners) {
private void installBodyHandler(final RoutingContext ctx, final List<Listener> listeners) {
// Read the original request and queue a new one for every listener
request.bodyHandler(buffer -> {
ctx.request().bodyHandler(buffer -> {
// Create separate lists with filtered listeners
List<Listener> beforeListener = getFilteredListeners(listeners, HookTriggerType.BEFORE);
List<Listener> afterListener = getFilteredListeners(listeners, HookTriggerType.AFTER);

// Create handlers for before/after - cases
Handler<Void> afterHandler = installAfterHandler(request, buffer, afterListener);
Handler<Void> beforeHandler = installBeforeHandler(request, buffer, beforeListener, afterHandler);
Handler<Void> afterHandler = installAfterHandler(ctx, buffer, afterListener);
Handler<Void> beforeHandler = installBeforeHandler(ctx, buffer, beforeListener, afterHandler);

// call the listeners (before)
callListener(request, buffer, beforeListener, beforeHandler);
callListener(ctx, buffer, beforeListener, beforeHandler);
});
}

/**
* Calls the passed listeners and passes the given handler to the enqueued listener requests.
*
* @param request original request
* @param ctx original request context
* @param buffer buffer
* @param filteredListeners all listeners which should be called
* @param handler the handler, which should handle the requests
*/
private void callListener(final HttpServerRequest request, final Buffer buffer, final List<Listener> filteredListeners, final Handler<Void> handler) {
private void callListener(RoutingContext ctx, final Buffer buffer, final List<Listener> filteredListeners, final Handler<Void> handler) {
HttpServerRequest request = ctx.request();
for (Listener listener : filteredListeners) {
log.debug("Enqueue request matching {} {} with listener {}", request.method(), listener.getMonitoredUrl(), listener.getListener());

Expand Down Expand Up @@ -815,13 +818,13 @@ private void callListener(final HttpServerRequest request, final Buffer buffer,
* The handler calls all listener (after), so this requests happen AFTER the original
* request is performed.
*
* @param request original request
* @param ctx original request context
* @param buffer buffer
* @param afterListener list of listeners which should be called after the original request
* @return the after handler
*/
private Handler<Void> installAfterHandler(final HttpServerRequest request, final Buffer buffer, final List<Listener> afterListener) {
return event -> callListener(request, buffer, afterListener, null);
private Handler<Void> installAfterHandler(final RoutingContext ctx, final Buffer buffer, final List<Listener> afterListener) {
return event -> callListener(ctx, buffer, afterListener, null);
}

/**
Expand All @@ -830,13 +833,13 @@ private Handler<Void> installAfterHandler(final HttpServerRequest request, final
* The request happens BEFORE the original request is
* performed.
*
* @param request original request
* @param ctx original request context
* @param buffer buffer
* @param beforeListener list of listeners which should be called before the original request
* @param afterHandler the handler for listeners which have to be called after the original request
* @return the before handler
*/
private Handler<Void> installBeforeHandler(final HttpServerRequest request, final Buffer buffer, final List<Listener> beforeListener, final Handler<Void> afterHandler) {
private Handler<Void> installBeforeHandler(final RoutingContext ctx, final Buffer buffer, final List<Listener> beforeListener, final Handler<Void> afterHandler) {
return new Handler<>() {
private AtomicInteger currentCount = new AtomicInteger(0);
private boolean sent = false;
Expand All @@ -857,14 +860,14 @@ public void handle(Void event) {
* enqueueing through the listener and only for external
* requests.
*/
Route route = routeRepository.getRoute(request.uri());
Route route = routeRepository.getRoute(ctx.request().uri());

if (doMethodsMatch(route, request) && doHeadersMatch(route, request)) {
log.debug("Forward request (consumed) {}", request.uri());
route.forward(request, buffer, afterHandler);
if (doMethodsMatch(route, ctx) && doHeadersMatch(route, ctx)) {
log.debug("Forward request (consumed) {}", ctx.request().uri());
route.forward(ctx, buffer, afterHandler);
} else {
// mark the original request as hooked
request.headers().set(HOOKED_HEADER, "true");
ctx.request().headers().set(HOOKED_HEADER, "true");

/*
* self requests are only made for original
Expand All @@ -874,7 +877,7 @@ public void handle(Void event) {
* before calling the handle method of
* this class!
*/
createSelfRequest(request, buffer, afterHandler);
createSelfRequest(ctx.request(), buffer, afterHandler);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.HttpClient;
import io.vertx.core.http.HttpClientOptions;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.ext.web.RoutingContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.swisspush.gateleen.core.storage.ResourceStorage;
Expand Down Expand Up @@ -221,18 +221,18 @@ private void createHttpClient() {
* Handles the request (consumed) and forwards it
* to the hook specific destination.
*
* @param request - the original but already consumed request
* @param ctx - the original but already consumed request
* @param requestBody - saved buffer with the data of body from the original request
*/
public void forward(HttpServerRequest request, final Buffer requestBody, @Nullable final Handler<Void> afterHandler) {
public void forward(RoutingContext ctx, final Buffer requestBody, @Nullable final Handler<Void> afterHandler) {

// checking if the forwarder is for all methods
if (httpHook.getMethods().isEmpty()) {
forwarder.handle(request, requestBody, afterHandler);
forwarder.handle(ctx, requestBody, afterHandler);
} else {
// checking if the method from the request is handled by this forwarder
if (httpHook.getMethods().contains(request.method().name())) {
forwarder.handle(request, requestBody, afterHandler);
if (httpHook.getMethods().contains(ctx.request().method().name())) {
forwarder.handle(ctx, requestBody, afterHandler);
}
}
}
Expand All @@ -241,10 +241,10 @@ public void forward(HttpServerRequest request, final Buffer requestBody, @Nullab
* Handles the request and forwards it
* to the hook specific destination.
*
* @param request request
* @param ctx request context
*/
public void forward(HttpServerRequest request) {
forward(request, null, null);
public void forward(RoutingContext ctx) {
forward(ctx, null, null);
}

/**
Expand Down
Loading

0 comments on commit 20cd390

Please sign in to comment.