Skip to content

Commit 6c412ad

Browse files
committed
CR
1 parent b8b0aa4 commit 6c412ad

File tree

5 files changed

+76
-96
lines changed

5 files changed

+76
-96
lines changed

http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/filter/ResponseFilterOnPreMatchExceptionHandlerTest.java

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,6 @@ static class FooException extends RuntimeException {
7070
@ServerFilter(MATCH_ALL_PATTERN)
7171
@Requires(property = "spec.name", value = SPEC_NAME)
7272
static class ErrorThrowingFilter {
73-
@PreMatching
74-
@RequestFilter
75-
public void onPreMatching(MutableHttpRequest<?> request) {
76-
throw new FooException();
77-
}
78-
79-
@ResponseFilter
80-
public void onResponseWithRouteMatch(RouteMatch<?> routeMatch, MutableHttpResponse<?> response) {
81-
response.body(response.getBody(String.class).get() + " XYZ");
82-
}
8373

8474
@ResponseFilter
8575
public void onResponse1(MutableHttpResponse<?> response) {
@@ -95,6 +85,28 @@ public void onResponse2(MutableHttpResponse<?> response) {
9585
public void onResponseWithRouteInfo(RouteInfo<?> routeInfo, MutableHttpResponse<?> response) {
9686
response.body(response.getBody(String.class).get() + " FOOBAR");
9787
}
88+
89+
@ResponseFilter
90+
public void onResponseWithRouteMatch(RouteMatch<?> routeMatch, MutableHttpResponse<?> response) {
91+
response.body(response.getBody(String.class).get() + " XYZ");
92+
}
93+
94+
@PreMatching
95+
@RequestFilter
96+
public void onPreMatching(MutableHttpRequest<?> request) {
97+
throw new FooException();
98+
}
99+
100+
@ResponseFilter
101+
public void onResponse3(MutableHttpResponse<?> response) {
102+
response.body(response.getBody(String.class).get() + " RESPONSE #4 FILTER");
103+
}
104+
105+
@ResponseFilter
106+
public void onResponse4(MutableHttpResponse<?> response) {
107+
response.body(response.getBody(String.class).get() + " RESPONSE #4 FILTER");
108+
}
109+
98110
}
99111

100112
@Requires(property = "spec.name", value = SPEC_NAME)

http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/filter/ResponseFilterOnPreMatchResponseHandlerTest.java

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,6 @@ public void preMatchTest() throws IOException {
6464
@ServerFilter(MATCH_ALL_PATTERN)
6565
@Requires(property = "spec.name", value = SPEC_NAME)
6666
static class ResponseProvidingFilter {
67-
@PreMatching
68-
@RequestFilter
69-
public HttpResponse<?> onPreMatching(MutableHttpRequest<?> request) {
70-
return HttpResponse.ok("PRE MATCH RESPONSE");
71-
}
72-
73-
@ResponseFilter
74-
public void onResponseWithRouteMatch(RouteMatch<?> routeMatch, MutableHttpResponse<?> response) {
75-
response.body(response.getBody(String.class).get() + " XYZ");
76-
}
7767

7868
@ResponseFilter
7969
public void onResponse1(MutableHttpResponse<?> response) {
@@ -85,10 +75,32 @@ public void onResponse2(MutableHttpResponse<?> response) {
8575
response.body(response.getBody(String.class).get() + " RESPONSE #2 FILTER");
8676
}
8777

78+
@ResponseFilter
79+
public void onResponseWithRouteMatch(RouteMatch<?> routeMatch, MutableHttpResponse<?> response) {
80+
response.body(response.getBody(String.class).get() + " XYZ");
81+
}
82+
8883
@ResponseFilter
8984
public void onResponseWithRouteInfo(RouteInfo<?> routeInfo, MutableHttpResponse<?> response) {
9085
response.body(response.getBody(String.class).get() + " FOOBAR");
9186
}
87+
88+
@PreMatching
89+
@RequestFilter
90+
public HttpResponse<?> onPreMatching(MutableHttpRequest<?> request) {
91+
return HttpResponse.ok("PRE MATCH RESPONSE");
92+
}
93+
94+
@ResponseFilter
95+
public void onResponse3(MutableHttpResponse<?> response) {
96+
response.body(response.getBody(String.class).get() + " RESPONSE #3 FILTER");
97+
}
98+
99+
@ResponseFilter
100+
public void onResponse4(MutableHttpResponse<?> response) {
101+
response.body(response.getBody(String.class).get() + " RESPONSE #4 FILTER");
102+
}
103+
92104
}
93105

94106
@Requires(property = "spec.name", value = SPEC_NAME)

http-server/src/main/java/io/micronaut/http/server/cors/CorsFilter.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -130,21 +130,22 @@ public boolean isEnabled(HttpRequest<?> request) {
130130
@Nullable
131131
@Internal
132132
public final HttpResponse<?> filterPreFlightRequest(HttpRequest<?> request) {
133-
if (!isEnabled(request) || !CorsUtil.isPreflightRequest(request)) {
134-
return null; // proceed
135-
}
136-
CorsOriginConfiguration corsOriginConfiguration = getAnyConfiguration(request).orElse(null);
137-
if (corsOriginConfiguration != null) {
138-
return handlePreflightRequest(request, corsOriginConfiguration);
133+
if (isEnabled(request) && CorsUtil.isPreflightRequest(request)) {
134+
CorsOriginConfiguration corsOriginConfiguration = getAnyConfiguration(request).orElse(null);
135+
if (corsOriginConfiguration != null) {
136+
return handlePreflightRequest(request, corsOriginConfiguration);
137+
}
139138
}
140-
return null;
139+
return null; // proceed
141140
}
142141

143142
@RequestFilter
144143
@Nullable
145144
@Internal
146145
public final HttpResponse<?> filterRequest(HttpRequest<?> request) {
147-
if (!isEnabled(request)) {
146+
String origin = request.getOrigin().orElse(null);
147+
if (origin == null) {
148+
LOG.trace("Http Header {} not present. Proceeding with the request.", HttpHeaders.ORIGIN);
148149
return null; // proceed
149150
}
150151
CorsOriginConfiguration corsOriginConfiguration = getConfiguration(request).orElse(null);
@@ -158,9 +159,7 @@ public final HttpResponse<?> filterRequest(HttpRequest<?> request) {
158159
return forbidden();
159160
}
160161
return null; // proceed
161-
}
162-
String origin = request.getOrigin().orElse(null);
163-
if (shouldDenyToPreventDriveByLocalhostAttack(origin, request)) {
162+
} else if (shouldDenyToPreventDriveByLocalhostAttack(origin, request)) {
164163
LOG.trace("The request specifies an origin different than localhost. To prevent drive-by-localhost attacks the request is forbidden");
165164
return forbidden();
166165
}
@@ -171,11 +170,11 @@ public final HttpResponse<?> filterRequest(HttpRequest<?> request) {
171170
@ResponseFilter
172171
@Internal
173172
public final void filterResponse(HttpRequest<?> request, MutableHttpResponse<?> response) {
174-
if (!isEnabled(request) || CorsUtil.isPreflightRequest(request)) {
175-
return; // proceed
176-
}
177173
CorsOriginConfiguration corsOriginConfiguration = getConfiguration(request).orElse(null);
178174
if (corsOriginConfiguration != null) {
175+
if (CorsUtil.isPreflightRequest(request)) {
176+
decorateResponseWithHeadersForPreflightRequest(request, response, corsOriginConfiguration);
177+
}
179178
decorateResponseWithHeaders(request, response, corsOriginConfiguration);
180179
}
181180
}

http/src/main/java/io/micronaut/http/filter/FilterRunner.java

Lines changed: 12 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,7 @@ public final ExecutionFlow<HttpResponse<?>> run(HttpRequest<?> request,
234234
} else {
235235
// Pre-matching filters plus route match resolver
236236
var f = new RouteMatchResolverHttpFilter();
237-
filtersToRun.add(0, f); // Response filter to resolve filters on error
238-
filtersToRun.add(f); // Request filter to resolve filters after preMatch filters
237+
filtersToRun.add(f);
239238
iterator = filtersToRun.listIterator();
240239
f.filterIterator = iterator;
241240
}
@@ -397,80 +396,33 @@ private ExecutionFlow<FilterContext> processFailureFilterException(FilterContext
397396
final class RouteMatchResolverHttpFilter implements InternalHttpFilter {
398397

399398
private ListIterator<InternalHttpFilter> filterIterator;
400-
private boolean executed = false;
401-
402-
@Override
403-
public boolean isFiltersResponse() {
404-
return true;
405-
}
406399

407400
@Override
408401
public boolean isFiltersRequest() {
409402
return true;
410403
}
411404

412-
@Override
413-
public ExecutionFlow<FilterContext> processResponseFilter(FilterContext context, Throwable exceptionToFilter) {
414-
if (!executed) {
415-
cleanupAllNext();
416-
addFoundFilters(context.request());
417-
moveIteratorToEnd();
418-
return ExecutionFlow.just(context);
419-
}
420-
return ExecutionFlow.just(context);
421-
}
422-
423405
@Override
424406
public ExecutionFlow<FilterContext> processRequestFilter(FilterContext context) {
425-
if (filterIterator.nextIndex() == 1) {
426-
return ExecutionFlow.just(context);
427-
}
428-
executed = true;
429407
HttpRequest<?> request = context.request();
430408
try {
431409
doRouteMatch(request);
432410
return ExecutionFlow.just(context);
433411
} catch (Throwable throwable) {
434412
return processFailurePropagateException(throwable, context);
435413
} finally {
436-
cleanupAllPrevious();
437-
addFoundFilters(request);
438-
moveIteratorToBeginning();
439-
}
440-
}
441-
442-
private void moveIteratorToBeginning() {
443-
while (filterIterator.hasPrevious()) {
444-
filterIterator.previous();
445-
}
446-
}
447-
448-
private void moveIteratorToEnd() {
449-
while (filterIterator.hasNext()) {
450-
filterIterator.next();
451-
}
452-
}
453-
454-
private void addFoundFilters(HttpRequest<?> request) {
455-
List<InternalHttpFilter> postFilters = findInternalFiltersAfterRouteMatch(request);
456-
for (InternalHttpFilter postFilter : postFilters) {
457-
filterIterator.add(postFilter);
458-
}
459-
}
460-
461-
private void cleanupAllNext() {
462-
filterIterator.remove();
463-
while (filterIterator.hasNext()) {
464-
filterIterator.next();
465-
filterIterator.remove();
466-
}
467-
}
468-
469-
private void cleanupAllPrevious() {
470-
filterIterator.remove();
471-
while (filterIterator.hasPrevious()) {
472-
filterIterator.previous();
473414
filterIterator.remove();
415+
while (filterIterator.hasPrevious()) {
416+
filterIterator.previous();
417+
filterIterator.remove();
418+
}
419+
List<InternalHttpFilter> postFilters = findInternalFiltersAfterRouteMatch(request);
420+
for (InternalHttpFilter postFilter : postFilters) {
421+
filterIterator.add(postFilter);
422+
}
423+
while (filterIterator.hasPrevious()) {
424+
filterIterator.previous();
425+
}
474426
}
475427
}
476428
}

router/src/main/java/io/micronaut/web/router/DefaultRouter.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.micronaut.http.MediaType;
2828
import io.micronaut.http.annotation.Filter;
2929
import io.micronaut.http.annotation.FilterMatcher;
30+
import io.micronaut.http.annotation.ResponseFilter;
3031
import io.micronaut.http.filter.FilterPatternStyle;
3132
import io.micronaut.http.filter.FilterRunner;
3233
import io.micronaut.http.filter.GenericHttpFilter;
@@ -134,13 +135,17 @@ public DefaultRouter(Collection<RouteBuilder> builders) {
134135
errorRoutes.add(routeInfo);
135136
}
136137
for (FilterRoute filterRoute : builder.getFilterRoutes()) {
137-
if (filterRoute.isPreMatching()) {
138+
if (filterRoute.isPreMatching() || filterRoute.getAnnotationMetadata().hasAnnotation(ResponseFilter.class)) {
138139
if (isMatchesAll(filterRoute)) {
139140
preMatchingAlwaysMatchesFilterRoutes.add(filterRoute);
140141
} else {
141142
preMatchingPreconditionFilterRoutes.add(filterRoute);
142143
}
143-
} else if (isMatchesAll(filterRoute)) {
144+
if (filterRoute.isPreMatching()) {
145+
continue;
146+
}
147+
}
148+
if (isMatchesAll(filterRoute)) {
144149
alwaysMatchesFilterRoutes.add(filterRoute);
145150
} else {
146151
preconditionFilterRoutes.add(filterRoute);

0 commit comments

Comments
 (0)