diff --git a/src/main/java/de/jalin/fedipage/JSONLoader.java b/src/main/java/de/jalin/fedipage/JSONLoader.java index 2c948a7..992159c 100644 --- a/src/main/java/de/jalin/fedipage/JSONLoader.java +++ b/src/main/java/de/jalin/fedipage/JSONLoader.java @@ -94,7 +94,12 @@ public class JSONLoader implements Serializable { medium.setDescription(mediumJsonObject.getString("description")); } medium.setMediumUrl(mediumJsonObject.getString("preview_url")); - medium.setMediumImage(mediumJsonObject.getString("url")); + final String imageUrl = mediumJsonObject.getString("url"); + if (imageUrl != null && imageUrl.startsWith("https://")) { + medium.setMediumImage(contextUrl + "cache" + imageUrl.substring(7)); + } else { + medium.setMediumImage(imageUrl); + } post.addFediMedium(medium); } } diff --git a/src/main/java/de/jalin/fedipage/ProxyServlet.java b/src/main/java/de/jalin/fedipage/ProxyServlet.java new file mode 100644 index 0000000..6dbeda4 --- /dev/null +++ b/src/main/java/de/jalin/fedipage/ProxyServlet.java @@ -0,0 +1,87 @@ +package de.jalin.fedipage; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; + +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +public class ProxyServlet extends HttpServlet { + + private static final long serialVersionUID = 6847934676281057148L; + + private String cacheDirectory; + + @Override + public void init() throws ServletException { + final ServletConfig servletConfig = getServletConfig(); + try { + String cache = servletConfig.getInitParameter("cache"); + if (cache != null) { + cacheDirectory = Path.of(cache).toString(); + } else { + cacheDirectory = Files.createTempDirectory("cache").toString(); + } + } catch (IOException e) { + throw new ServletException(e); + } + } + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + final String resource = request.getPathInfo(); + final Path resourcePath = Path.of(cacheDirectory + resource); + final File file = resourcePath.toFile(); + if (file.exists()) { + final BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file)); + final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream()); + final byte[] bytesBuffer = new byte[4096]; + int readBytes = bufferedInputStream.read(bytesBuffer); + while (readBytes > 0) { + bufferedOutputStream.write(bytesBuffer, 0, readBytes); + readBytes = bufferedInputStream.read(bytesBuffer); + } + bufferedOutputStream.close(); + bufferedInputStream.close(); + } else { + try { + file.getParentFile().mkdirs(); + file.createNewFile(); + final URI uri = new URI("https:/" + resource); + final URL url = uri.toURL(); + final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + final BufferedInputStream bufferedInputStream = new BufferedInputStream(connection.getInputStream()); + final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream()); + final BufferedOutputStream fileOutputStream = new BufferedOutputStream(new FileOutputStream(file)); + final byte[] bytesBuffer = new byte[4096]; + int readBytes = bufferedInputStream.read(bytesBuffer); + while (readBytes > 0) { + bufferedOutputStream.write(bytesBuffer, 0, readBytes); + fileOutputStream.write(bytesBuffer, 0, readBytes); + readBytes = bufferedInputStream.read(bytesBuffer); + } + bufferedOutputStream.close(); + fileOutputStream.close(); + bufferedInputStream.close(); + connection.disconnect(); + } catch (URISyntaxException e) { + throw new ServletException(e); + } + } + + } +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 85fded9..249f9e6 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -19,11 +19,25 @@ + + ProxyServlet + de.jalin.fedipage.ProxyServlet + + cache + temp/fedicache + + + FediServlet + + ProxyServlet + /cache/* + +