• compress.go


    // Copyright 2013 The Gorilla Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style
    // license that can be found in the LICENSE file.

    // copied from https://github.com/gorilla/handlers/blob/master/compress.go

    package http_api

    import (
        "compress/flate"
        "compress/gzip"
        "io"
        "net/http"
        "strings"
    )

    type compressResponseWriter struct {
        io.Writer
        http.ResponseWriter
        http.Hijacker
    }

    func (w *compressResponseWriter) Header() http.Header {
        return w.ResponseWriter.Header()
    }

    func (w *compressResponseWriter) WriteHeader(c int) {
        w.ResponseWriter.Header().Del("Content-Length")
        w.ResponseWriter.WriteHeader(c)
    }

    func (w *compressResponseWriter) Write(b []byte) (int, error) {
        h := w.ResponseWriter.Header()
        if h.Get("Content-Type") == "" {
            h.Set("Content-Type", http.DetectContentType(b))
        }
        h.Del("Content-Length")
        return w.Writer.Write(b)
    }

    // CompressHandler gzip compresses HTTP responses for clients that support it
    // via the 'Accept-Encoding' header.
    func CompressHandler(h http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        L:
            for _, enc := range strings.Split(r.Header.Get("Accept-Encoding"), ",") {
                switch strings.TrimSpace(enc) {
                case "gzip":
                    w.Header().Set("Content-Encoding", "gzip")
                    w.Header().Add("Vary", "Accept-Encoding")

                    gw := gzip.NewWriter(w)
                    defer gw.Close()

                    h, hok := w.(http.Hijacker)
                    if !hok { /* w is not Hijacker... oh well... */
                        h = nil
                    }

                    w = &compressResponseWriter{
                        Writer:         gw,
                        ResponseWriter: w,
                        Hijacker:       h,
                    }

                    break L
                case "deflate":
                    w.Header().Set("Content-Encoding", "deflate")
                    w.Header().Add("Vary", "Accept-Encoding")

                    fw, _ := flate.NewWriter(w, flate.DefaultCompression)
                    defer fw.Close()

                    h, hok := w.(http.Hijacker)
                    if !hok { /* w is not Hijacker... oh well... */
                        h = nil
                    }

                    w = &compressResponseWriter{
                        Writer:         fw,
                        ResponseWriter: w,
                        Hijacker:       h,
                    }

                    break L
                }
            }

            h.ServeHTTP(w, r)
        })
    }

  • 相关阅读:
    Spring Boot 的单元测试和集成测试
    Containers vs Serverless:你选择谁,何时选择?
    Java13新特性
    Java中创建对象的5种方法
    最好的重试是指数后退和抖动
    杂谈:面向微服务的体系结构评审中需要问的三个问题
    使用Quarkus在Openshift上构建微服务的快速指南
    Java EE—最轻量级的企业框架?
    AQS机制
    JVM-内存模型
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7457496.html
Copyright © 2020-2023  润新知