diff --git a/src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java b/src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java index 48b885f..2820eb1 100644 --- a/src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java +++ b/src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java @@ -17,7 +17,7 @@ public class RFile { case "match": String code = UUID.randomUUID() + "-" + UUID.randomUUID(); - FileSocket.FileRecv fileRecv = new FileSocket.FileRecv(message.data().get("name").asText(), null, null, + FileSocket.FileRecv fileRecv = new FileSocket.FileRecv(null, message.data().get("name").asText(), null, null, System.currentTimeMillis()); FileSocket.sessions.put(code, fileRecv); diff --git a/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java b/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java index 74dbb75..0d7b3e2 100644 --- a/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java +++ b/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java @@ -1,6 +1,7 @@ package fr.titionfire.ffsaf.ws; import io.quarkus.runtime.annotations.RegisterForReflection; +import io.quarkus.scheduler.Scheduled; import jakarta.enterprise.context.ApplicationScoped; import jakarta.websocket.*; import jakarta.websocket.server.PathParam; @@ -22,12 +23,31 @@ public class FileSocket { @ConfigProperty(name = "upload_dir") String media; + @Scheduled(every = "10s") + void increment() { + sessions.forEach((key, value) -> { + if (System.currentTimeMillis() - value.time > 60000) { + closeAndDelete(value); + if (value.session != null && value.session.isOpen()) { + try { + value.session.close(new CloseReason(CloseReason.CloseCodes.VIOLATED_POLICY, "Timeout")); + } catch (IOException e) { + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); + } + } + sessions.remove(key); + } + }); + } + @OnOpen public void onOpen(Session session, @PathParam("code") String code) { try { if (sessions.containsKey(code)) { FileRecv fileRecv = sessions.get(code); - fileRecv.file = new File(media, "record/" + fileRecv.name);; + fileRecv.file = new File(media, "record/" + fileRecv.name); fileRecv.fos = new FileOutputStream(fileRecv.file, false); logger.info("Start reception of file: " + fileRecv.file.getAbsolutePath()); } else { @@ -54,37 +74,45 @@ public class FileSocket { } } logger.info("File received: " + fileRecv.file.getAbsolutePath()); + sessions.remove(code); } - sessions.remove(code); } @OnError public void onError(Session session, @PathParam("code") String code, Throwable throwable) { if (sessions.containsKey(code)) { - FileRecv fileRecv = sessions.get(code); - if (fileRecv.fos != null) { - try { - fileRecv.fos.close(); - if (fileRecv.file.exists()) { - //noinspection ResultOfMethodCallIgnored - fileRecv.file.delete(); - } - } catch (IOException e) { - StringWriter errors = new StringWriter(); - e.printStackTrace(new PrintWriter(errors)); - logger.error(errors.toString()); - } - } + closeAndDelete(sessions.get(code)); + sessions.remove(code); } - sessions.remove(code); logger.error("Error on file reception: " + throwable.getMessage()); } - @OnMessage public void onMessage(String message, @PathParam("code") String code) { - System.out.println("Received: " + message); + if (message.equals("cancel")) { + if (sessions.containsKey(code)) { + closeAndDelete(sessions.get(code)); + sessions.remove(code); + } + logger.error("Error file " + code + " are cancel by the client"); + } + } + + private void closeAndDelete(FileRecv fileRecv) { + if (fileRecv.fos != null) { + try { + fileRecv.fos.close(); + } catch (IOException e) { + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); + } + } + if (fileRecv.file.exists()) { + //noinspection ResultOfMethodCallIgnored + fileRecv.file.delete(); + } } @OnMessage @@ -104,6 +132,7 @@ public class FileSocket { @AllArgsConstructor @RegisterForReflection public static class FileRecv { + Session session; String name; File file; FileOutputStream fos;