From f0207a490c75c3dac92c9c15fb8eea3b923db8b5 Mon Sep 17 00:00:00 2001
From: Sofiane Lasri-Trienpont <alasri250@gmail.com>
Date: Tue, 31 Oct 2023 13:59:25 +0100
Subject: [PATCH] =?UTF-8?q?Cr=C3=A9ation=20d'une=20classe=20utilitaire=20p?=
 =?UTF-8?q?our=20la=20cr=C3=A9ation=20de=20requ=C3=AAtes=20HTTP=20et=20sup?=
 =?UTF-8?q?pression=20de=20l'ancienne=20m=C3=A9thode=20getHttp?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/slprojects/slcraftplugin/Main.java    | 52 ++---------
 .../parallelTasks/InternalWebServer.java      |  6 +-
 .../utils/web/AsyncHttpClient.java            | 92 +++++++++++++++++++
 .../utils/web/PostDataBuilder.java            | 47 ++++++++++
 4 files changed, 153 insertions(+), 44 deletions(-)
 create mode 100644 src/main/java/com/slprojects/slcraftplugin/utils/web/AsyncHttpClient.java
 create mode 100644 src/main/java/com/slprojects/slcraftplugin/utils/web/PostDataBuilder.java

diff --git a/src/main/java/com/slprojects/slcraftplugin/Main.java b/src/main/java/com/slprojects/slcraftplugin/Main.java
index af5903e..332348c 100644
--- a/src/main/java/com/slprojects/slcraftplugin/Main.java
+++ b/src/main/java/com/slprojects/slcraftplugin/Main.java
@@ -8,6 +8,7 @@ import com.slprojects.slcraftplugin.parallelTasks.dataHandlers.PlayerDataHandler
 import com.slprojects.slcraftplugin.parallelTasks.events.PeriodicEvent;
 import com.slprojects.slcraftplugin.utils.ConsoleLog;
 import com.slprojects.slcraftplugin.utils.Database;
+import com.slprojects.slcraftplugin.utils.web.AsyncHttpClient;
 import io.papermc.paper.event.player.AsyncChatEvent;
 import me.clip.placeholderapi.PlaceholderAPI;
 import net.kyori.adventure.text.Component;
@@ -42,6 +43,7 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -268,45 +270,6 @@ public final class Main extends JavaPlugin implements Listener {
         getLinkCode.setExecutor(linkCodeCommand);
     }
 
-    // Permet de faire des appels vers l'api discord
-    public String getHttp(String urlString) {
-        String returnData = "";
-        // Processus long et chiant
-        try {
-            URL url = new URL(urlString);
-            HttpURLConnection con = (HttpURLConnection) url.openConnection();
-            con.setRequestMethod("GET");
-            con.setRequestProperty("User-Agent", "Mozilla/5.0");
-            con.setRequestProperty("Accept-Language", "fr-FR,fr;q=0.5");
-            con.setRequestProperty("Content-Type", "application/json");
-            con.setRequestProperty("Server-Type", config.getString("server-type"));
-            con.setDoOutput(true);
-            con.setDoInput(true);
-            con.setUseCaches(false);
-            con.setAllowUserInteraction(false);
-            con.setConnectTimeout(5000);
-            con.setReadTimeout(5000);
-            con.connect();
-            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
-            String inputLine;
-
-            StringBuilder response = new StringBuilder();
-            while ((inputLine = in.readLine()) != null) {
-                response.append(inputLine);
-            }
-
-
-            in.close();
-            con.disconnect();
-            returnData = response.toString();
-        } catch (Exception ex) {
-            ConsoleLog.danger("Impossible de se connecter à l'url " + urlString + ". Func getHttp(String urlString)");
-            ex.printStackTrace();
-        }
-
-        return returnData;
-    }
-
     // Envoyer un message sur le discord
     @SuppressWarnings({"unchecked"})
     public void sendMessageToDiscord(String message, String username) {
@@ -325,10 +288,13 @@ public final class Main extends JavaPlugin implements Listener {
         try {
             String urlString = config.getString("discordBot-api-url") + "mc/chat/" + URLEncoder.encode(json.toJSONString(), "UTF-8").replace("+", "%20");
 
-            String response = getHttp(urlString);
-            if (getConfig().getBoolean("msg-verbose")) {
-                ConsoleLog.info("Func AsyncChatEvent(PlayerChatEvent e), HTTP response:" + response);
-            }
+            AsyncHttpClient httpClient = new AsyncHttpClient();
+            CompletableFuture<String> response = httpClient.get(urlString);
+            response.thenAccept(res -> {
+                if (getConfig().getBoolean("msg-verbose")) {
+                    ConsoleLog.info("Func sendMessageToDiscord(String message, String username), HTTP response:" + res);
+                }
+            });
         } catch (UnsupportedEncodingException ex) {
             ConsoleLog.danger("Impossible de d'encoder les données. Func AsyncChatEvent(PlayerChatEvent e)");
             ex.printStackTrace();
diff --git a/src/main/java/com/slprojects/slcraftplugin/parallelTasks/InternalWebServer.java b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/InternalWebServer.java
index 8de54d6..4a63a6a 100644
--- a/src/main/java/com/slprojects/slcraftplugin/parallelTasks/InternalWebServer.java
+++ b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/InternalWebServer.java
@@ -2,6 +2,7 @@ package com.slprojects.slcraftplugin.parallelTasks;
 
 import com.slprojects.slcraftplugin.Main;
 import com.slprojects.slcraftplugin.utils.ConsoleLog;
+import com.slprojects.slcraftplugin.utils.web.AsyncHttpClient;
 import org.bukkit.ChatColor;
 import org.bukkit.entity.Player;
 import org.json.simple.JSONObject;
@@ -13,6 +14,7 @@ import java.net.ServerSocket;
 import java.net.Socket;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
+import java.util.concurrent.CompletableFuture;
 
 public class InternalWebServer {
     /**
@@ -134,7 +136,9 @@ public class InternalWebServer {
                     ConsoleLog.danger("Erreur lors de l'encodage du message. Func waitForDiscordMsg::startServer(Main plugin)");
                     ex.printStackTrace();
                 }
-                plugin.getHttp(urlString);
+
+                AsyncHttpClient httpClient = new AsyncHttpClient();
+                httpClient.get(urlString);
             } catch (ParseException e) {
                 e.printStackTrace();
             }
diff --git a/src/main/java/com/slprojects/slcraftplugin/utils/web/AsyncHttpClient.java b/src/main/java/com/slprojects/slcraftplugin/utils/web/AsyncHttpClient.java
new file mode 100644
index 0000000..37c1e04
--- /dev/null
+++ b/src/main/java/com/slprojects/slcraftplugin/utils/web/AsyncHttpClient.java
@@ -0,0 +1,92 @@
+package com.slprojects.slcraftplugin.utils.web;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Client HTTP asynchrone
+ */
+public class AsyncHttpClient {
+
+    /**
+     * Effectue une requête GET
+     * @param urlString URL
+     * @return Réponse
+     */
+    public CompletableFuture<String> get(String urlString) {
+        return CompletableFuture.supplyAsync(() -> {
+            try {
+                URL url = new URL(urlString);
+                HttpURLConnection con = (HttpURLConnection) url.openConnection();
+                con.setRequestMethod("GET");
+                con.setConnectTimeout(5000);
+                con.setReadTimeout(5000);
+
+                BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
+                StringBuilder response = new StringBuilder();
+                String inputLine;
+
+                while ((inputLine = in.readLine()) != null) {
+                    response.append(inputLine);
+                }
+
+                in.close();
+                con.disconnect();
+                return response.toString();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+                return null;
+            }
+        });
+    }
+
+    /**
+     * Effectue une requête GET avec des headers
+     * @param urlString URL
+     * @param postDataBuilder Données POST
+     * @param headers Headers
+     * @return Réponse
+     */
+    public CompletableFuture<String> post(String urlString, PostDataBuilder postDataBuilder, Map<String, String> headers) {
+        return CompletableFuture.supplyAsync(() -> {
+            try {
+                URL url = new URL(urlString);
+                HttpURLConnection con = (HttpURLConnection) url.openConnection();
+                con.setRequestMethod("POST");
+                con.setConnectTimeout(5000);
+                con.setReadTimeout(5000);
+
+                // Set request headers
+                headers.forEach(con::setRequestProperty);
+
+                con.setDoOutput(true);
+
+                // Write the request body
+                try (OutputStream os = con.getOutputStream()) {
+                    byte[] input = postDataBuilder.build().getBytes("utf-8");
+                    os.write(input, 0, input.length);
+                }
+
+                BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
+                StringBuilder response = new StringBuilder();
+                String inputLine;
+
+                while ((inputLine = in.readLine()) != null) {
+                    response.append(inputLine);
+                }
+
+                in.close();
+                con.disconnect();
+                return response.toString();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+                return null;
+            }
+        });
+    }
+}
diff --git a/src/main/java/com/slprojects/slcraftplugin/utils/web/PostDataBuilder.java b/src/main/java/com/slprojects/slcraftplugin/utils/web/PostDataBuilder.java
new file mode 100644
index 0000000..83da3d5
--- /dev/null
+++ b/src/main/java/com/slprojects/slcraftplugin/utils/web/PostDataBuilder.java
@@ -0,0 +1,47 @@
+package com.slprojects.slcraftplugin.utils.web;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Constructeur de données POST
+ */
+public class PostDataBuilder {
+    private Map<String, String> data;
+
+    public PostDataBuilder() {
+        data = new LinkedHashMap<>();
+    }
+
+    /**
+     * Ajoute une donnée POST
+     * @param name Nom
+     * @param value Valeur
+     */
+    public PostDataBuilder addData(String name, String value) {
+        data.put(name, value);
+        return this;
+    }
+
+    /**
+     * Construit les données POST
+     * @return Données POST
+     */
+    public String build() {
+        String postData = data.entrySet().stream()
+                .map(entry -> {
+                    try {
+                        return entry.getKey() + "=" + URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.toString());
+                    } catch (UnsupportedEncodingException e) {
+                        throw new RuntimeException("Error encoding POST data.", e);
+                    }
+                })
+                .collect(Collectors.joining("&"));
+
+        return postData;
+    }
+}
-- 
GitLab