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