From 300148267a8d0a0fb0c3ba7dcc7d874367d95d90 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 16 Apr 2022 20:15:42 +0300 Subject: [PATCH] =?UTF-8?q?web=20=D0=BC=D0=BE=D1=80=D0=B4=D0=B0=20=D0=B2?= =?UTF-8?q?=20=D1=81=D1=82=D0=B8=D0=BB=D0=B5=20"Index=20of"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ru/di9/mirror/Utils.java | 12 +++ .../ru/di9/mirror/config/MavenConfig.java | 19 +++++ .../controller/AbstractMavenController.java | 22 +++++ .../controller/IndexOfMavenController.java | 84 +++++++++++++++++++ ...ebController.java => MavenController.java} | 34 ++++---- 5 files changed, 153 insertions(+), 18 deletions(-) create mode 100644 src/main/java/ru/di9/mirror/Utils.java create mode 100644 src/main/java/ru/di9/mirror/config/MavenConfig.java create mode 100644 src/main/java/ru/di9/mirror/controller/AbstractMavenController.java create mode 100644 src/main/java/ru/di9/mirror/controller/IndexOfMavenController.java rename src/main/java/ru/di9/mirror/controller/{WebController.java => MavenController.java} (61%) diff --git a/src/main/java/ru/di9/mirror/Utils.java b/src/main/java/ru/di9/mirror/Utils.java new file mode 100644 index 0000000..fc85a02 --- /dev/null +++ b/src/main/java/ru/di9/mirror/Utils.java @@ -0,0 +1,12 @@ +package ru.di9.mirror; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class Utils { + + public static boolean isEmptyString(String string) { + return string == null || string.isEmpty() || string.isBlank(); + } +} diff --git a/src/main/java/ru/di9/mirror/config/MavenConfig.java b/src/main/java/ru/di9/mirror/config/MavenConfig.java new file mode 100644 index 0000000..02f44f0 --- /dev/null +++ b/src/main/java/ru/di9/mirror/config/MavenConfig.java @@ -0,0 +1,19 @@ +package ru.di9.mirror.config; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import java.nio.file.Path; +import java.nio.file.Paths; + +@Configuration +@Getter +public class MavenConfig { + + private final Path storagePath; + + public MavenConfig(@Value("${maven.storage:./storage}") String storagePath) { + this.storagePath = Paths.get(storagePath); + } +} diff --git a/src/main/java/ru/di9/mirror/controller/AbstractMavenController.java b/src/main/java/ru/di9/mirror/controller/AbstractMavenController.java new file mode 100644 index 0000000..ff95aab --- /dev/null +++ b/src/main/java/ru/di9/mirror/controller/AbstractMavenController.java @@ -0,0 +1,22 @@ +package ru.di9.mirror.controller; + +import ru.di9.mirror.Utils; +import ru.di9.mirror.config.MavenConfig; + +import java.nio.file.Path; + +public abstract class AbstractMavenController{ + protected final MavenConfig config; + + protected AbstractMavenController(MavenConfig config) { + this.config = config; + } + + protected Path storageResolve(String httpPath) { + if (Utils.isEmptyString(httpPath)) { + return config.getStoragePath(); + } else { + return config.getStoragePath().resolve(httpPath.substring(1)); + } + } +} diff --git a/src/main/java/ru/di9/mirror/controller/IndexOfMavenController.java b/src/main/java/ru/di9/mirror/controller/IndexOfMavenController.java new file mode 100644 index 0000000..80b0e07 --- /dev/null +++ b/src/main/java/ru/di9/mirror/controller/IndexOfMavenController.java @@ -0,0 +1,84 @@ +package ru.di9.mirror.controller; + +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import ru.di9.mirror.Utils; +import ru.di9.mirror.config.MavenConfig; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.stream.Stream; + +@Controller +@RequestMapping(path = "/maven") +public class IndexOfMavenController extends AbstractMavenController { + + public IndexOfMavenController(MavenConfig config) { + super(config); + } + + @GetMapping(path = "/{*path}", headers = "accept=text/html") + public ResponseEntity walker(@PathVariable("path") String httpPath) throws IOException { + ResponseEntity responseEntity; + + Path path = storageResolve(httpPath); + if (Files.exists(path)) { + if (Files.isDirectory(path)) { + responseEntity = generateIndexOf(httpPath, path); + } else { + responseEntity = downloadFile(path); + } + } else { + responseEntity = ResponseEntity.status(HttpStatus.NOT_FOUND) + .body("

404 - Not Found


Project-Mirror

"); + } + + return responseEntity; + } + + private ResponseEntity downloadFile(Path path) throws IOException { + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, + "attachment; filename=\"" + path.getFileName().toString() + "\"") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .contentLength(Files.size(path)) + .body(new InputStreamResource(Files.newInputStream(path))); + } + + private ResponseEntity generateIndexOf(String httpPath, Path path) throws IOException { + ResponseEntity responseEntity; + StringBuilder sb = new StringBuilder("

Index of



Project-Mirror

").toString()); + return responseEntity; + } +} diff --git a/src/main/java/ru/di9/mirror/controller/WebController.java b/src/main/java/ru/di9/mirror/controller/MavenController.java similarity index 61% rename from src/main/java/ru/di9/mirror/controller/WebController.java rename to src/main/java/ru/di9/mirror/controller/MavenController.java index a1c2650..fd30cec 100644 --- a/src/main/java/ru/di9/mirror/controller/WebController.java +++ b/src/main/java/ru/di9/mirror/controller/MavenController.java @@ -1,16 +1,17 @@ package ru.di9.mirror.controller; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; +import ru.di9.mirror.config.MavenConfig; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @@ -18,30 +19,29 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; @Slf4j @Controller @RequestMapping(path = "/maven") -public class WebController { - private final Path storagePath; +public class MavenController extends AbstractMavenController { - public WebController(@Value("${maven.storage:./storage}") String storagePath) { - this.storagePath = Paths.get(storagePath); + public MavenController(MavenConfig config) { + super(config); } - @RequestMapping(path = "/{*path}") - public ResponseEntity httpGetFile(@PathVariable("path") String httpPath) throws IOException { + @GetMapping(path = "/{*path}") + public ResponseEntity mavenGetFile(@PathVariable("path") String httpPath) throws IOException { ResponseEntity responseEntity; - Path path = resolve(httpPath); + Path path = storageResolve(httpPath); if (Files.notExists(path)) { responseEntity = ResponseEntity.notFound().build(); } else { long size = Files.size(path); responseEntity = ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + path.toFile().getName() + "\"") + .header(HttpHeaders.CONTENT_DISPOSITION, + "attachment; filename=\"" + path.toFile().getName() + "\"") .contentType(MediaType.APPLICATION_OCTET_STREAM) .contentLength(size) .body(new InputStreamResource(Files.newInputStream(path))); @@ -50,9 +50,11 @@ public class WebController { return responseEntity; } - @RequestMapping(path = "/{*path}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE) - public ResponseEntity httpPutFile(@PathVariable("path") String httpPath, HttpServletRequest httpRequest) throws IOException { - Path path = resolve(httpPath); + @SuppressWarnings("java:S1452") + @PutMapping(path = "/{*path}", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE) + public ResponseEntity mavenPutFile(@PathVariable("path") String httpPath, + HttpServletRequest httpRequest) throws IOException { + Path path = storageResolve(httpPath); Files.createDirectories(path.getParent()); try (InputStream inputStream = httpRequest.getInputStream(); @@ -67,8 +69,4 @@ public class WebController { return ResponseEntity.noContent().build(); } - - private Path resolve(String httpPath) { - return storagePath.resolve(httpPath.substring(1)); - } }