/* tofuproxy -- flexible HTTP proxy, TLS terminator, X.509 certificates manager, WARC/Gemini browser Copyright (C) 2021 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package rounds import ( "fmt" "io" "io/ioutil" "log" "net/http" "os" "os/exec" "strings" "go.stargrave.org/tofuproxy/fifos" ) const CmdDWebP = "dwebp" func isXombrero(req *http.Request) bool { return strings.Contains(req.Header.Get("User-Agent"), "AppleWebKit/538.15") } func RoundTranscodeWebP( host string, resp *http.Response, w http.ResponseWriter, req *http.Request, ) (bool, error) { if resp.Header.Get("Content-Type") != "image/webp" || isXombrero(req) { return true, nil } tmpFd, err := ioutil.TempFile("", "tofuproxy.*.webp") if err != nil { log.Fatalln(err) } defer os.Remove(tmpFd.Name()) defer tmpFd.Close() defer resp.Body.Close() if _, err = io.Copy(tmpFd, resp.Body); err != nil { log.Printf("Error during %s: %+v\n", req.URL, err) return false, err } tmpFd.Close() cmd := exec.Command(CmdDWebP, tmpFd.Name(), "-o", "-") data, err := cmd.Output() if err != nil { return false, err } w.Header().Add("Content-Type", "image/png") w.WriteHeader(http.StatusOK) w.Write(data) fifos.LogVarious <- fmt.Sprintf("%s %s\tWebP transcoded to PNG", req.Method, req.URL) return false, nil }