MockServerHttpRequest accepts custom HTTP method
Closes gh-25109
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2019 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -40,6 +40,7 @@ import org.springframework.http.MediaType;
|
|||||||
import org.springframework.http.server.reactive.AbstractServerHttpRequest;
|
import org.springframework.http.server.reactive.AbstractServerHttpRequest;
|
||||||
import org.springframework.http.server.reactive.SslInfo;
|
import org.springframework.http.server.reactive.SslInfo;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.LinkedMultiValueMap;
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
import org.springframework.util.MimeType;
|
import org.springframework.util.MimeType;
|
||||||
import org.springframework.util.MultiValueMap;
|
import org.springframework.util.MultiValueMap;
|
||||||
@@ -54,8 +55,12 @@ import org.springframework.web.util.UriComponentsBuilder;
|
|||||||
*/
|
*/
|
||||||
public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
||||||
|
|
||||||
|
@Nullable
|
||||||
private final HttpMethod httpMethod;
|
private final HttpMethod httpMethod;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private final String customHttpMethod;
|
||||||
|
|
||||||
private final MultiValueMap<String, HttpCookie> cookies;
|
private final MultiValueMap<String, HttpCookie> cookies;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -70,13 +75,15 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
private final Flux<DataBuffer> body;
|
private final Flux<DataBuffer> body;
|
||||||
|
|
||||||
|
|
||||||
private MockServerHttpRequest(HttpMethod httpMethod, URI uri, @Nullable String contextPath,
|
private MockServerHttpRequest(@Nullable HttpMethod httpMethod, @Nullable String customHttpMethod,
|
||||||
HttpHeaders headers, MultiValueMap<String, HttpCookie> cookies,
|
URI uri, @Nullable String contextPath, HttpHeaders headers, MultiValueMap<String, HttpCookie> cookies,
|
||||||
@Nullable InetSocketAddress remoteAddress, @Nullable InetSocketAddress localAddress,
|
@Nullable InetSocketAddress remoteAddress, @Nullable InetSocketAddress localAddress,
|
||||||
@Nullable SslInfo sslInfo, Publisher<? extends DataBuffer> body) {
|
@Nullable SslInfo sslInfo, Publisher<? extends DataBuffer> body) {
|
||||||
|
|
||||||
super(uri, contextPath, headers);
|
super(uri, contextPath, headers);
|
||||||
|
Assert.isTrue(httpMethod != null || customHttpMethod != null, "HTTP method must not be null");
|
||||||
this.httpMethod = httpMethod;
|
this.httpMethod = httpMethod;
|
||||||
|
this.customHttpMethod = customHttpMethod;
|
||||||
this.cookies = cookies;
|
this.cookies = cookies;
|
||||||
this.remoteAddress = remoteAddress;
|
this.remoteAddress = remoteAddress;
|
||||||
this.localAddress = localAddress;
|
this.localAddress = localAddress;
|
||||||
@@ -91,8 +98,9 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
public String getMethodValue() {
|
public String getMethodValue() {
|
||||||
return this.httpMethod.name();
|
return (this.httpMethod != null ? this.httpMethod.name() : this.customHttpMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -131,30 +139,6 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
|
|
||||||
// Static builder methods
|
// Static builder methods
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a builder with the given HTTP method and a {@link URI}.
|
|
||||||
* @param method the HTTP method (GET, POST, etc)
|
|
||||||
* @param url the URL
|
|
||||||
* @return the created builder
|
|
||||||
*/
|
|
||||||
public static BodyBuilder method(HttpMethod method, URI url) {
|
|
||||||
return new DefaultBodyBuilder(method, url);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Alternative to {@link #method(HttpMethod, URI)} that accepts a URI template.
|
|
||||||
* The given URI may contain query parameters, or those may be added later via
|
|
||||||
* {@link BaseBuilder#queryParam queryParam} builder methods.
|
|
||||||
* @param method the HTTP method (GET, POST, etc)
|
|
||||||
* @param urlTemplate the URL template
|
|
||||||
* @param vars variables to expand into the template
|
|
||||||
* @return the created builder
|
|
||||||
*/
|
|
||||||
public static BodyBuilder method(HttpMethod method, String urlTemplate, Object... vars) {
|
|
||||||
URI url = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(vars).encode().toUri();
|
|
||||||
return new DefaultBodyBuilder(method, url);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an HTTP GET builder with the given URI template. The given URI may
|
* Create an HTTP GET builder with the given URI template. The given URI may
|
||||||
* contain query parameters, or those may be added later via
|
* contain query parameters, or those may be added later via
|
||||||
@@ -228,6 +212,44 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
return method(HttpMethod.OPTIONS, urlTemplate, uriVars);
|
return method(HttpMethod.OPTIONS, urlTemplate, uriVars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a builder with the given HTTP method and a {@link URI}.
|
||||||
|
* @param method the HTTP method (GET, POST, etc)
|
||||||
|
* @param url the URL
|
||||||
|
* @return the created builder
|
||||||
|
*/
|
||||||
|
public static BodyBuilder method(HttpMethod method, URI url) {
|
||||||
|
return new DefaultBodyBuilder(method, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alternative to {@link #method(HttpMethod, URI)} that accepts a URI template.
|
||||||
|
* The given URI may contain query parameters, or those may be added later via
|
||||||
|
* {@link BaseBuilder#queryParam queryParam} builder methods.
|
||||||
|
* @param method the HTTP method (GET, POST, etc)
|
||||||
|
* @param urlTemplate the URL template
|
||||||
|
* @param vars variables to expand into the template
|
||||||
|
* @return the created builder
|
||||||
|
*/
|
||||||
|
public static BodyBuilder method(HttpMethod method, String urlTemplate, Object... vars) {
|
||||||
|
URI url = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(vars).encode().toUri();
|
||||||
|
return new DefaultBodyBuilder(method, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a builder with a raw HTTP method value that is outside the range
|
||||||
|
* of {@link HttpMethod} enum values.
|
||||||
|
* @param method the HTTP method value
|
||||||
|
* @param urlTemplate the URL template
|
||||||
|
* @param vars variables to expand into the template
|
||||||
|
* @return the created builder
|
||||||
|
* @since 5.2.7
|
||||||
|
*/
|
||||||
|
public static BodyBuilder method(String method, String urlTemplate, Object... vars) {
|
||||||
|
URI url = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(vars).encode().toUri();
|
||||||
|
return new DefaultBodyBuilder(method, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request builder exposing properties not related to the body.
|
* Request builder exposing properties not related to the body.
|
||||||
@@ -408,8 +430,12 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
private static final DataBufferFactory BUFFER_FACTORY = new DefaultDataBufferFactory();
|
private static final DataBufferFactory BUFFER_FACTORY = new DefaultDataBufferFactory();
|
||||||
|
|
||||||
|
|
||||||
|
@Nullable
|
||||||
private final HttpMethod method;
|
private final HttpMethod method;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private final String customMethod;
|
||||||
|
|
||||||
private final URI url;
|
private final URI url;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -431,8 +457,22 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
private SslInfo sslInfo;
|
private SslInfo sslInfo;
|
||||||
|
|
||||||
|
|
||||||
public DefaultBodyBuilder(HttpMethod method, URI url) {
|
DefaultBodyBuilder(HttpMethod method, URI url) {
|
||||||
this.method = method;
|
this.method = method;
|
||||||
|
this.customMethod = null;
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultBodyBuilder(String method, URI url) {
|
||||||
|
HttpMethod resolved = HttpMethod.resolve(method);
|
||||||
|
if (resolved != null) {
|
||||||
|
this.method = resolved;
|
||||||
|
this.customMethod = null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.method = null;
|
||||||
|
this.customMethod = method;
|
||||||
|
}
|
||||||
this.url = url;
|
this.url = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,7 +609,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
@Override
|
@Override
|
||||||
public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) {
|
public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) {
|
||||||
applyCookiesIfNecessary();
|
applyCookiesIfNecessary();
|
||||||
return new MockServerHttpRequest(this.method, getUrlToUse(), this.contextPath,
|
return new MockServerHttpRequest(this.method, this.customMethod, getUrlToUse(), this.contextPath,
|
||||||
this.headers, this.cookies, this.remoteAddress, this.localAddress, this.sslInfo, body);
|
this.headers, this.cookies, this.remoteAddress, this.localAddress, this.sslInfo, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2019 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -40,6 +40,7 @@ import org.springframework.http.MediaType;
|
|||||||
import org.springframework.http.server.reactive.AbstractServerHttpRequest;
|
import org.springframework.http.server.reactive.AbstractServerHttpRequest;
|
||||||
import org.springframework.http.server.reactive.SslInfo;
|
import org.springframework.http.server.reactive.SslInfo;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.LinkedMultiValueMap;
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
import org.springframework.util.MimeType;
|
import org.springframework.util.MimeType;
|
||||||
import org.springframework.util.MultiValueMap;
|
import org.springframework.util.MultiValueMap;
|
||||||
@@ -54,8 +55,12 @@ import org.springframework.web.util.UriComponentsBuilder;
|
|||||||
*/
|
*/
|
||||||
public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
||||||
|
|
||||||
|
@Nullable
|
||||||
private final HttpMethod httpMethod;
|
private final HttpMethod httpMethod;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private final String customHttpMethod;
|
||||||
|
|
||||||
private final MultiValueMap<String, HttpCookie> cookies;
|
private final MultiValueMap<String, HttpCookie> cookies;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -70,13 +75,15 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
private final Flux<DataBuffer> body;
|
private final Flux<DataBuffer> body;
|
||||||
|
|
||||||
|
|
||||||
private MockServerHttpRequest(HttpMethod httpMethod, URI uri, @Nullable String contextPath,
|
private MockServerHttpRequest(@Nullable HttpMethod httpMethod, @Nullable String customHttpMethod,
|
||||||
HttpHeaders headers, MultiValueMap<String, HttpCookie> cookies,
|
URI uri, @Nullable String contextPath, HttpHeaders headers, MultiValueMap<String, HttpCookie> cookies,
|
||||||
@Nullable InetSocketAddress remoteAddress, @Nullable InetSocketAddress localAddress,
|
@Nullable InetSocketAddress remoteAddress, @Nullable InetSocketAddress localAddress,
|
||||||
@Nullable SslInfo sslInfo, Publisher<? extends DataBuffer> body) {
|
@Nullable SslInfo sslInfo, Publisher<? extends DataBuffer> body) {
|
||||||
|
|
||||||
super(uri, contextPath, headers);
|
super(uri, contextPath, headers);
|
||||||
|
Assert.isTrue(httpMethod != null || customHttpMethod != null, "HTTP method must not be null");
|
||||||
this.httpMethod = httpMethod;
|
this.httpMethod = httpMethod;
|
||||||
|
this.customHttpMethod = customHttpMethod;
|
||||||
this.cookies = cookies;
|
this.cookies = cookies;
|
||||||
this.remoteAddress = remoteAddress;
|
this.remoteAddress = remoteAddress;
|
||||||
this.localAddress = localAddress;
|
this.localAddress = localAddress;
|
||||||
@@ -91,8 +98,9 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
public String getMethodValue() {
|
public String getMethodValue() {
|
||||||
return this.httpMethod.name();
|
return (this.httpMethod != null ? this.httpMethod.name() : this.customHttpMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -131,30 +139,6 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
|
|
||||||
// Static builder methods
|
// Static builder methods
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a builder with the given HTTP method and a {@link URI}.
|
|
||||||
* @param method the HTTP method (GET, POST, etc)
|
|
||||||
* @param url the URL
|
|
||||||
* @return the created builder
|
|
||||||
*/
|
|
||||||
public static BodyBuilder method(HttpMethod method, URI url) {
|
|
||||||
return new DefaultBodyBuilder(method, url);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Alternative to {@link #method(HttpMethod, URI)} that accepts a URI template.
|
|
||||||
* The given URI may contain query parameters, or those may be added later via
|
|
||||||
* {@link BaseBuilder#queryParam queryParam} builder methods.
|
|
||||||
* @param method the HTTP method (GET, POST, etc)
|
|
||||||
* @param urlTemplate the URL template
|
|
||||||
* @param vars variables to expand into the template
|
|
||||||
* @return the created builder
|
|
||||||
*/
|
|
||||||
public static BodyBuilder method(HttpMethod method, String urlTemplate, Object... vars) {
|
|
||||||
URI url = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(vars).encode().toUri();
|
|
||||||
return new DefaultBodyBuilder(method, url);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an HTTP GET builder with the given URI template. The given URI may
|
* Create an HTTP GET builder with the given URI template. The given URI may
|
||||||
* contain query parameters, or those may be added later via
|
* contain query parameters, or those may be added later via
|
||||||
@@ -228,6 +212,44 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
return method(HttpMethod.OPTIONS, urlTemplate, uriVars);
|
return method(HttpMethod.OPTIONS, urlTemplate, uriVars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a builder with the given HTTP method and a {@link URI}.
|
||||||
|
* @param method the HTTP method (GET, POST, etc)
|
||||||
|
* @param url the URL
|
||||||
|
* @return the created builder
|
||||||
|
*/
|
||||||
|
public static BodyBuilder method(HttpMethod method, URI url) {
|
||||||
|
return new DefaultBodyBuilder(method, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alternative to {@link #method(HttpMethod, URI)} that accepts a URI template.
|
||||||
|
* The given URI may contain query parameters, or those may be added later via
|
||||||
|
* {@link BaseBuilder#queryParam queryParam} builder methods.
|
||||||
|
* @param method the HTTP method (GET, POST, etc)
|
||||||
|
* @param urlTemplate the URL template
|
||||||
|
* @param vars variables to expand into the template
|
||||||
|
* @return the created builder
|
||||||
|
*/
|
||||||
|
public static BodyBuilder method(HttpMethod method, String urlTemplate, Object... vars) {
|
||||||
|
URI url = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(vars).encode().toUri();
|
||||||
|
return new DefaultBodyBuilder(method, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a builder with a raw HTTP method value that is outside the range
|
||||||
|
* of {@link HttpMethod} enum values.
|
||||||
|
* @param method the HTTP method value
|
||||||
|
* @param urlTemplate the URL template
|
||||||
|
* @param vars variables to expand into the template
|
||||||
|
* @return the created builder
|
||||||
|
* @since 5.2.7
|
||||||
|
*/
|
||||||
|
public static BodyBuilder method(String method, String urlTemplate, Object... vars) {
|
||||||
|
URI url = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(vars).encode().toUri();
|
||||||
|
return new DefaultBodyBuilder(method, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request builder exposing properties not related to the body.
|
* Request builder exposing properties not related to the body.
|
||||||
@@ -408,8 +430,12 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
private static final DataBufferFactory BUFFER_FACTORY = new DefaultDataBufferFactory();
|
private static final DataBufferFactory BUFFER_FACTORY = new DefaultDataBufferFactory();
|
||||||
|
|
||||||
|
|
||||||
|
@Nullable
|
||||||
private final HttpMethod method;
|
private final HttpMethod method;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private final String customMethod;
|
||||||
|
|
||||||
private final URI url;
|
private final URI url;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -431,8 +457,22 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
private SslInfo sslInfo;
|
private SslInfo sslInfo;
|
||||||
|
|
||||||
|
|
||||||
public DefaultBodyBuilder(HttpMethod method, URI url) {
|
DefaultBodyBuilder(HttpMethod method, URI url) {
|
||||||
this.method = method;
|
this.method = method;
|
||||||
|
this.customMethod = null;
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultBodyBuilder(String method, URI url) {
|
||||||
|
HttpMethod resolved = HttpMethod.resolve(method);
|
||||||
|
if (resolved != null) {
|
||||||
|
this.method = resolved;
|
||||||
|
this.customMethod = null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.method = null;
|
||||||
|
this.customMethod = method;
|
||||||
|
}
|
||||||
this.url = url;
|
this.url = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,7 +609,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
@Override
|
@Override
|
||||||
public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) {
|
public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) {
|
||||||
applyCookiesIfNecessary();
|
applyCookiesIfNecessary();
|
||||||
return new MockServerHttpRequest(this.method, getUrlToUse(), this.contextPath,
|
return new MockServerHttpRequest(this.method, this.customMethod, getUrlToUse(), this.contextPath,
|
||||||
this.headers, this.cookies, this.remoteAddress, this.localAddress, this.sslInfo, body);
|
this.headers, this.cookies, this.remoteAddress, this.localAddress, this.sslInfo, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user