zoukankan      html  css  js  c++  java
  • 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)
        })
    }

  • 相关阅读:
    git的使用
    模块化的 require 和 import的区别
    Javascript模块化编程(二)commonJS规范和AMD规范
    Javascript模块化编程(三):require.js的用法
    SQL精华语句
    Convert sql 函数格式
    sql分页存储过程(汇总)
    jira和svn结合
    使用Java Service Wrapper 把Java程序作为Windows系统服务
    Eclipse使用技巧
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7457496.html
Copyright © 2011-2022 走看看