1234567891011121314151617181920212223242526272829303132333435363738394041 |
- // Copyright (C) 2015 The Syncthing Authors.
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
- // You can obtain one at https://mozilla.org/MPL/2.0/.
- package osutil
- import (
- "context"
- "net/url"
- "time"
- "github.com/syncthing/syncthing/lib/dialer"
- )
- // TCPPing returns the duration required to establish a TCP connection
- // to the given host. ICMP packets require root privileges, hence why we use
- // tcp.
- func TCPPing(ctx context.Context, address string) (time.Duration, error) {
- start := time.Now()
- ctx, cancel := context.WithTimeout(ctx, time.Second)
- defer cancel()
- conn, err := dialer.DialContext(ctx, "tcp", address)
- if err == nil {
- conn.Close()
- }
- return time.Since(start), err
- }
- // GetLatencyForURL parses the given URL, tries opening a TCP connection to it
- // and returns the time it took to establish the connection.
- func GetLatencyForURL(ctx context.Context, addr string) (time.Duration, error) {
- uri, err := url.Parse(addr)
- if err != nil {
- return 0, err
- }
- return TCPPing(ctx, uri.Host)
- }
|