diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..abc78ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.gradle/ +/build/ diff --git a/src/main/java/space/dynomake/libretranslate/Translator.java b/src/main/java/space/dynomake/libretranslate/Translator.java index 5ed1521..33deef8 100644 --- a/src/main/java/space/dynomake/libretranslate/Translator.java +++ b/src/main/java/space/dynomake/libretranslate/Translator.java @@ -6,10 +6,16 @@ import space.dynomake.libretranslate.exception.BadTranslatorResponseException; import space.dynomake.libretranslate.type.TranslateResponse; import space.dynomake.libretranslate.util.JsonUtil; + +import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.*; -import java.util.Scanner; + +import static java.nio.charset.StandardCharsets.UTF_8; @UtilityClass public class Translator { @@ -20,46 +26,61 @@ public class Translator { @Setter private String apiKey = "unknown"; + @Setter + private static int connectTimeout = 5000; // 5 seconds + + @Setter + private static int readTimeout = 5000; + public String translate(@NonNull String from, @NonNull String to, @NonNull String request) { return translateDetect(from, to, request).getTranslatedText(); } public TranslateResponse translateDetect(@NonNull String from, @NonNull String to, @NonNull String request) { + HttpURLConnection httpConn = null; try { - URL url = new URL(urlApi); - HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + httpConn = (HttpURLConnection) url.openConnection(); + httpConn.setConnectTimeout(connectTimeout); + httpConn.setReadTimeout(readTimeout); + httpConn.setUseCaches(false); httpConn.setRequestMethod("POST"); - httpConn.setRequestProperty("accept", "application/json"); + httpConn.setRequestProperty("Accept", "application/json"); httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + httpConn.setRequestProperty("User-Agent", "Mozilla/5.0"); httpConn.setDoOutput(true); - OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream()); - - writer.write("q=" + URLEncoder.encode(request, "UTF-8") + "&source=" + from + "&api_key=" + apiKey + "&target=" + to + "&format=text"); - writer.flush(); - writer.close(); - httpConn.getOutputStream().close(); - - if (!(httpConn.getResponseCode() / 100 == 2)) - throw new BadTranslatorResponseException(httpConn.getResponseCode(), urlApi); - - InputStream responseStream = httpConn.getInputStream(); - - InputStreamReader reader = new InputStreamReader(responseStream, StandardCharsets.UTF_8); - - Scanner s = new Scanner(reader).useDelimiter("\\A"); - String response = s.hasNext() ? s.next() : ""; - - return JsonUtil.from(response, TranslateResponse.class); + // Build request body + String requestBody = "q=" + URLEncoder.encode(request, "UTF-8") + "&source=" + from + "&target=" + to + "&format=text"; + // Write request + try (OutputStream outputStream = httpConn.getOutputStream(); + OutputStreamWriter writer = new OutputStreamWriter(outputStream, UTF_8)) { + writer.write(requestBody); + writer.flush(); + } + + // Check response code before reading + int responseCode = httpConn.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK) { + throw new BadTranslatorResponseException(responseCode, urlApi); + } + + try (InputStream responseStream = httpConn.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(responseStream, UTF_8))) { + return JsonUtil.from(reader, TranslateResponse.class); + } + } catch (IOException e) { + throw new RuntimeException("Network error during translation", e); + } catch (RuntimeException e) { + throw e; } catch (Exception e) { - if (e instanceof RuntimeException) - throw (RuntimeException) e; - - e.printStackTrace(); - throw new RuntimeException(e); + throw new RuntimeException("Translation failed", e); + } finally { + if (httpConn != null) { + httpConn.disconnect(); + } } } diff --git a/src/main/java/space/dynomake/libretranslate/util/JsonUtil.java b/src/main/java/space/dynomake/libretranslate/util/JsonUtil.java index 662de44..e6f9d61 100644 --- a/src/main/java/space/dynomake/libretranslate/util/JsonUtil.java +++ b/src/main/java/space/dynomake/libretranslate/util/JsonUtil.java @@ -4,6 +4,8 @@ import lombok.NonNull; import lombok.experimental.UtilityClass; +import java.io.Reader; + @UtilityClass public class JsonUtil { @@ -17,4 +19,8 @@ public String to(@NonNull Object object) { public T from(@NonNull String s, Class tClass) { return gson.fromJson(s, tClass); } + + public T from(@NonNull Reader reader, Class tClass) { + return gson.fromJson(reader, tClass); + } }