Golangにデータの圧縮と復元のパッケージをいくつ実装しています、"compress/flate" の他、 "compress/gzip" と "compress/zlib" なども提供されています。
ただ、HTTPクライアント Content-Encoding
に deflate
のリクエストデータを復元できなかった。
import (
"compress/gzip"
"compress/flate"
)
// Decode request body by content encoding
func decodeRequestBody(r *http.Request) (string, error) {
ce, _ := r.Header["Content-Encoding"]
for _, x := range ce {
switch x {
case "gzip":
gr, e := gzip.NewReader(r.Body)
defer gr.Close()
if e != nil {
return "", e
}
return readAll(gr)
case "deflate":
fr, e := flate.NewReader(r.Body)
defer fr.Close()
if e != nil {
return "", e
}
return readAll(fr)
}
}
// No Content-Encoding header detected
return readAll(r.Body)
}
// Read from reader to string
func readAll(r io.Reader) (string, error) {
if body, err := ioutil.ReadAll(r); err != nil {
return "", err
} else {
return string(body), nil
}
}
これではうまくいかなかった:
panic: flate: corrupt input before offset 5
調べたところ、この スレード のように、入力データは Zlib
のストリームなので、 compress/zlib
を使うべきだった。
なんでクライアントが Zlib
のデータなのに Content-Encoding
に deflate
設定したのだろう。