package main import ( "crypto/tls" "crypto/x509" "flag" "fmt" "io" "io/ioutil" "log" "net/http" "strings" "sync" _ "net/http/pprof" "github.com/lucas-clemente/quic-go/h2quic" "github.com/lucas-clemente/quic-go/testdata" "github.com/lucas-clemente/quic-go/utils" ) type binds []string func (b binds) String() string { return strings.Join(b, ",") } func (b *binds) Set(v string) error { *b = strings.Split(v, ",") return nil } func init() { http.HandleFunc("/demo/tile", func(w http.ResponseWriter, r *http.Request) { // Small 40x40 png w.Write([]byte{ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x01, 0x03, 0x00, 0x00, 0x00, 0xb6, 0x30, 0x2a, 0x2e, 0x00, 0x00, 0x00, 0x03, 0x50, 0x4c, 0x54, 0x45, 0x5a, 0xc3, 0x5a, 0xad, 0x38, 0xaa, 0xdb, 0x00, 0x00, 0x00, 0x0b, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0x63, 0x18, 0x61, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xe2, 0xb8, 0x75, 0x22, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }) }) http.HandleFunc("/demo/tiles", func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "") for i := 0; i < 200; i++ { fmt.Fprintf(w, ``, i) } io.WriteString(w, "") }) http.HandleFunc("/demo/echo", func(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { fmt.Printf("error reading body while handling /echo: %s\n", err.Error()) } w.Write(body) }) } func main() { go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }() // runtime.SetBlockProfileRate(1) verbose := flag.Bool("v", false, "verbose") bs := binds{} flag.Var(&bs, "bind", "bind to") certPath := flag.String("certpath", "", "certificate directory") www := flag.String("www", "/var/www", "www data") flag.Parse() if *verbose { utils.SetLogLevel(utils.LogLevelDebug) } else { utils.SetLogLevel(utils.LogLevelInfo) } var tlsConfig *tls.Config if *certPath == "" { tlsConfig = testdata.GetTLSConfig() } else { var err error tlsConfig, err = tlsConfigFromCertpath(*certPath) if err != nil { panic(err) } } http.Handle("/", http.FileServer(http.Dir(*www))) if len(bs) == 0 { bs = binds{"localhost:6121"} } var wg sync.WaitGroup wg.Add(len(bs)) for _, b := range bs { bCap := b go func() { server := h2quic.Server{ // CloseAfterFirstRequest: true, Server: &http.Server{ Addr: bCap, TLSConfig: tlsConfig, }, } err := server.ListenAndServe() if err != nil { fmt.Println(err) } wg.Done() }() } wg.Wait() } func tlsConfigFromCertpath(certpath string) (*tls.Config, error) { keyDer, err := ioutil.ReadFile(certpath + "/key.der") if err != nil { return nil, err } certDer, err := ioutil.ReadFile(certpath + "/cert.der") if err != nil { return nil, err } key, err := x509.ParsePKCS1PrivateKey(keyDer) if err != nil { return nil, err } return &tls.Config{ Certificates: []tls.Certificate{{ Certificate: [][]byte{certDer}, PrivateKey: key, }}, }, nil }