Compression.vala 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. namespace Astralis {
  2. public class Compression : Object, PipelineComponent {
  3. public async HttpResult process_request (HttpContext http_context, PipelineContext pipeline_context) throws Error {
  4. var result = yield pipeline_context.next();
  5. var accept_encoding = http_context.request.headers.get_any_or_default("Accept-Encoding");
  6. if(accept_encoding != null && accept_encoding.contains("gzip")) {
  7. return new CompressionResult (result, ZlibCompressorFormat.GZIP)
  8. .set_header("Content-Encoding", "gzip");
  9. }
  10. return result;
  11. }
  12. private class CompressionResult : HttpResult {
  13. private HttpResult inner_result;
  14. private ZlibCompressorFormat format;
  15. public CompressionResult(HttpResult result, ZlibCompressorFormat format) {
  16. base(result.status, result.content_length);
  17. replace_headers(result.headers);
  18. this.inner_result = result;
  19. this.format = format;
  20. }
  21. public async override void send_body (AsyncOutput output) throws Error {
  22. var converter = new ZlibCompressor(format);
  23. var converter_output = new ConverterAsyncOutput(output, converter);
  24. yield inner_result.send_body(converter_output);
  25. }
  26. }
  27. }
  28. }