s_compress.go 969 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package backends
  2. import (
  3. "compress/zlib"
  4. "io"
  5. "github.com/flashmob/go-guerrilla/mail"
  6. )
  7. func init() {
  8. Streamers["compress"] = func() *StreamDecorator {
  9. return StreamCompress()
  10. }
  11. }
  12. type streamCompressConfig struct {
  13. CompressLevel int `json:"compress_level,omitempty"`
  14. }
  15. func StreamCompress() *StreamDecorator {
  16. sd := &StreamDecorator{}
  17. var config streamCompressConfig
  18. sd.Configure = func(cfg ConfigGroup) error {
  19. if _, ok := cfg["compress_level"]; !ok {
  20. cfg["compress_level"] = zlib.BestSpeed
  21. }
  22. return sd.ExtractConfig(cfg, &config)
  23. }
  24. sd.Decorate =
  25. func(sp StreamProcessor, a ...interface{}) StreamProcessor {
  26. var zw io.WriteCloser
  27. sd.Open = func(e *mail.Envelope) error {
  28. var err error
  29. zw, err = zlib.NewWriterLevel(sp, config.CompressLevel)
  30. return err
  31. }
  32. sd.Close = func() error {
  33. return zw.Close()
  34. }
  35. return StreamProcessWith(func(p []byte) (int, error) {
  36. return zw.Write(p)
  37. })
  38. }
  39. return sd
  40. }