From 7b7f769c4499fc37bf6a079b818ca393ceba2984 Mon Sep 17 00:00:00 2001 From: Vyacheslav Zubov Date: Sat, 23 Mar 2024 15:42:37 +0300 Subject: [PATCH 1/7] Update dns_linux.go It's ok if no original resolv.conf file found --- x/examples/outline-cli/dns_linux.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x/examples/outline-cli/dns_linux.go b/x/examples/outline-cli/dns_linux.go index bb34aee8..b2a6552c 100644 --- a/x/examples/outline-cli/dns_linux.go +++ b/x/examples/outline-cli/dns_linux.go @@ -15,6 +15,7 @@ package main import ( + "errors" "fmt" "os" ) @@ -44,7 +45,7 @@ func restoreSystemDNSServer() { } func backupAndWriteFile(original, backup string, data []byte) error { - if err := os.Rename(original, backup); err != nil { + if err := os.Rename(original, backup); err != nil && !errors.Is(err, os.ErrNotExist) { return fmt.Errorf("failed to backup DNS config file '%s' to '%s': %w", original, backup, err) } if err := os.WriteFile(original, data, 0644); err != nil { From e4c931c9df91d0a303c2e25f8b57ff15b5fad40f Mon Sep 17 00:00:00 2001 From: Slava Date: Mon, 15 Apr 2024 00:57:07 +0300 Subject: [PATCH 2/7] fix: example/outline-cli backup/restore dns files --- x/examples/outline-cli/app_linux.go | 3 +- x/examples/outline-cli/dns_linux.go | 56 +++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/x/examples/outline-cli/app_linux.go b/x/examples/outline-cli/app_linux.go index 9b35675e..23c5fe43 100644 --- a/x/examples/outline-cli/app_linux.go +++ b/x/examples/outline-cli/app_linux.go @@ -63,7 +63,8 @@ func (app App) Run() error { logging.Info.Printf("OutlineDevice -> tun stopped: %v %v\n", written, err) }() - if err := setSystemDNSServer(app.RoutingConfig.DNSServerIP); err != nil { + restoreSystemDNSServer, err := setSystemDNSServer(app.RoutingConfig.DNSServerIP) + if err != nil { return fmt.Errorf("failed to configure system DNS: %w", err) } defer restoreSystemDNSServer() diff --git a/x/examples/outline-cli/dns_linux.go b/x/examples/outline-cli/dns_linux.go index b2a6552c..9a17b7f6 100644 --- a/x/examples/outline-cli/dns_linux.go +++ b/x/examples/outline-cli/dns_linux.go @@ -28,30 +28,58 @@ const ( resolvConfHeadBackupFile = "/etc/resolv.head.outlinecli.backup" ) -func setSystemDNSServer(serverHost string) error { +// restoreBackup restore backup file function +type restoreBackup func() + +func setSystemDNSServer(serverHost string) (restoreBackup, error) { setting := []byte(`# Outline CLI DNS Setting # The original file has been renamed as resolv[.head].outlinecli.backup nameserver ` + serverHost + "\n") - if err := backupAndWriteFile(resolvConfFile, resolvConfBackupFile, setting); err != nil { - return err + restores := make([]restoreBackup, 0, 2) + restore := func() { + for _, restore := range restores { + restore() + } } - return backupAndWriteFile(resolvConfHeadFile, resolvConfHeadBackupFile, setting) -} -func restoreSystemDNSServer() { - restoreFileIfExists(resolvConfBackupFile, resolvConfFile) - restoreFileIfExists(resolvConfHeadBackupFile, resolvConfHeadFile) + restoreOriginal, err := backupAndWriteFile(resolvConfFile, resolvConfBackupFile, setting) + restores = append(restores, restoreOriginal) + if err != nil { + return restore, err + } + + restoreOriginalHead, err := backupAndWriteFile(resolvConfHeadFile, resolvConfHeadBackupFile, setting) + restores = append(restores, restoreOriginalHead) + + return restore, err } -func backupAndWriteFile(original, backup string, data []byte) error { - if err := os.Rename(original, backup); err != nil && !errors.Is(err, os.ErrNotExist) { - return fmt.Errorf("failed to backup DNS config file '%s' to '%s': %w", original, backup, err) +func backupAndWriteFile(original, backup string, data []byte) (restoreBackup, error) { + restore := func() { + // by default restore original file from backup + restoreFileIfExists(backup, original) } - if err := os.WriteFile(original, data, 0644); err != nil { - return fmt.Errorf("failed to write DNS config file '%s': %w", original, err) + + if err := os.Rename(original, backup); err != nil { + if errors.Is(err, os.ErrNotExist) { + // original file does not exist, so just remove created file by ourselves + restore = func() { + if err := os.Remove(original); err != nil { + logging.Warn.Printf("failed to remove our file '%s': %v\n", original, err) + } + } + } else { + return func() {}, fmt.Errorf("failed to backup DNS config file '%s' to '%s': %w", original, backup, err) + } + } + + err := os.WriteFile(original, data, 0o644) + if err != nil { + return func() {}, fmt.Errorf("failed to write DNS config file '%s': %w", original, err) } - return nil + + return restore, err } func restoreFileIfExists(backup, original string) { From fb2aa24ce8194281282cf37933fac0856274c0b3 Mon Sep 17 00:00:00 2001 From: Slava Date: Tue, 30 Apr 2024 23:09:42 +0300 Subject: [PATCH 3/7] fix: simplify examples/outline-cli/systemDNSBackup logic + gofumpt --- network/delegate_packet_proxy_test.go | 3 +- network/device.go | 8 +- network/dnstruncate/packet_proxy.go | 9 +- network/lwip2transport/device.go | 6 +- network/lwip2transport/udp.go | 6 +- network/packet_listener_proxy.go | 6 +- transport/happyeyeballs_test.go | 1 - transport/packet_test.go | 1 - transport/shadowsocks/stream_test.go | 3 +- transport/stream.go | 5 + transport/tlsfrag/buffer.go | 6 +- transport/tlsfrag/tls.go | 8 +- transport/tlsfrag/writer.go | 8 +- x/examples/fetch-speed/main.go | 2 +- x/examples/outline-cli/app_linux.go | 2 +- x/examples/outline-cli/dns_linux.go | 97 ++++++++++--------- x/examples/outline-cli/ipv6_linux.go | 2 +- .../outline-cli/outline_packet_proxy.go | 1 - .../app_desktop/main.go | 1 - .../shared_backend/main.go | 2 +- x/examples/resolve/main.go | 1 - x/examples/test-connectivity/main.go | 2 +- x/report/report_test.go | 22 ++--- 23 files changed, 111 insertions(+), 91 deletions(-) diff --git a/network/delegate_packet_proxy_test.go b/network/delegate_packet_proxy_test.go index 87021bd8..b0755f20 100644 --- a/network/delegate_packet_proxy_test.go +++ b/network/delegate_packet_proxy_test.go @@ -159,8 +159,7 @@ func (sp *sessionCountPacketProxy) Count() int { return int(sp.cnt.Load()) } -type noopPacketProxy struct { -} +type noopPacketProxy struct{} func (noopPacketProxy) NewSession(PacketResponseReceiver) (PacketRequestSender, error) { return nil, nil diff --git a/network/device.go b/network/device.go index 4596ff48..bee84c8f 100644 --- a/network/device.go +++ b/network/device.go @@ -19,11 +19,9 @@ import ( "syscall" ) -var ( - // ErrMsgSize is the error returned by a Write on a network device. It means that the size of the message to be - // sent is bigger than the maximum message size the device can process. - ErrMsgSize = fmt.Errorf("packet size is too big: %w", syscall.EMSGSIZE) -) +// ErrMsgSize is the error returned by a Write on a network device. It means that the size of the message to be +// sent is bigger than the maximum message size the device can process. +var ErrMsgSize = fmt.Errorf("packet size is too big: %w", syscall.EMSGSIZE) // IPDevice is a generic network device that reads and writes IP packets. It extends the [io.ReadWriteCloser] // interface. For better memory efficiency, we also recommend that you implement the [io.ReaderFrom] and [io.WriterTo] diff --git a/network/dnstruncate/packet_proxy.go b/network/dnstruncate/packet_proxy.go index 1098c3a0..6ccf8df2 100644 --- a/network/dnstruncate/packet_proxy.go +++ b/network/dnstruncate/packet_proxy.go @@ -67,8 +67,7 @@ var packetBufferPool = slicepool.MakePool(dnsUdpMaxMsgLen) // dnsTruncateProxy is a network.PacketProxy that create dnsTruncateRequestHandler to handle DNS requests locally. // // Multiple goroutines may invoke methods on a dnsTruncateProxy simultaneously. -type dnsTruncateProxy struct { -} +type dnsTruncateProxy struct{} // dnsTruncateRequestHandler is a network.PacketRequestSender that handles DNS requests in UDP protocol locally, // without sending the requests to the actual DNS resolver. It sets the TC (truncated) bit in the DNS response header @@ -81,8 +80,10 @@ type dnsTruncateRequestHandler struct { } // Compilation guard against interface implementation -var _ network.PacketProxy = (*dnsTruncateProxy)(nil) -var _ network.PacketRequestSender = (*dnsTruncateRequestHandler)(nil) +var ( + _ network.PacketProxy = (*dnsTruncateProxy)(nil) + _ network.PacketRequestSender = (*dnsTruncateRequestHandler)(nil) +) // NewPacketProxy creates a new [network.PacketProxy] that can be used to handle DNS requests if the remote proxy // doesn't support UDP traffic. It sets the TC (truncated) bit in the DNS response header to tell the caller to resend diff --git a/network/lwip2transport/device.go b/network/lwip2transport/device.go index d590beec..4bafd2b9 100644 --- a/network/lwip2transport/device.go +++ b/network/lwip2transport/device.go @@ -43,8 +43,10 @@ type lwIPDevice struct { } // Singleton instance -var instMu sync.Mutex -var inst *lwIPDevice = nil +var ( + instMu sync.Mutex + inst *lwIPDevice = nil +) // ConfigureDevice configures the singleton LwIP device using the [transport.StreamDialer] to handle TCP streams and // the [transport.PacketProxy] to handle UDP packets. diff --git a/network/lwip2transport/udp.go b/network/lwip2transport/udp.go index 4b3657f7..a56eb67a 100644 --- a/network/lwip2transport/udp.go +++ b/network/lwip2transport/udp.go @@ -24,8 +24,10 @@ import ( ) // Compilation guard against interface implementation -var _ lwip.UDPConnHandler = (*udpHandler)(nil) -var _ network.PacketResponseReceiver = (*udpConnResponseWriter)(nil) +var ( + _ lwip.UDPConnHandler = (*udpHandler)(nil) + _ network.PacketResponseReceiver = (*udpConnResponseWriter)(nil) +) type udpHandler struct { mu sync.Mutex // Protects the senders field diff --git a/network/packet_listener_proxy.go b/network/packet_listener_proxy.go index 446d4f80..30eb086a 100644 --- a/network/packet_listener_proxy.go +++ b/network/packet_listener_proxy.go @@ -34,8 +34,10 @@ const packetMaxSize = 2048 var packetBufferPool = slicepool.MakePool(packetMaxSize) // Compilation guard against interface implementation -var _ PacketProxy = (*PacketListenerProxy)(nil) -var _ PacketRequestSender = (*packetListenerRequestSender)(nil) +var ( + _ PacketProxy = (*PacketListenerProxy)(nil) + _ PacketRequestSender = (*packetListenerRequestSender)(nil) +) type PacketListenerProxy struct { listener transport.PacketListener diff --git a/transport/happyeyeballs_test.go b/transport/happyeyeballs_test.go index 5eb5502b..5c4dc979 100644 --- a/transport/happyeyeballs_test.go +++ b/transport/happyeyeballs_test.go @@ -134,7 +134,6 @@ func TestHappyEyeballsStreamDialer_DialStream(t *testing.T) { func(ctx context.Context, host string) ([]netip.Addr, error) { time.Sleep(10 * time.Millisecond) return []netip.Addr{netip.MustParseAddr("2001:4860:4860::8888")}, nil - }, func(ctx context.Context, host string) ([]netip.Addr, error) { return nil, errors.New("lookup failed") diff --git a/transport/packet_test.go b/transport/packet_test.go index d117f08a..8d773bdf 100644 --- a/transport/packet_test.go +++ b/transport/packet_test.go @@ -221,7 +221,6 @@ func TestPacketListenerDialer(t *testing.T) { n, err = conn.Read(receivedResponse) require.NoError(t, err) require.Equal(t, response, receivedResponse[:n]) - }() running.Wait() diff --git a/transport/shadowsocks/stream_test.go b/transport/shadowsocks/stream_test.go index cacc9a9c..4cea21ac 100644 --- a/transport/shadowsocks/stream_test.go +++ b/transport/shadowsocks/stream_test.go @@ -104,7 +104,8 @@ func TestCipherReaderGoodReads(t *testing.T) { ssText, err := encryptBlocks(key, salt, [][]byte{ []byte("[First Block]"), []byte(""), // Corner case: empty block - []byte("[Third Block]")}) + []byte("[Third Block]"), + }) if err != nil { t.Fatal(err) } diff --git a/transport/stream.go b/transport/stream.go index 60241354..12d7a3e2 100644 --- a/transport/stream.go +++ b/transport/stream.go @@ -42,18 +42,23 @@ var _ StreamConn = (*duplexConnAdaptor)(nil) func (dc *duplexConnAdaptor) Read(b []byte) (int, error) { return dc.r.Read(b) } + func (dc *duplexConnAdaptor) WriteTo(w io.Writer) (int64, error) { return io.Copy(w, dc.r) } + func (dc *duplexConnAdaptor) CloseRead() error { return dc.StreamConn.CloseRead() } + func (dc *duplexConnAdaptor) Write(b []byte) (int, error) { return dc.w.Write(b) } + func (dc *duplexConnAdaptor) ReadFrom(r io.Reader) (int64, error) { return io.Copy(dc.w, r) } + func (dc *duplexConnAdaptor) CloseWrite() error { return dc.StreamConn.CloseWrite() } diff --git a/transport/tlsfrag/buffer.go b/transport/tlsfrag/buffer.go index 33a6b67c..ad693dd9 100644 --- a/transport/tlsfrag/buffer.go +++ b/transport/tlsfrag/buffer.go @@ -40,8 +40,10 @@ type clientHelloBuffer struct { bufrd *bytes.Reader } -var _ io.Writer = (*clientHelloBuffer)(nil) -var _ io.ReaderFrom = (*clientHelloBuffer)(nil) +var ( + _ io.Writer = (*clientHelloBuffer)(nil) + _ io.ReaderFrom = (*clientHelloBuffer)(nil) +) // newClientHelloBuffer creates and initializes a new buffer to receive a TLS Client Hello packet. func newClientHelloBuffer() *clientHelloBuffer { diff --git a/transport/tlsfrag/tls.go b/transport/tlsfrag/tls.go index 3d74a1c9..e1be3115 100644 --- a/transport/tlsfrag/tls.go +++ b/transport/tlsfrag/tls.go @@ -20,9 +20,11 @@ import ( // This file contains helper functions and constants for TLS Client Hello message. -type recordType byte -type tlsVersion uint16 -type tlsRecordHeader []byte +type ( + recordType byte + tlsVersion uint16 + tlsRecordHeader []byte +) // TLS record layout from [RFC 8446]: // diff --git a/transport/tlsfrag/writer.go b/transport/tlsfrag/writer.go index 520f8379..e17db55b 100644 --- a/transport/tlsfrag/writer.go +++ b/transport/tlsfrag/writer.go @@ -43,9 +43,11 @@ type clientHelloFragReaderFrom struct { } // Compilation guard against interface implementation -var _ io.Writer = (*clientHelloFragWriter)(nil) -var _ io.Writer = (*clientHelloFragReaderFrom)(nil) -var _ io.ReaderFrom = (*clientHelloFragReaderFrom)(nil) +var ( + _ io.Writer = (*clientHelloFragWriter)(nil) + _ io.Writer = (*clientHelloFragReaderFrom)(nil) + _ io.ReaderFrom = (*clientHelloFragReaderFrom)(nil) +) // newClientHelloFragWriter creates a [io.Writer] that splits the first TLS Client Hello record into two records based // on the provided frag function. It then writes these records and all subsequent messages to the base [io.Writer]. diff --git a/x/examples/fetch-speed/main.go b/x/examples/fetch-speed/main.go index ab00a8e4..374be001 100644 --- a/x/examples/fetch-speed/main.go +++ b/x/examples/fetch-speed/main.go @@ -43,7 +43,7 @@ func main() { verboseFlag := flag.Bool("v", false, "Enable debug output") transportFlag := flag.String("transport", "", "Transport config") methodFlag := flag.String("method", "GET", "The HTTP method to use") - timeoutFlag := flag.Duration("timeout", 10 * time.Second, "The HTTP timeout value") + timeoutFlag := flag.Duration("timeout", 10*time.Second, "The HTTP timeout value") flag.Parse() diff --git a/x/examples/outline-cli/app_linux.go b/x/examples/outline-cli/app_linux.go index 23c5fe43..348efb17 100644 --- a/x/examples/outline-cli/app_linux.go +++ b/x/examples/outline-cli/app_linux.go @@ -63,7 +63,7 @@ func (app App) Run() error { logging.Info.Printf("OutlineDevice -> tun stopped: %v %v\n", written, err) }() - restoreSystemDNSServer, err := setSystemDNSServer(app.RoutingConfig.DNSServerIP) + err = setSystemDNSServer(app.RoutingConfig.DNSServerIP) if err != nil { return fmt.Errorf("failed to configure system DNS: %w", err) } diff --git a/x/examples/outline-cli/dns_linux.go b/x/examples/outline-cli/dns_linux.go index 9a17b7f6..46ef0934 100644 --- a/x/examples/outline-cli/dns_linux.go +++ b/x/examples/outline-cli/dns_linux.go @@ -28,68 +28,77 @@ const ( resolvConfHeadBackupFile = "/etc/resolv.head.outlinecli.backup" ) -// restoreBackup restore backup file function -type restoreBackup func() +// systemDNSBackup info about systemdns backup +type systemDNSBackup struct { + original, backup string +} + +var systemDNSBackups = make([]systemDNSBackup, 0, 2) -func setSystemDNSServer(serverHost string) (restoreBackup, error) { +func setSystemDNSServer(serverHost string) error { setting := []byte(`# Outline CLI DNS Setting # The original file has been renamed as resolv[.head].outlinecli.backup nameserver ` + serverHost + "\n") - restores := make([]restoreBackup, 0, 2) - restore := func() { - for _, restore := range restores { - restore() - } + err := backupAndWriteFile(resolvConfFile, resolvConfBackupFile, setting) + if err != nil { + return fmt.Errorf("dns backup: %w", err) } - restoreOriginal, err := backupAndWriteFile(resolvConfFile, resolvConfBackupFile, setting) - restores = append(restores, restoreOriginal) + err = backupAndWriteFile(resolvConfHeadFile, resolvConfHeadBackupFile, setting) if err != nil { - return restore, err + return fmt.Errorf("dns head backup: %w", err) } - restoreOriginalHead, err := backupAndWriteFile(resolvConfHeadFile, resolvConfHeadBackupFile, setting) - restores = append(restores, restoreOriginalHead) - - return restore, err + return nil } -func backupAndWriteFile(original, backup string, data []byte) (restoreBackup, error) { - restore := func() { - // by default restore original file from backup - restoreFileIfExists(backup, original) - } - - if err := os.Rename(original, backup); err != nil { - if errors.Is(err, os.ErrNotExist) { - // original file does not exist, so just remove created file by ourselves - restore = func() { - if err := os.Remove(original); err != nil { - logging.Warn.Printf("failed to remove our file '%s': %v\n", original, err) - } - } - } else { - return func() {}, fmt.Errorf("failed to backup DNS config file '%s' to '%s': %w", original, backup, err) +func backupAndWriteFile(original, backup string, data []byte) error { + if _, err := os.Stat(original); err == nil { + // original file exist - move it into backup + if err := os.Rename(original, backup); err != nil { + return fmt.Errorf("failed to backup DNS config file '%s' to '%s': %w", original, backup, err) } + } else if !errors.Is(err, os.ErrNotExist) { // if not exist - it's ok, just write to it + return errors.New("check original file exists") } - err := os.WriteFile(original, data, 0o644) - if err != nil { - return func() {}, fmt.Errorf("failed to write DNS config file '%s': %w", original, err) + // save data to original + if err := os.WriteFile(original, data, 0o644); err != nil { + return fmt.Errorf("failed to write DNS config file '%s': %w", original, err) } - return restore, err + systemDNSBackups = append(systemDNSBackups, systemDNSBackup{ + original: original, + backup: backup, + }) + + return nil } -func restoreFileIfExists(backup, original string) { - if _, err := os.Stat(backup); err != nil { - logging.Warn.Printf("no DNS config backup file '%s' presents: %v\n", backup, err) - return - } - if err := os.Rename(backup, original); err != nil { - logging.Err.Printf("failed to restore DNS config from backup '%s' to '%s': %v\n", backup, original, err) - return +func restoreSystemDNSServer() { + for _, backup := range systemDNSBackups { + if _, err := os.Stat(backup.backup); err == nil { + // backup exist - replace original with it + if err := os.Rename(backup.backup, backup.original); err != nil { + logging.Err.Printf( + "failed to restore DNS config from backup '%s' to '%s': %v\n", + backup.backup, + backup.original, + err, + ) + continue + } + logging.Info.Printf("DNS config restored from '%s' to '%s'\n", backup.backup, backup.original) + } else if errors.Is(err, os.ErrNotExist) { + // backup not exist - just remove original, because it's created by ourselves + if err := os.Remove(backup.original); err != nil { + logging.Err.Printf("removing original DNS config file '%s': %v", backup.original, err) + return + } + logging.Info.Printf("DNS config removed '%s'\n", backup.original) + } else { + logging.Err.Printf("checking backup '%s': %v", backup.backup, err) + } } - logging.Info.Printf("DNS config restored from '%s' to '%s'\n", backup, original) } diff --git a/x/examples/outline-cli/ipv6_linux.go b/x/examples/outline-cli/ipv6_linux.go index 5dd245e9..bd65a84c 100644 --- a/x/examples/outline-cli/ipv6_linux.go +++ b/x/examples/outline-cli/ipv6_linux.go @@ -40,7 +40,7 @@ func enableIPv6(enabled bool) (bool, error) { } else { disabledStr[0] = '1' } - if err := os.WriteFile(disableIPv6ProcFile, disabledStr, 0644); err != nil { + if err := os.WriteFile(disableIPv6ProcFile, disabledStr, 0o644); err != nil { return prevEnabled, fmt.Errorf("failed to write IPv6 config: %w", err) } diff --git a/x/examples/outline-cli/outline_packet_proxy.go b/x/examples/outline-cli/outline_packet_proxy.go index 2c58362d..73ef311b 100644 --- a/x/examples/outline-cli/outline_packet_proxy.go +++ b/x/examples/outline-cli/outline_packet_proxy.go @@ -56,7 +56,6 @@ func (proxy *outlinePacketProxy) testConnectivityAndRefresh(resolverAddr, domain dialer := transport.PacketListenerDialer{Listener: proxy.remotePl} dnsResolver := dns.NewUDPResolver(dialer, resolverAddr) result, err := connectivity.TestConnectivityWithResolver(context.Background(), dnsResolver, domain) - if err != nil { logging.Info.Printf("connectivity test failed. Refresh skipped. Error: %v\n", err) return err diff --git a/x/examples/outline-connectivity-app/app_desktop/main.go b/x/examples/outline-connectivity-app/app_desktop/main.go index 79f07095..f1465557 100644 --- a/x/examples/outline-connectivity-app/app_desktop/main.go +++ b/x/examples/outline-connectivity-app/app_desktop/main.go @@ -42,7 +42,6 @@ func main() { app, }, }) - if err != nil { println("Error:", err.Error()) } diff --git a/x/examples/outline-connectivity-app/shared_backend/main.go b/x/examples/outline-connectivity-app/shared_backend/main.go index 77bca73f..e262d24e 100644 --- a/x/examples/outline-connectivity-app/shared_backend/main.go +++ b/x/examples/outline-connectivity-app/shared_backend/main.go @@ -160,7 +160,7 @@ func makeErrorRecord(err error) *ConnectivityTestError { if err == nil { return nil } - var record = new(ConnectivityTestError) + record := new(ConnectivityTestError) var testErr *connectivity.TestError if errors.As(err, &testErr) { record.Op = testErr.Op diff --git a/x/examples/resolve/main.go b/x/examples/resolve/main.go index 9c73484d..b551082e 100644 --- a/x/examples/resolve/main.go +++ b/x/examples/resolve/main.go @@ -106,7 +106,6 @@ func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Duration(*timeoutFlag)*time.Second) defer cancel() response, err := resolver.Query(ctx, *q) - if err != nil { log.Fatalf("Query failed: %v", err) } diff --git a/x/examples/test-connectivity/main.go b/x/examples/test-connectivity/main.go index 8cc76c2c..ae2a917e 100644 --- a/x/examples/test-connectivity/main.go +++ b/x/examples/test-connectivity/main.go @@ -66,7 +66,7 @@ func makeErrorRecord(result *connectivity.ConnectivityError) *errorJSON { if result == nil { return nil } - var record = new(errorJSON) + record := new(errorJSON) record.Op = result.Op record.PosixError = result.PosixError record.Msg = unwrapAll(result.Err).Error() diff --git a/x/report/report_test.go b/x/report/report_test.go index 79054dc2..4e7f0e8d 100644 --- a/x/report/report_test.go +++ b/x/report/report_test.go @@ -62,7 +62,7 @@ type ConnectivityReport struct { } func TestIsSuccess(t *testing.T) { - var testReport = ConnectivityReport{ + testReport := ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -82,18 +82,18 @@ func TestIsSuccess(t *testing.T) { } func TestSendReportSuccessfully(t *testing.T) { - var testSetup = ConnectivitySetup{ + testSetup := ConnectivitySetup{ Proxy: "testProxy", Resolver: "8.8.8.8", Proto: "udp", Prefix: "HTTP1/1", } - var testErr = ConnectivityError{ + testErr := ConnectivityError{ Op: "read", PosixError: "ETIMEDOUT", Msg: "i/o timeout", } - var testReport = ConnectivityReport{ + testReport := ConnectivityReport{ Connection: testSetup, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -120,7 +120,7 @@ func TestSendReportSuccessfully(t *testing.T) { } func TestSendReportUnsuccessfully(t *testing.T) { - var testReport = ConnectivityReport{ + testReport := ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -152,7 +152,7 @@ func TestSendReportUnsuccessfully(t *testing.T) { } func TestSamplingCollector(t *testing.T) { - var testReport = ConnectivityReport{ + testReport := ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -181,7 +181,7 @@ func TestSamplingCollector(t *testing.T) { } func TestSendJSONToServer(t *testing.T) { - var testReport = ConnectivityReport{ + testReport := ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -221,7 +221,7 @@ func TestSendJSONToServer(t *testing.T) { } func TestFallbackCollector(t *testing.T) { - var testReport = ConnectivityReport{ + testReport := ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -258,7 +258,7 @@ func TestFallbackCollector(t *testing.T) { } func TestRetryCollector(t *testing.T) { - var testReport = ConnectivityReport{ + testReport := ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -289,7 +289,7 @@ func TestRetryCollector(t *testing.T) { } func TestWriteCollector(t *testing.T) { - var testReport = ConnectivityReport{ + testReport := ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -310,7 +310,7 @@ func TestWriteCollector(t *testing.T) { // TestWriteCollectorToFile that opens a file and collects to a temp file func TestWriteCollectorToFile(t *testing.T) { - var testReport = ConnectivityReport{ + testReport := ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, From 1601dfb5beac63bf8759e9b0d5c6a67176f0e3e2 Mon Sep 17 00:00:00 2001 From: Slava Date: Tue, 30 Apr 2024 23:18:39 +0300 Subject: [PATCH 4/7] fix: examples/outline-cli/restoreSystemDNSServer loop --- x/examples/outline-cli/dns_linux.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/examples/outline-cli/dns_linux.go b/x/examples/outline-cli/dns_linux.go index 46ef0934..b12f5cfe 100644 --- a/x/examples/outline-cli/dns_linux.go +++ b/x/examples/outline-cli/dns_linux.go @@ -94,7 +94,7 @@ func restoreSystemDNSServer() { // backup not exist - just remove original, because it's created by ourselves if err := os.Remove(backup.original); err != nil { logging.Err.Printf("removing original DNS config file '%s': %v", backup.original, err) - return + continue } logging.Info.Printf("DNS config removed '%s'\n", backup.original) } else { From 3ba1f81ea6f7fc8d0a858ba7b9d49d1014497aaa Mon Sep 17 00:00:00 2001 From: Slava Date: Tue, 30 Apr 2024 23:26:29 +0300 Subject: [PATCH 5/7] fix: transport/tlsfrag/tls.go fmt --- transport/tlsfrag/tls.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transport/tlsfrag/tls.go b/transport/tlsfrag/tls.go index 9c0cc5a3..9bf0941b 100644 --- a/transport/tlsfrag/tls.go +++ b/transport/tlsfrag/tls.go @@ -25,7 +25,7 @@ type ( recordType byte tlsVersion uint16 tlsRecordHeader []byte - tlsHandshakeRecordHeader []byte + tlsHandshakeRecordHeader []byte ) // TLS record layout from [RFC 8446]: From 5b1fa306805a25aeb491d98eeced7ddac56648c7 Mon Sep 17 00:00:00 2001 From: Slava Date: Wed, 29 May 2024 00:04:25 +0300 Subject: [PATCH 6/7] fix: revert style changes --- network/delegate_packet_proxy_test.go | 3 ++- network/device.go | 8 ++++--- network/dnstruncate/packet_proxy.go | 9 ++++---- network/lwip2transport/device.go | 6 ++--- network/lwip2transport/udp.go | 6 ++--- network/packet_listener_proxy.go | 6 ++--- transport/happyeyeballs_test.go | 1 + transport/packet_test.go | 1 + transport/shadowsocks/stream_test.go | 3 +-- transport/stream.go | 5 ---- transport/tlsfrag/buffer.go | 6 ++--- transport/tlsfrag/tls.go | 7 +----- transport/tlsfrag/writer.go | 8 +++---- x/examples/outline-cli/dns_linux.go | 23 +++++++++---------- .../app_desktop/main.go | 1 + .../shared_backend/main.go | 2 +- x/examples/resolve/main.go | 1 + x/examples/test-connectivity/main.go | 2 +- x/report/report_test.go | 22 +++++++++--------- 19 files changed, 52 insertions(+), 68 deletions(-) diff --git a/network/delegate_packet_proxy_test.go b/network/delegate_packet_proxy_test.go index b0755f20..87021bd8 100644 --- a/network/delegate_packet_proxy_test.go +++ b/network/delegate_packet_proxy_test.go @@ -159,7 +159,8 @@ func (sp *sessionCountPacketProxy) Count() int { return int(sp.cnt.Load()) } -type noopPacketProxy struct{} +type noopPacketProxy struct { +} func (noopPacketProxy) NewSession(PacketResponseReceiver) (PacketRequestSender, error) { return nil, nil diff --git a/network/device.go b/network/device.go index bee84c8f..4596ff48 100644 --- a/network/device.go +++ b/network/device.go @@ -19,9 +19,11 @@ import ( "syscall" ) -// ErrMsgSize is the error returned by a Write on a network device. It means that the size of the message to be -// sent is bigger than the maximum message size the device can process. -var ErrMsgSize = fmt.Errorf("packet size is too big: %w", syscall.EMSGSIZE) +var ( + // ErrMsgSize is the error returned by a Write on a network device. It means that the size of the message to be + // sent is bigger than the maximum message size the device can process. + ErrMsgSize = fmt.Errorf("packet size is too big: %w", syscall.EMSGSIZE) +) // IPDevice is a generic network device that reads and writes IP packets. It extends the [io.ReadWriteCloser] // interface. For better memory efficiency, we also recommend that you implement the [io.ReaderFrom] and [io.WriterTo] diff --git a/network/dnstruncate/packet_proxy.go b/network/dnstruncate/packet_proxy.go index 6ccf8df2..1098c3a0 100644 --- a/network/dnstruncate/packet_proxy.go +++ b/network/dnstruncate/packet_proxy.go @@ -67,7 +67,8 @@ var packetBufferPool = slicepool.MakePool(dnsUdpMaxMsgLen) // dnsTruncateProxy is a network.PacketProxy that create dnsTruncateRequestHandler to handle DNS requests locally. // // Multiple goroutines may invoke methods on a dnsTruncateProxy simultaneously. -type dnsTruncateProxy struct{} +type dnsTruncateProxy struct { +} // dnsTruncateRequestHandler is a network.PacketRequestSender that handles DNS requests in UDP protocol locally, // without sending the requests to the actual DNS resolver. It sets the TC (truncated) bit in the DNS response header @@ -80,10 +81,8 @@ type dnsTruncateRequestHandler struct { } // Compilation guard against interface implementation -var ( - _ network.PacketProxy = (*dnsTruncateProxy)(nil) - _ network.PacketRequestSender = (*dnsTruncateRequestHandler)(nil) -) +var _ network.PacketProxy = (*dnsTruncateProxy)(nil) +var _ network.PacketRequestSender = (*dnsTruncateRequestHandler)(nil) // NewPacketProxy creates a new [network.PacketProxy] that can be used to handle DNS requests if the remote proxy // doesn't support UDP traffic. It sets the TC (truncated) bit in the DNS response header to tell the caller to resend diff --git a/network/lwip2transport/device.go b/network/lwip2transport/device.go index 4bafd2b9..d590beec 100644 --- a/network/lwip2transport/device.go +++ b/network/lwip2transport/device.go @@ -43,10 +43,8 @@ type lwIPDevice struct { } // Singleton instance -var ( - instMu sync.Mutex - inst *lwIPDevice = nil -) +var instMu sync.Mutex +var inst *lwIPDevice = nil // ConfigureDevice configures the singleton LwIP device using the [transport.StreamDialer] to handle TCP streams and // the [transport.PacketProxy] to handle UDP packets. diff --git a/network/lwip2transport/udp.go b/network/lwip2transport/udp.go index a56eb67a..4b3657f7 100644 --- a/network/lwip2transport/udp.go +++ b/network/lwip2transport/udp.go @@ -24,10 +24,8 @@ import ( ) // Compilation guard against interface implementation -var ( - _ lwip.UDPConnHandler = (*udpHandler)(nil) - _ network.PacketResponseReceiver = (*udpConnResponseWriter)(nil) -) +var _ lwip.UDPConnHandler = (*udpHandler)(nil) +var _ network.PacketResponseReceiver = (*udpConnResponseWriter)(nil) type udpHandler struct { mu sync.Mutex // Protects the senders field diff --git a/network/packet_listener_proxy.go b/network/packet_listener_proxy.go index 30eb086a..446d4f80 100644 --- a/network/packet_listener_proxy.go +++ b/network/packet_listener_proxy.go @@ -34,10 +34,8 @@ const packetMaxSize = 2048 var packetBufferPool = slicepool.MakePool(packetMaxSize) // Compilation guard against interface implementation -var ( - _ PacketProxy = (*PacketListenerProxy)(nil) - _ PacketRequestSender = (*packetListenerRequestSender)(nil) -) +var _ PacketProxy = (*PacketListenerProxy)(nil) +var _ PacketRequestSender = (*packetListenerRequestSender)(nil) type PacketListenerProxy struct { listener transport.PacketListener diff --git a/transport/happyeyeballs_test.go b/transport/happyeyeballs_test.go index 5c4dc979..5eb5502b 100644 --- a/transport/happyeyeballs_test.go +++ b/transport/happyeyeballs_test.go @@ -134,6 +134,7 @@ func TestHappyEyeballsStreamDialer_DialStream(t *testing.T) { func(ctx context.Context, host string) ([]netip.Addr, error) { time.Sleep(10 * time.Millisecond) return []netip.Addr{netip.MustParseAddr("2001:4860:4860::8888")}, nil + }, func(ctx context.Context, host string) ([]netip.Addr, error) { return nil, errors.New("lookup failed") diff --git a/transport/packet_test.go b/transport/packet_test.go index 8d773bdf..d117f08a 100644 --- a/transport/packet_test.go +++ b/transport/packet_test.go @@ -221,6 +221,7 @@ func TestPacketListenerDialer(t *testing.T) { n, err = conn.Read(receivedResponse) require.NoError(t, err) require.Equal(t, response, receivedResponse[:n]) + }() running.Wait() diff --git a/transport/shadowsocks/stream_test.go b/transport/shadowsocks/stream_test.go index 4cea21ac..cacc9a9c 100644 --- a/transport/shadowsocks/stream_test.go +++ b/transport/shadowsocks/stream_test.go @@ -104,8 +104,7 @@ func TestCipherReaderGoodReads(t *testing.T) { ssText, err := encryptBlocks(key, salt, [][]byte{ []byte("[First Block]"), []byte(""), // Corner case: empty block - []byte("[Third Block]"), - }) + []byte("[Third Block]")}) if err != nil { t.Fatal(err) } diff --git a/transport/stream.go b/transport/stream.go index c8004f05..a628d13f 100644 --- a/transport/stream.go +++ b/transport/stream.go @@ -42,19 +42,15 @@ var _ StreamConn = (*duplexConnAdaptor)(nil) func (dc *duplexConnAdaptor) Read(b []byte) (int, error) { return dc.r.Read(b) } - func (dc *duplexConnAdaptor) WriteTo(w io.Writer) (int64, error) { return io.Copy(w, dc.r) } - func (dc *duplexConnAdaptor) CloseRead() error { return dc.StreamConn.CloseRead() } - func (dc *duplexConnAdaptor) Write(b []byte) (int, error) { return dc.w.Write(b) } - func (dc *duplexConnAdaptor) ReadFrom(r io.Reader) (int64, error) { // Make sure we prefer ReadFrom. Otherwise io.Copy will try WriteTo first. if rf, ok := r.(io.ReaderFrom); ok { @@ -62,7 +58,6 @@ func (dc *duplexConnAdaptor) ReadFrom(r io.Reader) (int64, error) { } return io.Copy(dc.w, r) } - func (dc *duplexConnAdaptor) CloseWrite() error { return dc.StreamConn.CloseWrite() } diff --git a/transport/tlsfrag/buffer.go b/transport/tlsfrag/buffer.go index 2482bc3d..0bcc76b5 100644 --- a/transport/tlsfrag/buffer.go +++ b/transport/tlsfrag/buffer.go @@ -36,10 +36,8 @@ type clientHelloBuffer struct { bufrd *bytes.Reader } -var ( - _ io.Writer = (*clientHelloBuffer)(nil) - _ io.ReaderFrom = (*clientHelloBuffer)(nil) -) +var _ io.Writer = (*clientHelloBuffer)(nil) +var _ io.ReaderFrom = (*clientHelloBuffer)(nil) // newClientHelloBuffer creates and initializes a new buffer to receive a TLS Client Hello packet. func newClientHelloBuffer() *clientHelloBuffer { diff --git a/transport/tlsfrag/tls.go b/transport/tlsfrag/tls.go index 9bf0941b..95b55d13 100644 --- a/transport/tlsfrag/tls.go +++ b/transport/tlsfrag/tls.go @@ -21,12 +21,7 @@ import ( // This file contains helper functions and constants for TLS Client Hello message. -type ( - recordType byte - tlsVersion uint16 - tlsRecordHeader []byte - tlsHandshakeRecordHeader []byte -) +type tlsHandshakeRecordHeader []byte // TLS record layout from [RFC 8446]: // diff --git a/transport/tlsfrag/writer.go b/transport/tlsfrag/writer.go index 7bd45809..494aa223 100644 --- a/transport/tlsfrag/writer.go +++ b/transport/tlsfrag/writer.go @@ -43,11 +43,9 @@ type clientHelloFragReaderFrom struct { } // Compilation guard against interface implementation -var ( - _ io.Writer = (*clientHelloFragWriter)(nil) - _ io.Writer = (*clientHelloFragReaderFrom)(nil) - _ io.ReaderFrom = (*clientHelloFragReaderFrom)(nil) -) +var _ io.Writer = (*clientHelloFragWriter)(nil) +var _ io.Writer = (*clientHelloFragReaderFrom)(nil) +var _ io.ReaderFrom = (*clientHelloFragReaderFrom)(nil) // newClientHelloFragWriter creates a [io.Writer] that splits the first TLS Client Hello record into two records // based on the provided [FragFunc] callback. diff --git a/x/examples/outline-cli/dns_linux.go b/x/examples/outline-cli/dns_linux.go index b12f5cfe..8f608c84 100644 --- a/x/examples/outline-cli/dns_linux.go +++ b/x/examples/outline-cli/dns_linux.go @@ -28,7 +28,6 @@ const ( resolvConfHeadBackupFile = "/etc/resolv.head.outlinecli.backup" ) -// systemDNSBackup info about systemdns backup type systemDNSBackup struct { original, backup string } @@ -42,12 +41,12 @@ nameserver ` + serverHost + "\n") err := backupAndWriteFile(resolvConfFile, resolvConfBackupFile, setting) if err != nil { - return fmt.Errorf("dns backup: %w", err) + return err } err = backupAndWriteFile(resolvConfHeadFile, resolvConfHeadBackupFile, setting) if err != nil { - return fmt.Errorf("dns head backup: %w", err) + return err } return nil @@ -60,12 +59,7 @@ func backupAndWriteFile(original, backup string, data []byte) error { return fmt.Errorf("failed to backup DNS config file '%s' to '%s': %w", original, backup, err) } } else if !errors.Is(err, os.ErrNotExist) { // if not exist - it's ok, just write to it - return errors.New("check original file exists") - } - - // save data to original - if err := os.WriteFile(original, data, 0o644); err != nil { - return fmt.Errorf("failed to write DNS config file '%s': %w", original, err) + return fmt.Errorf("failed to check the existence of DNS config file '%s': %w", original, err) } systemDNSBackups = append(systemDNSBackups, systemDNSBackup{ @@ -73,6 +67,11 @@ func backupAndWriteFile(original, backup string, data []byte) error { backup: backup, }) + // save data to original + if err := os.WriteFile(original, data, 0o644); err != nil { + return fmt.Errorf("failed to write DNS config file '%s': %w", original, err) + } + return nil } @@ -93,12 +92,12 @@ func restoreSystemDNSServer() { } else if errors.Is(err, os.ErrNotExist) { // backup not exist - just remove original, because it's created by ourselves if err := os.Remove(backup.original); err != nil { - logging.Err.Printf("removing original DNS config file '%s': %v", backup.original, err) + logging.Err.Printf("failed to remove Outline DNS config file '%s': %v\n", backup.original, err) continue } - logging.Info.Printf("DNS config removed '%s'\n", backup.original) + logging.Info.Printf("Outline DNS config '%s' has been removed\n", backup.original) } else { - logging.Err.Printf("checking backup '%s': %v", backup.backup, err) + logging.Err.Printf("failed to check the existence of DNS config backup file '%s': %v\n", backup.backup, err) } } } diff --git a/x/examples/outline-connectivity-app/app_desktop/main.go b/x/examples/outline-connectivity-app/app_desktop/main.go index f1465557..79f07095 100644 --- a/x/examples/outline-connectivity-app/app_desktop/main.go +++ b/x/examples/outline-connectivity-app/app_desktop/main.go @@ -42,6 +42,7 @@ func main() { app, }, }) + if err != nil { println("Error:", err.Error()) } diff --git a/x/examples/outline-connectivity-app/shared_backend/main.go b/x/examples/outline-connectivity-app/shared_backend/main.go index e262d24e..77bca73f 100644 --- a/x/examples/outline-connectivity-app/shared_backend/main.go +++ b/x/examples/outline-connectivity-app/shared_backend/main.go @@ -160,7 +160,7 @@ func makeErrorRecord(err error) *ConnectivityTestError { if err == nil { return nil } - record := new(ConnectivityTestError) + var record = new(ConnectivityTestError) var testErr *connectivity.TestError if errors.As(err, &testErr) { record.Op = testErr.Op diff --git a/x/examples/resolve/main.go b/x/examples/resolve/main.go index fac7abe4..4daab84b 100644 --- a/x/examples/resolve/main.go +++ b/x/examples/resolve/main.go @@ -108,6 +108,7 @@ func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Duration(*timeoutFlag)*time.Second) defer cancel() response, err := resolver.Query(ctx, *q) + if err != nil { log.Fatalf("Query failed: %v", err) } diff --git a/x/examples/test-connectivity/main.go b/x/examples/test-connectivity/main.go index 301d8967..5e8f707c 100644 --- a/x/examples/test-connectivity/main.go +++ b/x/examples/test-connectivity/main.go @@ -67,7 +67,7 @@ func makeErrorRecord(result *connectivity.ConnectivityError) *errorJSON { if result == nil { return nil } - record := new(errorJSON) + var record = new(errorJSON) record.Op = result.Op record.PosixError = result.PosixError record.Msg = unwrapAll(result.Err).Error() diff --git a/x/report/report_test.go b/x/report/report_test.go index 4e7f0e8d..79054dc2 100644 --- a/x/report/report_test.go +++ b/x/report/report_test.go @@ -62,7 +62,7 @@ type ConnectivityReport struct { } func TestIsSuccess(t *testing.T) { - testReport := ConnectivityReport{ + var testReport = ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -82,18 +82,18 @@ func TestIsSuccess(t *testing.T) { } func TestSendReportSuccessfully(t *testing.T) { - testSetup := ConnectivitySetup{ + var testSetup = ConnectivitySetup{ Proxy: "testProxy", Resolver: "8.8.8.8", Proto: "udp", Prefix: "HTTP1/1", } - testErr := ConnectivityError{ + var testErr = ConnectivityError{ Op: "read", PosixError: "ETIMEDOUT", Msg: "i/o timeout", } - testReport := ConnectivityReport{ + var testReport = ConnectivityReport{ Connection: testSetup, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -120,7 +120,7 @@ func TestSendReportSuccessfully(t *testing.T) { } func TestSendReportUnsuccessfully(t *testing.T) { - testReport := ConnectivityReport{ + var testReport = ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -152,7 +152,7 @@ func TestSendReportUnsuccessfully(t *testing.T) { } func TestSamplingCollector(t *testing.T) { - testReport := ConnectivityReport{ + var testReport = ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -181,7 +181,7 @@ func TestSamplingCollector(t *testing.T) { } func TestSendJSONToServer(t *testing.T) { - testReport := ConnectivityReport{ + var testReport = ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -221,7 +221,7 @@ func TestSendJSONToServer(t *testing.T) { } func TestFallbackCollector(t *testing.T) { - testReport := ConnectivityReport{ + var testReport = ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -258,7 +258,7 @@ func TestFallbackCollector(t *testing.T) { } func TestRetryCollector(t *testing.T) { - testReport := ConnectivityReport{ + var testReport = ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -289,7 +289,7 @@ func TestRetryCollector(t *testing.T) { } func TestWriteCollector(t *testing.T) { - testReport := ConnectivityReport{ + var testReport = ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, @@ -310,7 +310,7 @@ func TestWriteCollector(t *testing.T) { // TestWriteCollectorToFile that opens a file and collects to a temp file func TestWriteCollectorToFile(t *testing.T) { - testReport := ConnectivityReport{ + var testReport = ConnectivityReport{ Connection: nil, Time: time.Now().UTC().Truncate(time.Second), DurationMs: 1, From 72f5d05308b01db4a4953eda1245439952564d54 Mon Sep 17 00:00:00 2001 From: Slava Date: Wed, 29 May 2024 00:13:17 +0300 Subject: [PATCH 7/7] fix: revert --- transport/tlsfrag/tls.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/transport/tlsfrag/tls.go b/transport/tlsfrag/tls.go index 95b55d13..b58ce493 100644 --- a/transport/tlsfrag/tls.go +++ b/transport/tlsfrag/tls.go @@ -19,8 +19,6 @@ import ( "errors" ) -// This file contains helper functions and constants for TLS Client Hello message. - type tlsHandshakeRecordHeader []byte // TLS record layout from [RFC 8446]: