Skip to content

Commit ce96daa

Browse files
authored
bugfix: possible NullPointerException (#71)
1 parent d34f291 commit ce96daa

File tree

7 files changed

+50
-4
lines changed

7 files changed

+50
-4
lines changed

spring-boot-starter/spring-boot-starter-web/src/main/java/com/getyourguide/openapi/validation/filter/OpenApiValidationFilter.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
3030
var requestMetaData = metaDataFactory.buildRequestMetaData(request);
3131
request.setAttribute(ATTRIBUTE_REQUEST_META_DATA, requestMetaData);
3232
if (!validator.isReady() || !trafficSelector.shouldRequestBeValidated(requestMetaData)) {
33-
request.setAttribute(ATTRIBUTE_SKIP_VALIDATION, true);
3433
request.setAttribute(ATTRIBUTE_SKIP_VALIDATION, true);
3534
filterChain.doFilter(request, response);
3635
return;

spring-boot-starter/spring-boot-starter-web/src/main/java/com/getyourguide/openapi/validation/filter/OpenApiValidationInterceptor.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void afterCompletion(
9292
}
9393

9494
private boolean shouldSkipValidation(HttpServletRequest request) {
95-
return request.getAttribute(OpenApiValidationFilter.ATTRIBUTE_SKIP_VALIDATION) != null;
95+
return request == null || request.getAttribute(OpenApiValidationFilter.ATTRIBUTE_SKIP_VALIDATION) != null;
9696
}
9797

9898
private void validateResponse(HttpServletRequest request, HttpServletResponse response) {
@@ -106,11 +106,10 @@ private void validateResponse(
106106
) {
107107
var requestMetaData = getRequestMetaData(request);
108108
var responseMetaData = metaDataFactory.buildResponseMetaData(response, exception);
109-
var requestToUse = contentCachingWrapperFactory.getCachingRequest(request);
110109
var responseToUse = contentCachingWrapperFactory.getCachingResponse(response);
111110
if (responseToUse != null) {
112111
var violations = validateResponse(
113-
requestToUse,
112+
request,
114113
responseToUse,
115114
requestMetaData,
116115
responseMetaData,

spring-boot-starter/spring-boot-starter-web/src/test/java/com/getyourguide/openapi/validation/integration/OpenApiValidationIntegrationTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,18 @@ public void whenTestOptionsCallThenShouldNotValidate() throws Exception {
123123
assertEquals(0, openApiViolationLogger.getViolations().size());
124124
}
125125

126+
@Test
127+
public void whenTestNoBodyThenShouldReturnSuccessAndNoViolation() throws Exception {
128+
mockMvc.perform(post("/test/no-body"))
129+
.andExpectAll(
130+
status().isNoContent(),
131+
content().string(Matchers.blankOrNullString())
132+
);
133+
Thread.sleep(100);
134+
135+
assertEquals(0, openApiViolationLogger.getViolations().size());
136+
}
137+
126138
@Nullable
127139
private OpenApiViolation getViolationByRule(List<OpenApiViolation> violations, String rule) {
128140
return violations.stream()

spring-boot-starter/spring-boot-starter-web/src/test/java/com/getyourguide/openapi/validation/integration/controller/DefaultRestController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,9 @@ public ResponseEntity<TestResponse> postTest(PostTestRequest postTestRequest) {
3434
}
3535
return ResponseEntity.noContent().build();
3636
}
37+
38+
@Override
39+
public ResponseEntity<TestResponse> postTestNoBody() {
40+
return ResponseEntity.noContent().build();
41+
}
3742
}

spring-boot-starter/spring-boot-starter-webflux/src/test/java/com/getyourguide/openapi/validation/integration/OpenApiValidationIntegrationTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,19 @@ public void whenTestOptionsCallThenShouldNotValidate() throws Exception {
134134
assertEquals(0, openApiViolationLogger.getViolations().size());
135135
}
136136

137+
@Test
138+
public void whenTestNoBodyThenShouldReturnSuccessAndNoViolation() throws Exception {
139+
webTestClient
140+
.post().uri("/test/no-body")
141+
.accept(MediaType.APPLICATION_JSON)
142+
.exchange()
143+
.expectStatus().isNoContent()
144+
.expectBody().isEmpty();
145+
Thread.sleep(100);
146+
147+
assertEquals(0, openApiViolationLogger.getViolations().size());
148+
}
149+
137150
@Nullable
138151
private OpenApiViolation getViolationByRule(List<OpenApiViolation> violations, String rule) {
139152
return violations.stream()

spring-boot-starter/spring-boot-starter-webflux/src/test/java/com/getyourguide/openapi/validation/integration/controller/DefaultRestController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,9 @@ public Mono<ResponseEntity<TestResponse>> postTest(
4343
return Mono.just(ResponseEntity.noContent().build());
4444
});
4545
}
46+
47+
@Override
48+
public Mono<ResponseEntity<TestResponse>> postTestNoBody(ServerWebExchange exchange) {
49+
return Mono.just(ResponseEntity.noContent().build());
50+
}
4651
}

test/openapi.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,19 @@ paths:
7878
"$ref": "#/components/schemas/TestResponse"
7979
'204':
8080
description: Successful response without content
81+
"/test/no-body":
82+
post:
83+
description: Post test without request/response body
84+
operationId: postTestNoBody
85+
responses:
86+
'200':
87+
description: Successful response
88+
content:
89+
application/json:
90+
schema:
91+
"$ref": "#/components/schemas/TestResponse"
92+
'204':
93+
description: Successful response without content
8194
components:
8295
schemas:
8396
TestResponse:

0 commit comments

Comments
 (0)