From d8cc31c3dcfddb09d9539e70e7e98df7c3aefe47 Mon Sep 17 00:00:00 2001 From: rtm516 Date: Sun, 18 Feb 2024 18:46:20 +0000 Subject: [PATCH] Allow for more content types for downloads --- .../controller/v2/DownloadController.java | 5 +- .../java/io/papermc/bibliothek/util/HTTP.java | 4 -- .../papermc/bibliothek/util/MediaTypes.java | 52 +++++++++++++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 src/main/java/io/papermc/bibliothek/util/MediaTypes.java diff --git a/src/main/java/io/papermc/bibliothek/controller/v2/DownloadController.java b/src/main/java/io/papermc/bibliothek/controller/v2/DownloadController.java index ec85baa..ea016f2 100644 --- a/src/main/java/io/papermc/bibliothek/controller/v2/DownloadController.java +++ b/src/main/java/io/papermc/bibliothek/controller/v2/DownloadController.java @@ -36,6 +36,7 @@ import io.papermc.bibliothek.exception.ProjectNotFound; import io.papermc.bibliothek.exception.VersionNotFound; import io.papermc.bibliothek.util.HTTP; +import io.papermc.bibliothek.util.MediaTypes; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.headers.Header; @@ -107,7 +108,7 @@ private DownloadController( value = "/v2/projects/{project:[a-z]+}/versions/{version:" + Version.PATTERN + "}/builds/{build:\\d+}/downloads/{download:" + Build.Download.PATTERN + "}", produces = { MediaType.APPLICATION_JSON_VALUE, - HTTP.APPLICATION_JAVA_ARCHIVE_VALUE + MediaType.ALL_VALUE } ) @Operation(summary = "Downloads the given file from a build's data.") @@ -161,7 +162,7 @@ private static HttpHeaders headersFor(final Path path, final CacheControl cache) final HttpHeaders headers = new HttpHeaders(); headers.setCacheControl(cache); headers.setContentDisposition(HTTP.attachmentDisposition(path.getFileName())); - headers.setContentType(HTTP.APPLICATION_JAVA_ARCHIVE); + headers.setContentType(MediaTypes.fromFileName(path.getFileName().toString())); headers.setLastModified(Files.getLastModifiedTime(path).toInstant()); return headers; } diff --git a/src/main/java/io/papermc/bibliothek/util/HTTP.java b/src/main/java/io/papermc/bibliothek/util/HTTP.java index 6ca441f..132e94b 100644 --- a/src/main/java/io/papermc/bibliothek/util/HTTP.java +++ b/src/main/java/io/papermc/bibliothek/util/HTTP.java @@ -28,13 +28,9 @@ import java.time.Duration; import org.springframework.http.CacheControl; import org.springframework.http.ContentDisposition; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; public final class HTTP { - public static final String APPLICATION_JAVA_ARCHIVE_VALUE = "application/java-archive"; - public static final MediaType APPLICATION_JAVA_ARCHIVE = new MediaType("application", "java-archive"); - private HTTP() { } diff --git a/src/main/java/io/papermc/bibliothek/util/MediaTypes.java b/src/main/java/io/papermc/bibliothek/util/MediaTypes.java new file mode 100644 index 0000000..ef04049 --- /dev/null +++ b/src/main/java/io/papermc/bibliothek/util/MediaTypes.java @@ -0,0 +1,52 @@ +/* + * This file is part of bibliothek, licensed under the MIT License. + * + * Copyright (c) 2019-2024 PaperMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package io.papermc.bibliothek.util; + +import org.jetbrains.annotations.Nullable; +import org.springframework.http.MediaType; +import org.springframework.http.MediaTypeFactory; + +public final class MediaTypes { + + public static final String APPLICATION_ZIP_VALUE = "application/zip"; + public static final MediaType APPLICATION_ZIP = MediaType.parseMediaType(APPLICATION_ZIP_VALUE); + + private MediaTypes() { + } + + public static @Nullable MediaType fromFileName(final String name) { + final int index = name.lastIndexOf('.'); + if (index != -1) { + return fromFileExtension(name.substring(index + 1)); + } + return null; + } + + public static @Nullable MediaType fromFileExtension(final String extension) { + return switch (extension) { + case "mcpack" -> APPLICATION_ZIP; + default -> MediaTypeFactory.getMediaType("." + extension).orElse(MediaType.APPLICATION_OCTET_STREAM); + }; + } +}