From 89728126ccd12e452cb4ae0922f09cda469dcac8 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 12 Feb 2020 11:48:31 +0700 Subject: [PATCH 1/2] move function to create the TLS key log file to a separate file --- interop/client/main.go | 20 ++++++++++---------- interop/server/main.go | 18 ++++++++---------- interop/utils/logging.go | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+), 20 deletions(-) create mode 100644 interop/utils/logging.go diff --git a/interop/client/main.go b/interop/client/main.go index b7858ea9..90c748d0 100644 --- a/interop/client/main.go +++ b/interop/client/main.go @@ -11,10 +11,12 @@ import ( "os" "strings" + "golang.org/x/sync/errgroup" + "github.com/lucas-clemente/quic-go/http3" "github.com/lucas-clemente/quic-go/internal/protocol" "github.com/lucas-clemente/quic-go/interop/http09" - "golang.org/x/sync/errgroup" + "github.com/lucas-clemente/quic-go/interop/utils" ) var errUnsupported = errors.New("unsupported test case") @@ -30,15 +32,13 @@ func main() { defer logFile.Close() log.SetOutput(logFile) - var keyLog io.Writer - if filename := os.Getenv("SSLKEYLOGFILE"); len(filename) > 0 { - f, err := os.Create(filename) - if err != nil { - fmt.Printf("Could not create key log file: %s\n", err.Error()) - os.Exit(1) - } - defer f.Close() - keyLog = f + keyLog, err := utils.GetSSLKeyLog() + if err != nil { + fmt.Printf("Could not create key log: %s\n", err.Error()) + os.Exit(1) + } + if keyLog != nil { + defer keyLog.Close() } tlsConf = &tls.Config{ diff --git a/interop/server/main.go b/interop/server/main.go index c3186676..bdaee82d 100644 --- a/interop/server/main.go +++ b/interop/server/main.go @@ -3,7 +3,6 @@ package main import ( "crypto/tls" "fmt" - "io" "log" "net" "net/http" @@ -13,6 +12,7 @@ import ( "github.com/lucas-clemente/quic-go/http3" "github.com/lucas-clemente/quic-go/internal/testdata" "github.com/lucas-clemente/quic-go/interop/http09" + "github.com/lucas-clemente/quic-go/interop/utils" ) var tlsConf *tls.Config @@ -26,15 +26,13 @@ func main() { defer logFile.Close() log.SetOutput(logFile) - var keyLog io.Writer - if filename := os.Getenv("SSLKEYLOGFILE"); len(filename) > 0 { - f, err := os.Create(filename) - if err != nil { - fmt.Printf("Could not create key log file: %s\n", err.Error()) - os.Exit(1) - } - defer f.Close() - keyLog = f + keyLog, err := utils.GetSSLKeyLog() + if err != nil { + fmt.Printf("Could not create key log: %s\n", err.Error()) + os.Exit(1) + } + if keyLog != nil { + defer keyLog.Close() } testcase := os.Getenv("TESTCASE") diff --git a/interop/utils/logging.go b/interop/utils/logging.go new file mode 100644 index 00000000..11e4e897 --- /dev/null +++ b/interop/utils/logging.go @@ -0,0 +1,19 @@ +package utils + +import ( + "io" + "os" +) + +// GetSSLKeyLog creates a file for the TLS key log +func GetSSLKeyLog() (io.WriteCloser, error) { + filename := os.Getenv("SSLKEYLOGFILE") + if len(filename) == 0 { + return nil, nil + } + f, err := os.Create(filename) + if err != nil { + return nil, err + } + return f, nil +} From 5aaab80698312018bfd47ad3e04e892ff01d6cff Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 12 Feb 2020 11:55:23 +0700 Subject: [PATCH 2/2] export qlog files if the QLOGDIR env is set in interop client and server --- interop/client/main.go | 17 +++++++++++++++-- interop/server/main.go | 8 +++++++- interop/utils/logging.go | 24 ++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/interop/client/main.go b/interop/client/main.go index 90c748d0..1f051f1e 100644 --- a/interop/client/main.go +++ b/interop/client/main.go @@ -13,6 +13,7 @@ import ( "golang.org/x/sync/errgroup" + "github.com/lucas-clemente/quic-go" "github.com/lucas-clemente/quic-go/http3" "github.com/lucas-clemente/quic-go/internal/protocol" "github.com/lucas-clemente/quic-go/interop/http09" @@ -60,9 +61,18 @@ func runTestcase(testcase string) error { flag.Parse() urls := flag.Args() + getLogWriter, err := utils.GetQLOGWriter() + if err != nil { + return err + } + quicConf := &quic.Config{GetLogWriter: getLogWriter} + switch testcase { case "http3": - r := &http3.RoundTripper{TLSClientConfig: tlsConf} + r := &http3.RoundTripper{ + TLSClientConfig: tlsConf, + QuicConfig: quicConf, + } defer r.Close() return downloadFiles(r, urls) case "handshake", "transfer", "retry": @@ -76,7 +86,10 @@ func runTestcase(testcase string) error { return errUnsupported } - r := &http09.RoundTripper{TLSClientConfig: tlsConf} + r := &http09.RoundTripper{ + TLSClientConfig: tlsConf, + QuicConfig: quicConf, + } defer r.Close() return downloadFiles(r, urls) } diff --git a/interop/server/main.go b/interop/server/main.go index bdaee82d..7f348451 100644 --- a/interop/server/main.go +++ b/interop/server/main.go @@ -37,9 +37,15 @@ func main() { testcase := os.Getenv("TESTCASE") + getLogWriter, err := utils.GetQLOGWriter() + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } // a quic.Config that doesn't do a Retry quicConf := &quic.Config{ - AcceptToken: func(_ net.Addr, _ *quic.Token) bool { return true }, + AcceptToken: func(_ net.Addr, _ *quic.Token) bool { return true }, + GetLogWriter: getLogWriter, } tlsConf = testdata.GetTLSConfig() tlsConf.KeyLogWriter = keyLog diff --git a/interop/utils/logging.go b/interop/utils/logging.go index 11e4e897..97eb297a 100644 --- a/interop/utils/logging.go +++ b/interop/utils/logging.go @@ -1,8 +1,11 @@ package utils import ( + "fmt" "io" + "log" "os" + "strings" ) // GetSSLKeyLog creates a file for the TLS key log @@ -17,3 +20,24 @@ func GetSSLKeyLog() (io.WriteCloser, error) { } return f, nil } + +// GetQLOGWriter creates the QLOGDIR and returns the GetLogWriter callback +func GetQLOGWriter() (func(connID []byte) io.WriteCloser, error) { + qlogDir := os.Getenv("QLOGDIR") + if len(qlogDir) == 0 { + return nil, nil + } + if _, err := os.Stat(qlogDir); os.IsNotExist(err) { + if err := os.MkdirAll(qlogDir, 0666); err != nil { + return nil, fmt.Errorf("failed to create qlog dir %s: %s", qlogDir, err.Error()) + } + } + return func(connID []byte) io.WriteCloser { + path := fmt.Sprintf("%s/%x.qlog", strings.TrimRight(qlogDir, "/"), connID) + f, err := os.Create(path) + if err != nil { + log.Fatalf("Failed to create qlog file %s: %s", path, err.Error()) + } + return f + }, nil +}