Skip to content

Instantly share code, notes, and snippets.

@nukopy
Last active April 23, 2022 11:10
Show Gist options
  • Save nukopy/9bc0bf58d39670dd52a9034a3b3f0db4 to your computer and use it in GitHub Desktop.
Save nukopy/9bc0bf58d39670dd52a9034a3b3f0db4 to your computer and use it in GitHub Desktop.
Go ならわかるシステムプログラミング Q2.3 標準出力にログを出力しつつ gzip 圧縮した JSON をレスポンスで返す
package main
func main() {
q2_3()
}
func q2_3() {
http.HandleFunc("/", q2_3_handler)
http.ListenAndServe(":8080", nil)
}
var cnt int
func q2_3_handler(w http.ResponseWriter, r *http.Request) {
// HTTP レスポンスヘッダの設定
w.Header().Set("Content-Encoding", "gzip")
w.Header().Set("Content-Type", "application/json")
// 標準出力の Writer に gzip 圧縮前、HTTP レスポンスの Writer に gzip 圧縮後を Write する
stdoutWriter := os.Stdout
gzipWriter := gzip.NewWriter(w)
multiWriter := io.MultiWriter(stdoutWriter, gzipWriter)
// レスポンスとして返す JSON の元データ
resJson := map[string]string{
"Language": "Go",
"Hello": "World",
"My Name is": "Bob",
"cnt": strconv.Itoa(cnt),
"time": time.Now().Format("2006-01-02 15:04:05"),
}
jsonEncoder := json.NewEncoder(multiWriter)
jsonEncoder.Encode(resJson) // ここで Writer が Write する
gzipWriter.Flush()
cnt++
}
@nukopy
Copy link
Author

nukopy commented Apr 23, 2022

ブラウザからリクエストを送ると favicon.png の分も HTTP リクエストが送信されて、計 2 回リクエストが送信される。そのため、1 回のブラウザからのリクエストでは cnt が 2 増えることに注意。

コマンドラインから curl でリクエストを送るとちゃんと cnt がインクリメントされるので安心して。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment