Skip to content

Instantly share code, notes, and snippets.

@aojea
Created May 2, 2022 11:03
Show Gist options
  • Save aojea/4e172d7f3835cd3ffc6ea4f83eea6608 to your computer and use it in GitHub Desktop.
Save aojea/4e172d7f3835cd3ffc6ea4f83eea6608 to your computer and use it in GitHub Desktop.
package main
import (
"context"
"crypto/tls"
"fmt"
"io"
"log"
"net"
"net/http"
"net/http/httptest"
"net/url"
"time"
)
func main() {
ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %s", r.Proto)
}))
ts.EnableHTTP2 = true
ts.StartTLS()
u, err := url.Parse(ts.URL)
if err != nil {
panic(err)
}
tlsConfig := &tls.Config{
ServerName: "fake",
InsecureSkipVerify: false,
}
dialer := &net.Dialer{
Timeout: 30 * time.Second,
}
c, err := dialer.DialContext(context.TODO(), "tcp", u.Host)
if err != nil {
log.Println(err)
return
}
tlsConn := tls.Client(c, tlsConfig)
if err := tlsConn.HandshakeContext(context.TODO()); err != nil {
log.Println("HANDSHAKE error", err)
}
tlsDialer := tls.Dialer{
NetDialer: dialer,
Config: tlsConfig,
}
conn, err := tlsDialer.DialContext(context.TODO(), "tcp", u.Host)
if err != nil {
log.Println("TLS DIALER ERROR", err)
}
defer conn.Close()
n, err := conn.Write([]byte("hello\n"))
if err != nil {
log.Println(n, err)
return
}
buf := make([]byte, 100)
n, err = conn.Read(buf)
if err != nil {
log.Println(n, err)
return
}
fmt.Println(string(buf[:n]))
client := ts.Client()
resp, err := client.Get(ts.URL)
if err != nil {
// handle error
}
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if string(data) != "Hello, HTTP/2.0" {
panic("unexpected response")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment