package response import ( "compress/gzip" "encoding/json" "fmt" "log" "net/http" "strings" ) // JSON makes a JSON response func JSON(writer http.ResponseWriter, status int, data interface{}) { jsonData, err := json.Marshal(data) if err != nil { log.Println("JSON Marshal failed: ", err.Error()) writer.Header().Set("Content-Type", "text/plain; charset=utf-8") writer.WriteHeader(503) fmt.Fprint(writer, "JSON marshalling failed:", err.Error()) return } writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(status) writer.Write(jsonData) } // CompressedJSON makes a compressed JSON response, but only if the client supports it and the. // payload exceeds 1024 bytes. func CompressedJSON(writer http.ResponseWriter, request *http.Request, status int, data interface{}) { jsonData, err := json.Marshal(data) if err != nil { log.Println("JSON Marshal failed: ", err.Error()) writer.Header().Set("Content-Type", "text/plain; charset=utf-8") writer.WriteHeader(503) fmt.Fprint(writer, "JSON marshalling failed:", err.Error()) return } writer.Header().Set("Content-Type", "application/json") if len(jsonData) > 1024 && strings.Contains(request.Header.Get("Accept-Encoding"), "gzip") { writer.Header().Set("Content-Encoding", "gzip") writer.WriteHeader(status) gz := gzip.NewWriter(writer) gz.Write(jsonData) gz.Close() } else { writer.WriteHeader(status) writer.Write(jsonData) } }