From 31a9e27c7f885169fe16376483b5bdc378f7d2a7 Mon Sep 17 00:00:00 2001 From: rtm516 Date: Sun, 18 Feb 2024 14:08:47 +0000 Subject: [PATCH 1/3] Switch to `@Positive` instead of `@Pattern` for buildNumber --- .../papermc/bibliothek/controller/v2/DownloadController.java | 3 ++- .../bibliothek/controller/v2/VersionBuildController.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) 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 4e46f7b..e752370 100644 --- a/src/main/java/io/papermc/bibliothek/controller/v2/DownloadController.java +++ b/src/main/java/io/papermc/bibliothek/controller/v2/DownloadController.java @@ -47,6 +47,7 @@ import java.nio.file.Path; import java.time.Duration; import java.util.Map; +import jakarta.validation.constraints.Positive; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.FileSystemResource; import org.springframework.http.CacheControl; @@ -121,7 +122,7 @@ public ResponseEntity download( final String versionName, @Parameter(description = "A build of the version.") @PathVariable("build") - @Pattern(regexp = "\\d+") // + @Positive // final int buildNumber, @Parameter(description = "A download of the build.") @PathVariable("download") diff --git a/src/main/java/io/papermc/bibliothek/controller/v2/VersionBuildController.java b/src/main/java/io/papermc/bibliothek/controller/v2/VersionBuildController.java index b4b4d47..b9fbfb8 100644 --- a/src/main/java/io/papermc/bibliothek/controller/v2/VersionBuildController.java +++ b/src/main/java/io/papermc/bibliothek/controller/v2/VersionBuildController.java @@ -43,6 +43,7 @@ import java.time.Instant; import java.util.List; import java.util.Map; +import jakarta.validation.constraints.Positive; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.CacheControl; import org.springframework.http.MediaType; @@ -91,7 +92,7 @@ public ResponseEntity build( final String versionName, @Parameter(description = "A build of the version.") @PathVariable("build") - @Pattern(regexp = "\\d+") // + @Positive // final int buildNumber ) { final Project project = this.projects.findByName(projectName).orElseThrow(ProjectNotFound::new); From 4ea51c4822db95e5a22a0fcd89c89c655c280ed2 Mon Sep 17 00:00:00 2001 From: rtm516 Date: Sun, 18 Feb 2024 16:51:34 +0000 Subject: [PATCH 2/3] Fix import order --- .../io/papermc/bibliothek/controller/v2/DownloadController.java | 2 +- .../bibliothek/controller/v2/VersionBuildController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 e752370..ec85baa 100644 --- a/src/main/java/io/papermc/bibliothek/controller/v2/DownloadController.java +++ b/src/main/java/io/papermc/bibliothek/controller/v2/DownloadController.java @@ -42,12 +42,12 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Positive; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.time.Duration; import java.util.Map; -import jakarta.validation.constraints.Positive; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.FileSystemResource; import org.springframework.http.CacheControl; diff --git a/src/main/java/io/papermc/bibliothek/controller/v2/VersionBuildController.java b/src/main/java/io/papermc/bibliothek/controller/v2/VersionBuildController.java index b9fbfb8..1152e66 100644 --- a/src/main/java/io/papermc/bibliothek/controller/v2/VersionBuildController.java +++ b/src/main/java/io/papermc/bibliothek/controller/v2/VersionBuildController.java @@ -39,11 +39,11 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Positive; import java.time.Duration; import java.time.Instant; import java.util.List; import java.util.Map; -import jakarta.validation.constraints.Positive; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.CacheControl; import org.springframework.http.MediaType; From d8cc31c3dcfddb09d9539e70e7e98df7c3aefe47 Mon Sep 17 00:00:00 2001 From: rtm516 Date: Sun, 18 Feb 2024 18:46:20 +0000 Subject: [PATCH 3/3] 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); + }; + } +}