diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpRequest.java index c14399a6be..9c9fea5e3c 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,11 @@ public abstract class AbstractServerHttpRequest implements ServerHttpRequest { private final URI uri; - private final RequestPath path; + @Nullable + private final String contextPath; + + @Nullable + private RequestPath path; private final HttpHeaders headers; @@ -92,7 +96,7 @@ public abstract class AbstractServerHttpRequest implements ServerHttpRequest { this.method = method; this.uri = uri; - this.path = RequestPath.parse(uri, contextPath); + this.contextPath = contextPath; this.headers = HttpHeaders.readOnlyHttpHeaders(headers); } @@ -140,6 +144,9 @@ public abstract class AbstractServerHttpRequest implements ServerHttpRequest { @Override public RequestPath getPath() { + if (this.path == null) { + this.path = RequestPath.parse(this.uri, this.contextPath); + } return this.path; } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestTests.java index 73d7559e64..ddf4400793 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestTests.java @@ -198,7 +198,7 @@ class ServerHttpRequestTests { void mutateContextPathWithoutUpdatingPathShouldFail() throws Exception { ServerHttpRequest request = createRequest("/context/path", "/context"); - assertThatThrownBy(() -> request.mutate().contextPath("/fail").build()) + assertThatThrownBy(() -> request.mutate().contextPath("/fail").build().getPath()) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Invalid contextPath '/fail': must match the start of requestPath: '/context/path'"); }