From 31c396f3664f35d9639cfb3ad4de83a7199f98e9 Mon Sep 17 00:00:00 2001 From: Bjørn Christian Seime Date: Fri, 3 Jun 2022 13:29:35 +0200 Subject: Create wrapper for Jetty's MultiPartFormInputStream --- .../container/jdisc/utils/MultiPartFormParser.java | 64 ++++++++++++++++++++++ .../yahoo/container/jdisc/utils/package-info.java | 10 ++++ 2 files changed, 74 insertions(+) create mode 100644 container-core/src/main/java/com/yahoo/container/jdisc/utils/MultiPartFormParser.java create mode 100644 container-core/src/main/java/com/yahoo/container/jdisc/utils/package-info.java (limited to 'container-core') 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 readParts() throws MultiPartException { + try { + Map 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 -- cgit v1.2.3