aboutsummaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2022-06-03 13:29:35 +0200
committergjoranv <gv@verizonmedia.com>2022-06-08 11:45:28 +0200
commit31c396f3664f35d9639cfb3ad4de83a7199f98e9 (patch)
treece7194ed5e52457f47333ef8c583cad9ad327346 /container-core
parent19f9c783c2f1ca136a6ed874656e0a2c93b4adca (diff)
Create wrapper for Jetty's MultiPartFormInputStream
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/utils/MultiPartFormParser.java64
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/utils/package-info.java10
2 files changed, 74 insertions, 0 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/utils/MultiPartFormParser.java b/container-core/src/main/java/com/yahoo/container/jdisc/utils/MultiPartFormParser.java
new file mode 100644
index 00000000000..104d2f8ae4a
--- /dev/null
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/utils/MultiPartFormParser.java
@@ -0,0 +1,64 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.container.jdisc.utils;
+
+import com.yahoo.container.jdisc.HttpRequest;
+import org.eclipse.jetty.http.MultiPartFormInputStream;
+
+import javax.servlet.http.Part;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Wrapper around Jetty's {@link MultiPartFormInputStream}.
+ *
+ * @author bjorncs
+ */
+public class MultiPartFormParser {
+
+ private final MultiPartFormInputStream multipart;
+
+ public MultiPartFormParser(InputStream in, String contentType) {
+ this.multipart = new MultiPartFormInputStream(in, contentType, /*config*/null, /*contextTmpDir*/null);
+ }
+
+ public MultiPartFormParser(HttpRequest request) { this(request.getData(), request.getHeader("Content-Type")); }
+
+ public Map<String, PartItem> readParts() throws MultiPartException {
+ try {
+ Map<String, PartItem> result = new TreeMap<>();
+ for (Part servletPart : multipart.getParts()) {
+ result.put(servletPart.getName(), new PartItem(servletPart));
+ }
+ return result;
+ } catch (Exception e) {
+ throw new MultiPartException(e.getCause());
+ }
+ }
+
+ public static class PartItem {
+ private final String name;
+ private final InputStream data;
+ private final String contentType;
+
+ private PartItem(Part servletPart) throws IOException {
+ this(servletPart.getName(), servletPart.getInputStream(), servletPart.getContentType());
+ }
+
+ public PartItem(String name, InputStream data, String contentType) {
+ this.name = name;
+ this.data = data;
+ this.contentType = contentType;
+ }
+
+ public String name() { return name; }
+ public InputStream data() { return data; }
+ public String contentType() { return contentType; }
+ }
+
+ public static class MultiPartException extends IOException {
+ public MultiPartException(Throwable cause) { super(cause.getMessage(), cause); }
+ }
+
+}
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/utils/package-info.java b/container-core/src/main/java/com/yahoo/container/jdisc/utils/package-info.java
new file mode 100644
index 00000000000..221843749a5
--- /dev/null
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/utils/package-info.java
@@ -0,0 +1,10 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * Internal utils that are not public api
+ *
+ * @author bjorncs
+ */
+@ExportPackage
+package com.yahoo.container.jdisc.utils;
+
+import com.yahoo.osgi.annotation.ExportPackage; \ No newline at end of file