Skip to content

Instantly share code, notes, and snippets.

@marten-seemann
Created December 14, 2023 03:56
Show Gist options
  • Save marten-seemann/9cdc4166abb23860e374c9d7488cba45 to your computer and use it in GitHub Desktop.
Save marten-seemann/9cdc4166abb23860e374c9d7488cba45 to your computer and use it in GitHub Desktop.
package main
import (
"context"
"crypto/tls"
"fmt"
"io"
"log"
"net/http"
"time"
"golang.org/x/net/http2"
)
func main() {
go startHttp2Server()
time.Sleep(100 * time.Millisecond)
if err := startHttp2Client(); err != nil {
log.Fatalf("Error in HTTP/2 client: %v", err)
}
}
func startHttp2Server() {
server := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(handle),
TLSConfig: &tls.Config{
NextProtos: []string{"h2"}, // Specify HTTP/2 protocol
},
}
log.Println("Starting HTTP/2 server on :8080")
log.Fatal(server.ListenAndServeTLS("server.crt", "server.key"))
}
func handle(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
time.Sleep(time.Second)
fmt.Fprintf(w, "Hello, HTTP/2 client!")
}
func startHttp2Client() error {
client := http.Client{
Transport: &http2.Transport{
TLSClientConfig: &tls.Config{
NextProtos: []string{"h2"},
InsecureSkipVerify: true,
},
},
}
ctx, cancel := context.WithCancel(context.Background())
time.AfterFunc(100*time.Millisecond, cancel)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://localhost:8080", nil)
if err != nil {
return err
}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("%#v\n", err)
return err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
fmt.Printf("Response from server: %s\n", body)
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment