package main import ( "bufio" "crypto/tls" "flag" "fmt" "io" "net/http" "net/url" "os" ) var tlsVersionToName = map[string]uint16{ "tls10": tls.VersionTLS10, "tls11": tls.VersionTLS11, "tls12": tls.VersionTLS12, "tls13": tls.VersionTLS13, } // Usage client args host:port func main() { var version string var addr string var enableEMS bool var resume bool var config tls.Config var cache tls.ClientSessionCache cache = tls.NewLRUClientSessionCache(0) flag.StringVar(&version, "version", "tls12", "Version of TLS to use") flag.BoolVar(&enableEMS, "m", false, "Enable EMS") flag.BoolVar(&resume, "r", false, "Attempt Resumption") flag.Parse() config.MinVersion = tlsVersionToName[version] config.MaxVersion = tlsVersionToName[version] config.InsecureSkipVerify = true config.UseExtendedMasterSecret = !enableEMS config.ClientSessionCache = cache var iters int if resume { iters = 2 } else { iters = 1 } addr = flag.Arg(0) for ; iters > 0; iters-- { conn, err := tls.Dial("tcp", addr, &config) if err != nil { fmt.Println("Error %s", err) os.Exit(1) } var req http.Request var response *http.Response req.Method = "GET" req.URL, err = url.Parse("https://" + addr + "/") if err != nil { fmt.Println("Failed to parse url") os.Exit(1) } req.Write(conn) reader := bufio.NewReader(conn) response, err = http.ReadResponse(reader, nil) if err != nil { fmt.Println("HTTP problem") fmt.Println(err) os.Exit(1) } io.Copy(os.Stdout, response.Body) conn.Close() if resume && iters == 2 { fmt.Println("Attempting resumption") } } os.Exit(0) }