1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00
srs/trunk/research/http1-to-2/main.go

63 lines
1.6 KiB
Go

package main
import (
"context"
"crypto/tls"
"flag"
"fmt"
"golang.org/x/net/http2"
"net"
"net/http"
"net/http/httputil"
"net/url"
"os"
"strings"
)
func main() {
var listen string
flag.StringVar(&listen, "listen", ":4317", "The listen endpoint, overwrite by env SRS_HTTP1TO2_LISTEN, such as :4317")
var backend string
flag.StringVar(&backend, "backend", "ap-guangzhou.apm.tencentcs.com:4317", "The proxy backend, overwrite by env SRS_HTTP1TO2_BACKEND, such as ap-guangzhou.apm.tencentcs.com:4317")
flag.Parse()
if os.Getenv("SRS_HTTP1TO2_LISTEN") != "" {
listen = os.Getenv("SRS_HTTP1TO2_LISTEN")
}
if os.Getenv("SRS_HTTP1TO2_BACKEND") != "" {
backend = os.Getenv("SRS_HTTP1TO2_BACKEND")
}
wrapURL := func(backend string) string {
if !strings.HasPrefix(backend, "http://") && !strings.HasPrefix(backend, "https://") {
return "http://" + backend
}
return backend
}
u, err := url.Parse(wrapURL(backend))
if err != nil {
panic(err)
}
fmt.Println(fmt.Sprintf("Proxy HTTP1 to HTTP2, listen=%v, backend=%v, url=%v", listen, backend, u))
// Proxy HTTP/1 requests to HTTP/2 server.
p := httputil.NewSingleHostReverseProxy(u)
p.Transport = &http2.Transport{
AllowHTTP: true,
DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) {
return (&net.Dialer{}).DialContext(ctx, network, addr)
},
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Println(fmt.Sprintf("Proxy to %v, req=%v", u, r.URL))
p.ServeHTTP(w, r)
})
if err := http.ListenAndServe(listen, nil); err != nil {
panic(err)
}
}