4

golang フレームワーク gin を使用して gzip 応答を返そうとしています。

ここに例を示します: https://github.com/gin-gonic/contrib/blob/master/gzip/example/example.go

package main

import (
    "fmt"
    "github.com/gin-gonic/contrib/gzip"
    "github.com/gin-gonic/gin"
    "time"
)

func main() {
    r := gin.Default()
    r.Use(gzip.Gzip(gzip.DefaultCompression))
    r.GET("/ping", func(c *gin.Context) {
        c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))
    })

    // Listen and Server in 0.0.0.0:8080
    r.Run(":8080")
}

この例を使用すると、gzip されたコンテンツが返されません。

上記のコードを使用すると、curl から次の出力が得られます

curl -v -H "Accept-Encoding: gzip" 'http://localhost:8080/ping'

Trying ::1...
Connected to localhost (::1) port 8080 (#0) GET /ping HTTP/1.1 Host: localhost:8080 User-Agent: curl/7.43.0 Accept: / Accept-Encoding: gzip
< HTTP/1.1 200 OK
< Content-Encoding: gzip
< Content-Type: text/plain; charset=utf-8
< Vary: Accept-Encoding
< Date: Mon, 18 Jul 2016 17:20:56 GMT
< Content-Length: 38
<

Connection #0 to host localhost left intact pong 1468862456?n????

コンテンツが gzip されておらず、余分なジャンク文字が追加されていることに注意してください。

「?n????」

これまでのところ、gzip を返す方法がわかりません。サンプル コードに間違いがあると思いますが、それを理解するのに苦労しています。

前もって感謝します。

4

1 に答える 1

3

他の誰かが gzip に問題を抱えていました。彼らのプルリクエストは私にとってこの問題を解決しました。gin フレームワークの gzip パッケージのバグです。

このメソッドは contrib/gzip/gzip.go にありませんでした

func (g *gzipWriter) WriteString(s string) (n int, err error) {
    return g.writer.Write([]byte(s))
}

プル リクエストを含む元の問題へのリンク。 https://github.com/gin-gonic/contrib/pull/59

プロジェクトの所有者がプル リクエストを受け入れると、この問題は解決されます。

于 2016-07-19T17:23:06.863 に答える