use of org.webpieces.router.impl.compression.Compression in project webpieces by deanhiller.
the class ProxyResponse method sendChunkedResponse.
private CompletableFuture<Void> sendChunkedResponse(Http2Response resp, byte[] bytes, final Compression compression) {
boolean compressed = false;
Compression usingCompression;
if (compression == null) {
usingCompression = new NoCompression();
} else {
usingCompression = compression;
compressed = true;
resp.addHeader(new Http2Header(Http2HeaderName.CONTENT_ENCODING, usingCompression.getCompressionType()));
}
log.info("sending RENDERHTML response. size=" + bytes.length + " code=" + resp + " for domain=" + routerRequest.domain + " path" + routerRequest.relativePath + " responseSender=" + stream);
boolean isCompressed = compressed;
// Send the headers and get the responseid.
return stream.sendResponse(resp).thenCompose(writer -> {
List<DataFrame> frames = possiblyCompress(bytes, usingCompression, isCompressed);
CompletableFuture<StreamWriter> future = CompletableFuture.completedFuture(writer);
for (int i = 0; i < frames.size(); i++) {
DataFrame f = frames.get(i);
if (i == frames.size() - 1)
f.setEndOfStream(true);
future = future.thenCompose(v -> {
return writer.processPiece(f);
});
}
return future;
}).thenApply(w -> null);
}
use of org.webpieces.router.impl.compression.Compression in project webpieces by deanhiller.
the class StaticFileReader method runAsyncFileRead.
private CompletableFuture<Void> runAsyncFileRead(RequestInfo info, RenderStaticResponse renderStatic) throws IOException {
boolean isFile = true;
String fullFilePath = renderStatic.getFilePath();
if (fullFilePath == null) {
isFile = false;
fullFilePath = renderStatic.getDirectory() + renderStatic.getRelativePath();
}
String extension = null;
int lastDirIndex = fullFilePath.lastIndexOf("/");
int lastDot = fullFilePath.lastIndexOf(".");
if (lastDot > lastDirIndex) {
extension = fullFilePath.substring(lastDot + 1);
}
ResponseEncodingTuple tuple = responseCreator.createResponse(info.getRequest(), StatusCode.HTTP_200_OK, extension, "application/octet-stream", false);
Http2Response response = tuple.response;
//On startup, we protect developers from breaking clients. In http, all files that change
//must also change the hash automatically and the %%{ }%% tag generates those hashes so the
//files loaded are always the latest
Long timeMs = config.getStaticFileCacheTimeSeconds();
if (timeMs != null)
response.addHeader(new Http2Header(Http2HeaderName.CACHE_CONTROL, "max-age=" + timeMs));
Path file;
Compression compr = compressionLookup.createCompressionStream(info.getRouterRequest().encodings, extension, tuple.mimeType);
//during startup as I don't feel like paying a cpu penalty for compressing while live
if (compr != null && compr.getCompressionType().equals(routerConfig.getStartupCompression())) {
response.addHeader(new Http2Header(Http2HeaderName.CONTENT_ENCODING, compr.getCompressionType()));
File routesCache = renderStatic.getTargetCache();
File fileReference;
if (isFile) {
String fileName = fullFilePath.substring(lastDirIndex + 1);
fileReference = new File(routesCache, fileName);
} else {
fileReference = new File(routesCache, renderStatic.getRelativePath());
}
fullFilePath = fileReference.getAbsolutePath();
file = fetchFile("Compressed File from cache=", fullFilePath + ".gz");
} else {
file = fetchFile("File=", fullFilePath);
}
AsynchronousFileChannel asyncFile = AsynchronousFileChannel.open(file, options, fileExecutor);
CompletableFuture<StreamWriter> future;
try {
log.info(() -> "sending chunked file via async read=" + file);
long length = file.toFile().length();
AtomicLong remaining = new AtomicLong(length);
future = info.getResponseSender().sendResponse(response).thenCompose(s -> readLoop(s, info.getPool(), file, asyncFile, 0, remaining));
} catch (Throwable e) {
future = new CompletableFuture<StreamWriter>();
future.completeExceptionally(e);
}
return //our finally block for failures
future.handle((s, exc) -> handleClose(info, s, exc)).thenAccept(s -> empty());
}
use of org.webpieces.router.impl.compression.Compression in project webpieces by deanhiller.
the class ProxyResponse method maybeCompressAndSend.
private CompletableFuture<Void> maybeCompressAndSend(String extension, ResponseEncodingTuple tuple, byte[] bytes) {
Compression compression = compressionLookup.createCompressionStream(routerRequest.encodings, extension, tuple.mimeType);
Http2Response resp = tuple.response;
if (bytes.length == 0) {
resp.setEndOfStream(true);
return stream.sendResponse(resp).thenApply(w -> null);
}
return sendChunkedResponse(resp, bytes, compression);
}
Aggregations