71 lines
2.1 KiB
Java
71 lines
2.1 KiB
Java
|
package org.keycloak.encoding;
|
||
|
|
||
|
import org.apache.commons.io.IOUtils;
|
||
|
import org.jboss.logging.Logger;
|
||
|
import org.keycloak.models.KeycloakSession;
|
||
|
|
||
|
import java.io.File;
|
||
|
import java.io.FileInputStream;
|
||
|
import java.io.FileOutputStream;
|
||
|
import java.io.InputStream;
|
||
|
import java.util.zip.GZIPOutputStream;
|
||
|
|
||
|
public class GzipResourceEncodingProvider implements ResourceEncodingProvider {
|
||
|
|
||
|
private static final Logger logger = Logger.getLogger(ResourceEncodingProvider.class);
|
||
|
|
||
|
private KeycloakSession session;
|
||
|
private File cacheDir;
|
||
|
|
||
|
public GzipResourceEncodingProvider(KeycloakSession session, File cacheDir) {
|
||
|
this.session = session;
|
||
|
this.cacheDir = cacheDir;
|
||
|
}
|
||
|
|
||
|
public InputStream getEncodedStream(StreamSupplier producer, String... path) {
|
||
|
StringBuilder sb = new StringBuilder();
|
||
|
sb.append(cacheDir.getAbsolutePath());
|
||
|
for (String p : path) {
|
||
|
sb.append(File.separatorChar);
|
||
|
sb.append(p);
|
||
|
}
|
||
|
sb.append(".gz");
|
||
|
|
||
|
String filePath = sb.toString();
|
||
|
|
||
|
try {
|
||
|
File encodedFile = new File(filePath);
|
||
|
if (!encodedFile.getCanonicalPath().startsWith(cacheDir.getCanonicalPath())) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
if (!encodedFile.exists()) {
|
||
|
InputStream is = producer.getInputStream();
|
||
|
if (is != null) {
|
||
|
File parent = encodedFile.getParentFile();
|
||
|
if (!parent.isDirectory()) {
|
||
|
parent.mkdirs();
|
||
|
}
|
||
|
FileOutputStream fos = new FileOutputStream(encodedFile);
|
||
|
GZIPOutputStream gos = new GZIPOutputStream(fos);
|
||
|
IOUtils.copy(is, gos);
|
||
|
gos.close();
|
||
|
is.close();
|
||
|
} else {
|
||
|
encodedFile = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return encodedFile != null ? new FileInputStream(encodedFile) : null;
|
||
|
} catch (Exception e) {
|
||
|
logger.warn("Failed to encode resource", e);
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public String getEncoding() {
|
||
|
return "gzip";
|
||
|
}
|
||
|
|
||
|
}
|