diff --git a/karate-mock-servlet/src/main/java/com/intuit/karate/mock/servlet/MockMultiPart.java b/karate-mock-servlet/src/main/java/com/intuit/karate/mock/servlet/MockMultiPart.java index 5a5885ac39..dc59e37d82 100644 --- a/karate-mock-servlet/src/main/java/com/intuit/karate/mock/servlet/MockMultiPart.java +++ b/karate-mock-servlet/src/main/java/com/intuit/karate/mock/servlet/MockMultiPart.java @@ -41,88 +41,92 @@ * @author pthomas3 */ public class MockMultiPart implements Part { - - private final MultiPartItem item; - private final byte[] bytes; - private final Map headers; - private static final String CONTENT_TYPE = "content-type"; - private static final String CONTENT_DISPOSITION = "content-disposition"; - - public MockMultiPart(MultiPartItem item) { - this.item = item; - ScriptValue sv = item.getValue(); - if (sv.isNull()) { - bytes = new byte[0]; - } else { - String temp = sv.getAsString(); - bytes = temp.getBytes(); - } - headers = new HashMap<>(2); - String ct = item.getContentType(); - if (ct == null) { - ct = HttpUtils.getContentType(sv); - } - headers.put(CONTENT_TYPE, ct); - String disposition = "form-data"; - String filename = item.getFilename(); - if (filename != null) { - disposition = disposition + "; filename=\"" + filename + "\""; - } - disposition = disposition + "; name=\"" + item.getName() + "\""; - headers.put(CONTENT_DISPOSITION, disposition); - } - - public boolean isFile() { - return item.getValue().getType() == Type.INPUT_STREAM; - } - - public String getValue() { - return item.getValue().getAsString(); - } - - @Override - public InputStream getInputStream() throws IOException { - return new ByteArrayInputStream(bytes); - } - - @Override - public String getContentType() { - return headers.get(CONTENT_TYPE); - } - - @Override - public String getName() { - return item.getName(); - } - - @Override - public long getSize() { - return bytes.length; - } - - @Override - public void write(String string) throws IOException { - - } - - @Override - public void delete() throws IOException { - - } - - @Override - public String getHeader(String string) { - return headers.get(string); - } - - @Override - public Collection getHeaders(String string) { - return Collections.singletonList(headers.get(string)); - } - - @Override - public Collection getHeaderNames() { - return headers.keySet(); - } - -} + + private final MultiPartItem item; + private final byte[] bytes; + private final Map headers; + private static final String CONTENT_TYPE = "content-type"; + private static final String CONTENT_DISPOSITION = "content-disposition"; + + public MockMultiPart(MultiPartItem item) { + this.item = item; + ScriptValue sv = item.getValue(); + if (sv.isNull()) { + bytes = new byte[0]; + } else { + String temp = sv.getAsString(); + bytes = temp.getBytes(); + } + headers = new HashMap<>(2); + String ct = item.getContentType(); + if (ct == null) { + ct = HttpUtils.getContentType(sv); + } + headers.put(CONTENT_TYPE, ct); + String disposition = "form-data"; + String filename = item.getFilename(); + if (filename != null) { + disposition = disposition + "; filename=\"" + filename + "\""; + } + disposition = disposition + "; name=\"" + item.getName() + "\""; + headers.put(CONTENT_DISPOSITION, disposition); + } + + public boolean isFile() { + return item.getValue().getType() == Type.INPUT_STREAM; + } + + public String getValue() { + return item.getValue().getAsString(); + } + + @Override + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(bytes); + } + + @Override + public String getContentType() { + return headers.get(CONTENT_TYPE); + } + + @Override + public String getName() { + return item.getName(); + } + + @Override + public long getSize() { + return bytes.length; + } + + @Override + public void write(String string) throws IOException { + + } + + @Override + public void delete() throws IOException { + + } + + @Override + public String getHeader(String string) { + /** + * support spring boot 2 StandardMultipartHttpServletRequest implementation to + * give CONTENT_DISPOSITION header details. + */ + return headers.getOrDefault(string, headers.get(string.toLowerCase())); + } + + @Override + public Collection getHeaders(String string) { + return Collections.singletonList(headers.get(string)); + } + + @Override + public Collection getHeaderNames() { + return headers.keySet(); + } + +} \ No newline at end of file diff --git a/karate-mock-servlet/src/test/java/com/intuit/karate/mock/servlet/test/MockMultiPartTest.java b/karate-mock-servlet/src/test/java/com/intuit/karate/mock/servlet/test/MockMultiPartTest.java new file mode 100644 index 0000000000..1a7c461616 --- /dev/null +++ b/karate-mock-servlet/src/test/java/com/intuit/karate/mock/servlet/test/MockMultiPartTest.java @@ -0,0 +1,48 @@ +package com.intuit.karate.mock.servlet.test; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.springframework.http.HttpHeaders; + +import com.intuit.karate.ScriptValue; +import com.intuit.karate.http.MultiPartItem; +import com.intuit.karate.mock.servlet.MockMultiPart; + +/** + * @author nsehgal + * + * Test for different StandardMultipartHttpServletRequest implementation + * in spring. Below test checks both the implementation should return + * the CONTENT_DISPOSITION header details when asked via getHeader(). + * + */ +public class MockMultiPartTest { + + private MockMultiPart mockMultiPart = null; + + private static final String CONTENT_DISPOSITION = "content-disposition"; + + @Before + public void init() { + ScriptValue NULL = new ScriptValue(null); + MultiPartItem item = new MultiPartItem("file", NULL); + item.setContentType("text/csv"); + item.setFilename("test.csv"); + mockMultiPart = new MockMultiPart(item); + } + + @Test + public void testSpring2MultipartHeader() { + String headerValue = mockMultiPart.getHeader(HttpHeaders.CONTENT_DISPOSITION); + Assert.assertNotNull(headerValue); + Assert.assertEquals("form-data; filename=\"test.csv\"; name=\"file\"", headerValue); + } + + @Test + public void testSpring1MultipartHeader() { + String headerValue = mockMultiPart.getHeader(CONTENT_DISPOSITION); + Assert.assertNotNull(headerValue); + Assert.assertEquals("form-data; filename=\"test.csv\"; name=\"file\"", headerValue); + } +}