1 // tofuproxy -- flexible HTTP/HTTPS proxy, TLS terminator, X.509 TOFU
2 // manager, WARC/geminispace browser
3 // Copyright (C) 2021-2024 Sergey Matveev <stargrave@stargrave.org>
5 // This program is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, version 3 of the License.
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
28 type CountableReader struct {
33 func (r *CountableReader) ReadByte() (b byte, err error) {
34 b, err = r.Reader.ReadByte()
41 func (r *CountableReader) Read(p []byte) (n int, err error) {
42 n, err = r.Reader.Read(p)
48 log.SetFlags(log.Lshortfile)
49 fdOff := os.NewFile(3, "fdOff")
50 br := bufio.NewReader(os.Stdin)
51 cr := &CountableReader{Reader: br}
52 bw := bufio.NewWriter(os.Stdout)
53 z, err := gzip.NewReader(cr)
58 var offset, offsetPrev int64
60 written, err := io.Copy(bw, z)
66 fmt.Fprintf(fdOff, "%d\t%d\n", offset-offsetPrev, written)