Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .mvn/maven.config
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
-Djspecify.enabled=true
-P spring
1 change: 0 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<jspecify.enabled>true</jspecify.enabled>
<bucket4j.version>8.15.0</bucket4j.version>
<blockhound.version>1.0.8.RELEASE</blockhound.version>
<java.version>17</java.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,12 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Mono;

Expand Down Expand Up @@ -121,19 +123,19 @@ public class ProxyExchange<T> {

private HttpMethod httpMethod;

private URI uri;
private @Nullable URI uri;

private WebClient rest;

private Publisher<Object> body;
private @Nullable Publisher<Object> body;

private boolean hasBody = false;

private ServerWebExchange exchange;

private BindingContext bindingContext;

private Set<String> excluded;
private @Nullable Set<String> excluded;

private HttpHeaders headers = new HttpHeaders();

Expand Down Expand Up @@ -244,6 +246,7 @@ public String path(String prefix) {
}

public Mono<ResponseEntity<T>> get() {
Objects.requireNonNull(uri, "URI must not be null");
RequestEntity<?> requestEntity = headers((BodyBuilder) RequestEntity.get(uri)).build();
return exchange(requestEntity);
}
Expand All @@ -253,6 +256,7 @@ public <S> Mono<ResponseEntity<S>> get(Function<ResponseEntity<T>, ResponseEntit
}

public Mono<ResponseEntity<T>> head() {
Objects.requireNonNull(uri, "URI must not be null");
RequestEntity<?> requestEntity = headers((BodyBuilder) RequestEntity.head(uri)).build();
return exchange(requestEntity);
}
Expand All @@ -262,6 +266,7 @@ public <S> Mono<ResponseEntity<S>> head(Function<ResponseEntity<T>, ResponseEnti
}

public Mono<ResponseEntity<T>> options() {
Objects.requireNonNull(uri, "URI must not be null");
RequestEntity<?> requestEntity = headers((BodyBuilder) RequestEntity.options(uri)).build();
return exchange(requestEntity);
}
Expand All @@ -271,25 +276,30 @@ public <S> Mono<ResponseEntity<S>> options(Function<ResponseEntity<T>, ResponseE
}

public Mono<ResponseEntity<T>> post() {
RequestEntity<Object> requestEntity = headers(RequestEntity.post(uri)).body(body());
return exchange(requestEntity);
return doExchange(RequestEntity::post);
}

public <S> Mono<ResponseEntity<S>> post(Function<ResponseEntity<T>, ResponseEntity<S>> converter) {
return post().map(converter::apply);
}

public Mono<ResponseEntity<T>> delete() {
RequestEntity<Object> requestEntity = headers((BodyBuilder) RequestEntity.delete(uri)).body(body());
return exchange(requestEntity);
return doExchange(uri -> (BodyBuilder) RequestEntity.delete(uri));
}

public <S> Mono<ResponseEntity<S>> delete(Function<ResponseEntity<T>, ResponseEntity<S>> converter) {
return delete().map(converter::apply);
}

public Mono<ResponseEntity<T>> put() {
RequestEntity<Object> requestEntity = headers(RequestEntity.put(uri)).body(body());
return doExchange(RequestEntity::put);
}

private Mono<ResponseEntity<T>> doExchange(Function<URI, RequestEntity.BodyBuilder> getBodyBuilder) {
Objects.requireNonNull(uri, "URI must not be null");
BodyBuilder bodyBuilder = headers(getBodyBuilder.apply(uri));
Publisher<?> body = body();
RequestEntity<?> requestEntity = body != null ? bodyBuilder.body(body) : bodyBuilder.build();
return exchange(requestEntity);
}

Expand All @@ -298,8 +308,7 @@ public <S> Mono<ResponseEntity<S>> put(Function<ResponseEntity<T>, ResponseEntit
}

public Mono<ResponseEntity<T>> patch() {
RequestEntity<Object> requestEntity = headers(RequestEntity.patch(uri)).body(body());
return exchange(requestEntity);
return doExchange(RequestEntity::patch);
}

public <S> Mono<ResponseEntity<S>> patch(Function<ResponseEntity<T>, ResponseEntity<S>> converter) {
Expand Down Expand Up @@ -360,6 +369,7 @@ else if (httpMethod.equals(HttpMethod.PATCH)) {

private Mono<ResponseEntity<T>> exchange(RequestEntity<?> requestEntity) {
Type type = this.responseType;
Objects.requireNonNull(requestEntity.getMethod(), "Method must not be null");
RequestBodySpec builder = rest.method(requestEntity.getMethod())
.uri(requestEntity.getUrl())
.headers(headers -> addHeaders(headers, requestEntity.getHeaders()));
Expand Down Expand Up @@ -388,9 +398,12 @@ else if (requestEntity.getBody() != null) {

private void addHeaders(HttpHeaders headers, HttpHeaders toAdd) {
Set<String> filteredKeys = filterHeaderKeys(toAdd);
filteredKeys.stream()
.filter(key -> !headers.containsHeader(key))
.forEach(header -> headers.addAll(header, toAdd.get(header)));
filteredKeys.stream().filter(key -> !headers.containsHeader(key)).forEach(header -> {
java.util.List<String> headerValues = toAdd.get(header);
if (headerValues != null) {
headers.addAll(header, headerValues);
}
});
}

private Set<String> filterHeaderKeys(HttpHeaders headers) {
Expand All @@ -404,7 +417,10 @@ private Set<String> filterHeaderKeys(HttpHeaders headers) {
private BodyBuilder headers(BodyBuilder builder) {
proxy();
for (String name : filterHeaderKeys(headers)) {
builder.header(name, headers.get(name).toArray(new String[0]));
java.util.List<String> headerValues = headers.get(name);
if (headerValues != null) {
builder.header(name, headerValues.toArray(new String[0]));
}
}
return builder;
}
Expand Down Expand Up @@ -443,7 +459,7 @@ private void appendForwarded(URI uri) {
headers.set("forwarded", forwarded);
}

private String forwarded(URI uri, String hostHeader) {
private String forwarded(URI uri, @Nullable String hostHeader) {
if (StringUtils.hasText(hostHeader)) {
return "host=" + hostHeader;
}
Expand All @@ -453,7 +469,7 @@ private String forwarded(URI uri, String hostHeader) {
return String.format("host=%s;proto=%s", uri.getHost(), uri.getScheme());
}

private Publisher<?> body() {
private @Nullable Publisher<?> body() {
Publisher<?> body = this.body;
if (body != null) {
return body;
Expand All @@ -469,11 +485,14 @@ private Publisher<?> body() {
* that it would have been for a <code>@RequestBody</code>.
* @return the request body
*/
private Mono<Object> getRequestBody() {
private @Nullable Mono<Object> getRequestBody() {
for (String key : bindingContext.getModel().asMap().keySet()) {
if (key.startsWith(BindingResult.MODEL_KEY_PREFIX)) {
BindingResult result = (BindingResult) bindingContext.getModel().asMap().get(key);
return Mono.just(result.getTarget());
Object target = result.getTarget();
if (target != null) {
return Mono.just(target);
}
}
}
return null;
Expand All @@ -490,7 +509,7 @@ public Publisher<Object> body(@RequestBody Publisher<Object> body) {
protected static class BodySender {

@ResponseBody
public Publisher<Object> body() {
public @Nullable Publisher<Object> body() {
return null;
}

Expand Down
Loading