// tofuproxy -- flexible HTTP/HTTPS proxy, TLS terminator, X.509 TOFU // manager, WARC/geminispace browser // Copyright (C) 2021-2024 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" "log" "net/http" "os" "os/exec" "go.stargrave.org/tofuproxy/fifos" ) const CmdDWebP = "dwebp" func RoundTranscodeWebP( host string, resp *http.Response, w http.ResponseWriter, req *http.Request, ) (bool, error) { if resp.Header.Get("Content-Type") != "image/webp" { return true, nil } tmpFd, err := os.CreateTemp("", "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 }