Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow testing with any value for Content-Type and Accept header in MockHttpServletRequestBuilder #2079

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -279,7 +279,8 @@ public MockHttpServletRequestBuilder contentType(MediaType contentType) {
* @since 4.1.2
*/
public MockHttpServletRequestBuilder contentType(String contentType) {
this.contentType = MediaType.parseMediaType(contentType).toString();
Assert.notNull(contentType, "'contentType' must not be null");
this.contentType = contentType;
return this;
}

Expand All @@ -299,11 +300,9 @@ public MockHttpServletRequestBuilder accept(MediaType... mediaTypes) {
*/
public MockHttpServletRequestBuilder accept(String... mediaTypes) {
Assert.notEmpty(mediaTypes, "'mediaTypes' must not be empty");
List<MediaType> result = new ArrayList<>(mediaTypes.length);
for (String mediaType : mediaTypes) {
result.add(MediaType.parseMediaType(mediaType));
}
this.headers.set("Accept", MediaType.toString(result));
List<String> result = new ArrayList<>(mediaTypes.length);
result.addAll(Arrays.asList(mediaTypes));
this.headers.set("Accept", String.join(", ", result));
return this;
}

Expand Down Expand Up @@ -639,7 +638,7 @@ public final MockHttpServletRequest buildRequest(ServletContext servletContext)

if (this.content != null && this.content.length > 0) {
String requestContentType = request.getContentType();
if (requestContentType != null) {
if (requestContentType != null && isValidContentType(requestContentType)) {
MediaType mediaType = MediaType.parseMediaType(requestContentType);
if (MediaType.APPLICATION_FORM_URLENCODED.includes(mediaType)) {
addRequestParams(request, parseFormData(mediaType));
Expand Down Expand Up @@ -669,6 +668,26 @@ public final MockHttpServletRequest buildRequest(ServletContext servletContext)
return request;
}

/**
* Some validation checks to find out if processing of a string value make sense.
*/
private boolean isValidContentType(String mimeType) {
if (!StringUtils.hasLength(mimeType)) {
return false;
}

int index = mimeType.indexOf(';');
String fullType = (index >= 0 ? mimeType.substring(0, index) : mimeType).trim();
if (fullType.isEmpty()) {
return false;
}
int subIndex = fullType.indexOf('/');
if (subIndex == -1) {
return false;
}
return subIndex != fullType.length() - 1;
}

/**
* Create a new {@link MockHttpServletRequest} based on the supplied
* {@code ServletContext}.
Expand Down
Expand Up @@ -27,6 +27,8 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;

Expand Down Expand Up @@ -295,6 +297,21 @@ public void acceptHeader() {
assertEquals("application/xml", result.get(1).toString());
}

@Test
public void anyAcceptMultipleContentTypeViaStringArray() {
this.builder.accept("any", "any2");

MockHttpServletRequest request = this.builder.buildRequest(this.servletContext);
List<String> accept = Collections.list(request.getHeaders("Accept"));
List<String> result = Stream.of(accept.get(0).split(","))
.map(String::trim)
.collect(Collectors.toList());

assertEquals("any", result.get(0));
assertEquals(2, result.size());
assertEquals("any2", result.get(1));
}

@Test
public void contentType() {
this.builder.contentType(MediaType.TEXT_HTML);
Expand All @@ -321,6 +338,19 @@ public void contentTypeViaString() {
assertEquals("text/html", contentTypes.get(0));
}

@Test
public void anyContentTypeViaString() {
this.builder.contentType("any");

MockHttpServletRequest request = this.builder.buildRequest(this.servletContext);
String contentType = request.getContentType();
List<String> contentTypes = Collections.list(request.getHeaders("Content-Type"));

assertEquals("any", contentType);
assertEquals(1, contentTypes.size());
assertEquals("any", contentTypes.get(0));
}

@Test // SPR-11308
public void contentTypeViaHeader() {
this.builder.header("Content-Type", MediaType.TEXT_HTML_VALUE);
Expand All @@ -330,6 +360,16 @@ public void contentTypeViaHeader() {
assertEquals("text/html", contentType);
}

@Test // SPR-17643
public void invalidContentTypeViaHeader() {
this.builder.header("Content-Type", "yaml");
this.builder.content("some content");
MockHttpServletRequest request = this.builder.buildRequest(this.servletContext);
String contentType = request.getContentType();

assertEquals("yaml", contentType);
}

@Test // SPR-11308
public void contentTypeViaMultipleHeaderValues() {
this.builder.header("Content-Type", MediaType.TEXT_HTML_VALUE, MediaType.ALL_VALUE);
Expand Down