From 3e8c3cafc1fc9cc6a4d507ff4f74a4abb579c685 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 19 Mar 2020 12:58:56 +0700 Subject: [PATCH] make the buffered qlog writer used in interop flush before closing --- example/client/main.go | 8 +----- example/main.go | 8 +----- internal/utils/buffered_write_closer.go | 26 ++++++++++++++++++++ internal/utils/buffered_write_closer_test.go | 26 ++++++++++++++++++++ interop/utils/logging.go | 10 +++----- 5 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 internal/utils/buffered_write_closer.go create mode 100644 internal/utils/buffered_write_closer_test.go diff --git a/example/client/main.go b/example/client/main.go index ec06f2cc..c058c6a8 100644 --- a/example/client/main.go +++ b/example/client/main.go @@ -62,13 +62,7 @@ func main() { log.Fatal(err) } log.Printf("Creating qlog file %s.\n", filename) - return struct { - io.Writer - io.Closer - }{ - bufio.NewWriter(f), - f, - } + return utils.NewBufferedWriteCloser(bufio.NewWriter(f), f) } } roundTripper := &http3.RoundTripper{ diff --git a/example/main.go b/example/main.go index 0a9f9321..ee0d440a 100644 --- a/example/main.go +++ b/example/main.go @@ -216,13 +216,7 @@ func main() { log.Fatal(err) } log.Printf("Creating qlog file %s.\n", filename) - return struct { - io.Writer - io.Closer - }{ - bufio.NewWriter(f), - f, - } + return utils.NewBufferedWriteCloser(bufio.NewWriter(f), f) } } diff --git a/internal/utils/buffered_write_closer.go b/internal/utils/buffered_write_closer.go new file mode 100644 index 00000000..b5b9d6fc --- /dev/null +++ b/internal/utils/buffered_write_closer.go @@ -0,0 +1,26 @@ +package utils + +import ( + "bufio" + "io" +) + +type bufferedWriteCloser struct { + *bufio.Writer + io.Closer +} + +// NewBufferedWriteCloser creates an io.WriteCloser from a bufio.Writer and an io.Closer +func NewBufferedWriteCloser(writer *bufio.Writer, closer io.Closer) io.WriteCloser { + return &bufferedWriteCloser{ + Writer: writer, + Closer: closer, + } +} + +func (h bufferedWriteCloser) Close() error { + if err := h.Writer.Flush(); err != nil { + return err + } + return h.Closer.Close() +} diff --git a/internal/utils/buffered_write_closer_test.go b/internal/utils/buffered_write_closer_test.go new file mode 100644 index 00000000..9c93d615 --- /dev/null +++ b/internal/utils/buffered_write_closer_test.go @@ -0,0 +1,26 @@ +package utils + +import ( + "bufio" + "bytes" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +type nopCloser struct{} + +func (nopCloser) Close() error { return nil } + +var _ = Describe("buffered io.WriteCloser", func() { + It("flushes before closing", func() { + buf := &bytes.Buffer{} + + w := bufio.NewWriter(buf) + wc := NewBufferedWriteCloser(w, &nopCloser{}) + wc.Write([]byte("foobar")) + Expect(buf.Len()).To(BeZero()) + Expect(wc.Close()).To(Succeed()) + Expect(buf.String()).To(Equal("foobar")) + }) +}) diff --git a/interop/utils/logging.go b/interop/utils/logging.go index c5d814ea..3e01395d 100644 --- a/interop/utils/logging.go +++ b/interop/utils/logging.go @@ -7,6 +7,8 @@ import ( "log" "os" "strings" + + "github.com/lucas-clemente/quic-go/internal/utils" ) // GetSSLKeyLog creates a file for the TLS key log @@ -39,12 +41,6 @@ func GetQLOGWriter() (func(connID []byte) io.WriteCloser, error) { if err != nil { log.Fatalf("Failed to create qlog file %s: %s", path, err.Error()) } - return struct { - io.Writer - io.Closer - }{ - bufio.NewWriter(f), - f, - } + return utils.NewBufferedWriteCloser(bufio.NewWriter(f), f) }, nil }