MockPart backport
Issue: SPR-15854
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
* Copyright 2002-2017 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.
|
||||
@@ -23,69 +23,48 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import javax.servlet.http.Part;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.FileCopyUtils;
|
||||
|
||||
/**
|
||||
* Mock implementation of the {@link Part} interface.
|
||||
* Mock implementation of {@code javax.servlet.http.Part}.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @author Juergen Hoeller
|
||||
* @since 3.1
|
||||
* @see MockHttpServletRequest
|
||||
* @see MockHttpServletRequest#addPart
|
||||
* @see MockMultipartFile
|
||||
*/
|
||||
public class MockPart implements Part {
|
||||
|
||||
private static final String CONTENT_TYPE = "Content-Type";
|
||||
|
||||
private final String name;
|
||||
|
||||
private String contentType;
|
||||
private final String filename;
|
||||
|
||||
private final byte[] content;
|
||||
|
||||
private final HttpHeaders headers = new HttpHeaders();
|
||||
|
||||
|
||||
/**
|
||||
* Create a new MockPart with the given content.
|
||||
* @param name the name of the part
|
||||
* @param content the content for the part
|
||||
* Constructor for a part with byte[] content only.
|
||||
* @see #getHeaders()
|
||||
*/
|
||||
public MockPart(String name, byte[] content) {
|
||||
this(name, "", content);
|
||||
this(name, null, content);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new MockPart with the given content.
|
||||
* @param name the name of the part
|
||||
* @param contentStream the content of the part as stream
|
||||
* @throws IOException if reading from the stream failed
|
||||
* Constructor for a part with a filename and byte[] content.
|
||||
* @see #getHeaders()
|
||||
*/
|
||||
public MockPart(String name, InputStream contentStream) throws IOException {
|
||||
this(name, "", FileCopyUtils.copyToByteArray(contentStream));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new MockPart with the given content.
|
||||
* @param name the name of the file
|
||||
* @param contentType the content type (if known)
|
||||
* @param content the content of the file
|
||||
*/
|
||||
public MockPart(String name, String contentType, byte[] content) {
|
||||
public MockPart(String name, String filename, byte[] content) {
|
||||
Assert.hasLength(name, "Name must not be null");
|
||||
this.name = name;
|
||||
this.contentType = contentType;
|
||||
this.filename = filename;
|
||||
this.content = (content != null ? content : new byte[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new MockPart with the given content.
|
||||
* @param name the name of the file
|
||||
* @param contentType the content type (if known)
|
||||
* @param contentStream the content of the part as stream
|
||||
* @throws IOException if reading from the stream failed
|
||||
*/
|
||||
public MockPart(String name, String contentType, InputStream contentStream)
|
||||
throws IOException {
|
||||
|
||||
this(name, contentType, FileCopyUtils.copyToByteArray(contentStream));
|
||||
this.headers.setContentDispositionFormData(name, filename);
|
||||
}
|
||||
|
||||
|
||||
@@ -94,9 +73,15 @@ public class MockPart implements Part {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
// Servlet 3.1
|
||||
public String getSubmittedFileName() {
|
||||
return this.filename;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContentType() {
|
||||
return this.contentType;
|
||||
MediaType contentType = this.headers.getContentType();
|
||||
return (contentType != null ? contentType.toString() : null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -109,31 +94,6 @@ public class MockPart implements Part {
|
||||
return new ByteArrayInputStream(this.content);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeader(String name) {
|
||||
if (CONTENT_TYPE.equalsIgnoreCase(name)) {
|
||||
return this.contentType;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> getHeaders(String name) {
|
||||
if (CONTENT_TYPE.equalsIgnoreCase(name)) {
|
||||
return Collections.singleton(this.contentType);
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> getHeaderNames() {
|
||||
return Collections.singleton(CONTENT_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(String fileName) throws IOException {
|
||||
throw new UnsupportedOperationException();
|
||||
@@ -144,4 +104,28 @@ public class MockPart implements Part {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeader(String name) {
|
||||
return this.headers.getFirst(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> getHeaders(String name) {
|
||||
Collection<String> headerValues = this.headers.get(name);
|
||||
return (headerValues != null ? headerValues : Collections.<String>emptyList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> getHeaderNames() {
|
||||
return this.headers.keySet();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the {@link HttpHeaders} backing header related accessor methods,
|
||||
* allowing for populating selected header entries.
|
||||
*/
|
||||
public final HttpHeaders getHeaders() {
|
||||
return this.headers;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user