Skip to content

Commit

Permalink
Use existing context path in DefaultServerRequestBuilder
Browse files Browse the repository at this point in the history
Closes gh-28820
  • Loading branch information
poutsma committed Jul 14, 2022
1 parent bf63309 commit f145b53
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 6 deletions.
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2021 the original author or authors.
* Copyright 2002-2022 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.
Expand Down Expand Up @@ -75,6 +75,9 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder {

private URI uri;

@Nullable
private String contextPath;

private final HttpHeaders headers = new HttpHeaders();

private final MultiValueMap<String, HttpCookie> cookies = new LinkedMultiValueMap<>();
Expand All @@ -90,6 +93,7 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder {
this.exchange = other.exchange();
this.method = other.method();
this.uri = other.uri();
this.contextPath = other.requestPath().contextPath().value();
this.headers.addAll(other.headers().asHttpHeaders());
this.cookies.addAll(other.cookies());
this.attributes.putAll(other.attributes());
Expand All @@ -110,6 +114,12 @@ public ServerRequest.Builder uri(URI uri) {
return this;
}

@Override
public ServerRequest.Builder contextPath(@Nullable String contextPath) {
this.contextPath = contextPath;
return this;
}

@Override
public ServerRequest.Builder header(String headerName, String... headerValues) {
for (String headerValue : headerValues) {
Expand Down Expand Up @@ -177,7 +187,7 @@ public ServerRequest.Builder attributes(Consumer<Map<String, Object>> attributes
@Override
public ServerRequest build() {
ServerHttpRequest serverHttpRequest = new BuiltServerHttpRequest(this.exchange.getRequest().getId(),
this.method, this.uri, this.headers, this.cookies, this.body);
this.method, this.uri, this.contextPath, this.headers, this.cookies, this.body);
ServerWebExchange exchange = new DelegatingServerWebExchange(
serverHttpRequest, this.attributes, this.exchange, this.messageReaders);
return new DefaultServerRequest(exchange, this.messageReaders);
Expand All @@ -204,13 +214,13 @@ private static class BuiltServerHttpRequest implements ServerHttpRequest {

private final Flux<DataBuffer> body;

public BuiltServerHttpRequest(String id, HttpMethod method, URI uri, HttpHeaders headers,
MultiValueMap<String, HttpCookie> cookies, Flux<DataBuffer> body) {
public BuiltServerHttpRequest(String id, HttpMethod method, URI uri, @Nullable String contextPath,
HttpHeaders headers, MultiValueMap<String, HttpCookie> cookies, Flux<DataBuffer> body) {

this.id = id;
this.method = method;
this.uri = uri;
this.path = RequestPath.parse(uri, null);
this.path = RequestPath.parse(uri, contextPath);
this.headers = HttpHeaders.readOnlyHttpHeaders(headers);
this.cookies = unmodifiableCopy(cookies);
this.queryParams = parseQueryParams(uri);
Expand Down
Expand Up @@ -528,6 +528,14 @@ interface Builder {
*/
Builder uri(URI uri);

/**
* Set the context path of the request.
* @param contextPath the new context path
* @return this builder
* @since 5.3.23
*/
Builder contextPath(@Nullable String contextPath);

/**
* Add the given header value(s) under the given name.
* @param headerName the header name
Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2022 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.
Expand All @@ -16,6 +16,7 @@

package org.springframework.web.reactive.function.server;

import java.net.URI;
import java.nio.charset.StandardCharsets;

import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -56,8 +57,11 @@ public void from() {
.map(s -> s.getBytes(StandardCharsets.UTF_8))
.map(DefaultDataBufferFactory.sharedInstance::wrap);

URI uri = URI.create("https://example2.com/foo/bar");
ServerRequest result = ServerRequest.from(other)
.method(HttpMethod.HEAD)
.uri(uri)
.contextPath("/foo")
.headers(httpHeaders -> httpHeaders.set("foo", "baar"))
.cookies(cookies -> cookies.set("baz", ResponseCookie.from("baz", "quux").build()))
.attribute("attr2", "value2")
Expand All @@ -66,6 +70,9 @@ public void from() {
.build();

assertThat(result.method()).isEqualTo(HttpMethod.HEAD);
assertThat(result.uri()).isEqualTo(uri);
assertThat(result.requestPath().pathWithinApplication().value()).isEqualTo("/bar");
assertThat(result.requestPath().contextPath().value()).isEqualTo("/foo");
assertThat(result.headers().asHttpHeaders()).hasSize(1);
assertThat(result.headers().asHttpHeaders().getFirst("foo")).isEqualTo("baar");
assertThat(result.cookies()).hasSize(1);
Expand Down

0 comments on commit f145b53

Please sign in to comment.