diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index ff6e4b710..21f73ae99 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -71,11 +71,6 @@ commons-fileupload2 2.0-SNAPSHOT - - org.eclipse.angus - angus-mail - 2.0.1 - org.apache.httpcomponents diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 1531315e9..5211e68df 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -17,22 +17,25 @@ import com.amazonaws.serverless.proxy.internal.SecurityUtils; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import jakarta.activation.spi.MimeTypeRegistryProvider; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import jakarta.servlet.*; import jakarta.servlet.ServletContext; import jakarta.servlet.descriptor.JspConfigDescriptor; -import jakarta.activation.MimetypesFileTypeMap; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.InvalidPathException; +import java.nio.file.Paths; import java.util.*; -import java.util.stream.Collectors; /** @@ -60,7 +63,6 @@ public class AwsServletContext private Map initParameters; private AwsLambdaServletContainerHandler containerHandler; private Logger log = LoggerFactory.getLogger(AwsServletContext.class); - private MimetypesFileTypeMap mimeTypes; // lazily loaded in the getMimeType method //------------------------------------------------------------- @@ -160,18 +162,32 @@ public int getEffectiveMinorVersion() { @Override @SuppressFBWarnings("PATH_TRAVERSAL_IN") // suppressing because we are using the getValidFilePath - public String getMimeType(String s) { - if (s == null || !s.contains(".")) { + public String getMimeType(String file) { + if (file == null || !file.contains(".")) { return null; } - if (mimeTypes == null) { - mimeTypes = new MimetypesFileTypeMap(); + + String mimeType = null; + + // may not work on Lambda until mailcap package is present https://github.com/awslabs/aws-serverless-java-container/pull/504 + try { + mimeType = Files.probeContentType(Paths.get(file)); + } catch (IOException | InvalidPathException e) { + log("unable to probe for content type, will use fallback", e); + } + + if (mimeType == null) { + try { + String mimeTypeGuess = URLConnection.guessContentTypeFromName(new File(file).getName()); + if (mimeTypeGuess !=null) { + mimeType = mimeTypeGuess; + } + } catch (Exception e) { + log("couldn't find a better contentType than " + mimeType + " for file " + file, e); + } } - // TODO: The getContentType method of the MimetypesFileTypeMap returns application/octet-stream - // instead of null when the type cannot be found. We should replace with an implementation that - // loads the System mime types ($JAVA_HOME/lib/mime.types - return mimeTypes.getContentType(s); + return mimeType; } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index ed84462a5..58d0b0542 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -65,12 +65,19 @@ void getMimeType_mimeTypeOfCorrectFile_expectMime() { mimeType = ctx.getMimeType("file://" + tmpFilePath); assertEquals("text/plain", mimeType); } + @Test + void getMimeType_mimeTypeOfJavascript_expectApplicationJavascript() { + String tmpFilePath = TMP_DIR + "some.js"; + AwsServletContext ctx = new AwsServletContext(null); + String mimeType = ctx.getMimeType(tmpFilePath); + assertEquals("text/javascript", mimeType); + } @Test - void getMimeType_unknownExtension_expectAppOctetStream() { + void getMimeType_unknownExtension_expectNull() { AwsServletContext ctx = new AwsServletContext(null); String mimeType = ctx.getMimeType("myfile.unkext"); - assertEquals("application/octet-stream", mimeType); + assertNull(mimeType); }