diff --git a/karate-core/src/main/java/com/intuit/karate/server/Request.java b/karate-core/src/main/java/com/intuit/karate/server/Request.java index 65b746c83..eddb79368 100644 --- a/karate-core/src/main/java/com/intuit/karate/server/Request.java +++ b/karate-core/src/main/java/com/intuit/karate/server/Request.java @@ -332,7 +332,7 @@ public void processBody() { try { for (InterfaceHttpData part : decoder.getBodyHttpDatas()) { String name = part.getName(); - if (multipart) { + if (multipart && part instanceof FileUpload) { List> list = multiParts.get(name); if (list == null) { list = new ArrayList(); @@ -340,27 +340,21 @@ public void processBody() { } Map map = new HashMap(); list.add(map); - if (part instanceof FileUpload) { - FileUpload fup = (FileUpload) part; - map.put("name", name); - map.put("filename", fup.getFilename()); - Charset charset = fup.getCharset(); - if (charset != null) { - map.put("charset", charset.name()); - } - String ct = fup.getContentType(); - map.put("contentType", ct); - map.put("value", fup.get()); // bytes - String transferEncoding = fup.getContentTransferEncoding(); - if (transferEncoding != null) { - map.put("transferEncoding", transferEncoding); - } - } else { // simple multi-part key-value pair - Attribute attribute = (Attribute) part; - map.put("name", name); - map.put("value", attribute.getValue()); + FileUpload fup = (FileUpload) part; + map.put("name", name); + map.put("filename", fup.getFilename()); + Charset charset = fup.getCharset(); + if (charset != null) { + map.put("charset", charset.name()); } - } else { // url-encoded form-field + String ct = fup.getContentType(); + map.put("contentType", ct); + map.put("value", fup.get()); // bytes + String transferEncoding = fup.getContentTransferEncoding(); + if (transferEncoding != null) { + map.put("transferEncoding", transferEncoding); + } + } else { // form-field, url-encoded if not multipart Attribute attribute = (Attribute) part; List list = params.get(name); if (list == null) { diff --git a/karate-core/src/test/java/com/intuit/karate/runtime/KarateMockHandlerTest.java b/karate-core/src/test/java/com/intuit/karate/runtime/KarateMockHandlerTest.java index 95cf46e0a..cef0e8215 100644 --- a/karate-core/src/test/java/com/intuit/karate/runtime/KarateMockHandlerTest.java +++ b/karate-core/src/test/java/com/intuit/karate/runtime/KarateMockHandlerTest.java @@ -300,14 +300,14 @@ void testFormFieldPost() { void testMultiPartField() { background().scenario( "pathMatches('/hello')", - "def response = requestParts"); + "def response = requestParams"); run( URL_STEP, "multipart field foo = 'bar'", "path '/hello'", "method post" ); - matchVar("response", "{ foo: [{ name: 'foo', value: '#notnull' }] }"); + matchVar("response", "{ foo: ['bar'] }"); } @Test diff --git a/karate-core/src/test/java/com/intuit/karate/runtime/MockHandlerTest.java b/karate-core/src/test/java/com/intuit/karate/runtime/MockHandlerTest.java index d2f71c49d..5645f8a95 100644 --- a/karate-core/src/test/java/com/intuit/karate/runtime/MockHandlerTest.java +++ b/karate-core/src/test/java/com/intuit/karate/runtime/MockHandlerTest.java @@ -217,7 +217,7 @@ void testResponseHeaders() { void testMultiPart() { background().scenario( "pathMatches('/hello')", - "def foo = requestParts.foo[0].value", + "def foo = requestParams.foo[0]", "string bar = requestParts.bar[0].value", "def response = { foo: '#(foo)', bar: '#(bar)' }" ); diff --git a/karate-mock-servlet/src/main/java/com/intuit/karate/mock/servlet/MockHttpClient.java b/karate-mock-servlet/src/main/java/com/intuit/karate/mock/servlet/MockHttpClient.java index a1cbb0179..36b74fba5 100644 --- a/karate-mock-servlet/src/main/java/com/intuit/karate/mock/servlet/MockHttpClient.java +++ b/karate-mock-servlet/src/main/java/com/intuit/karate/mock/servlet/MockHttpClient.java @@ -118,13 +118,12 @@ public Response invoke(HttpRequest hr) { if (request.isMultiPart()) { request.getMultiParts().forEach((name, v) -> { for (Map map : v) { - String fileName = (String) map.get("filename"); - if (fileName != null) { - req.addPart(new MockPart(map)); - } else { - String value = (String) map.get("value"); - req.addParameter(name, value); - } + req.addPart(new MockPart(map)); + } + }); + request.getParams().forEach((name, v) -> { + for (String value : v) { + req.addParameter(name, value); } }); }