namespace Astralis { public class Compression : Object, PipelineComponent { public async HttpResult process_request (HttpContext http_context, PipelineContext pipeline_context) throws Error { var result = yield pipeline_context.next(); var accept_encoding = http_context.request.headers.get_any_or_default("Accept-Encoding"); if(accept_encoding != null && accept_encoding.contains("gzip")) { return new CompressionResult (result, ZlibCompressorFormat.GZIP) .set_header("Content-Encoding", "gzip"); } return result; } private class CompressionResult : HttpResult { private HttpResult inner_result; private ZlibCompressorFormat format; public CompressionResult(HttpResult result, ZlibCompressorFormat format) { base(result.status, result.content_length); replace_headers(result.headers); this.inner_result = result; this.format = format; } public async override void send_body (AsyncOutput output) throws Error { var converter = new ZlibCompressor(format); var converter_output = new ConverterAsyncOutput(output, converter); yield inner_result.send_body(converter_output); } } } }