From bd5bd7a25ce566b7d223d1eca13a587e15f99b47 Mon Sep 17 00:00:00 2001 From: "rui.zheng" Date: Tue, 1 Aug 2017 22:19:52 +0800 Subject: [PATCH] add HTTP2 example --- gost/examples/bench/srv.go | 2 +- gost/examples/http2/srv.go | 131 +++++++++++++++++++++++++++++++++++++ gost/http2.go | 30 ++------- 3 files changed, 137 insertions(+), 26 deletions(-) create mode 100644 gost/examples/http2/srv.go diff --git a/gost/examples/bench/srv.go b/gost/examples/bench/srv.go index 4c3e0a3..fe977bf 100644 --- a/gost/examples/bench/srv.go +++ b/gost/examples/bench/srv.go @@ -39,7 +39,7 @@ func main() { // go rudpForwardServer() // go tcpRedirectServer() go sshTunnelServer() - // go http2Server() + go http2Server() go quicServer() go shadowUDPServer() select {} diff --git a/gost/examples/http2/srv.go b/gost/examples/http2/srv.go new file mode 100644 index 0000000..16e69aa --- /dev/null +++ b/gost/examples/http2/srv.go @@ -0,0 +1,131 @@ +package main + +import ( + "crypto/tls" + "flag" + "log" + "net/url" + + "golang.org/x/net/http2" + + "github.com/ginuerzh/gost/gost" +) + +var ( + quiet bool + keyFile, certFile string + laddr string + user, passwd string + tlsEnabled bool +) + +func init() { + log.SetFlags(log.LstdFlags | log.Lshortfile) + + flag.StringVar(&laddr, "L", ":1443", "listen address") + flag.BoolVar(&tlsEnabled, "tls", true, "enable TLS (h2)") + flag.StringVar(&user, "u", "", "username") + flag.StringVar(&passwd, "p", "", "password") + flag.BoolVar(&quiet, "q", false, "quiet mode") + flag.BoolVar(&gost.Debug, "d", false, "debug mode") + flag.BoolVar(&http2.VerboseLogs, "v", false, "HTTP2 verbose log") + flag.StringVar(&keyFile, "key", "key.pem", "TLS key file") + flag.StringVar(&certFile, "cert", "cert.pem", "TLS cert file") + flag.Parse() + + if quiet { + gost.SetLogger(&gost.NopLogger{}) + } +} + +func main() { + http2Server() +} + +func http2Server() { + + s := &gost.Server{} + var err error + var ln gost.Listener + if tlsEnabled { + cert, er := tls.LoadX509KeyPair(certFile, keyFile) + if er != nil { + log.Println(er) + cert, er = tls.X509KeyPair(rawCert, rawKey) + if er != nil { + panic(er) + } + } + ln, err = gost.TLSListener(laddr, &tls.Config{Certificates: []tls.Certificate{cert}}) // HTTP2 h2 mode + } else { + ln, err = gost.TCPListener(laddr) + } + if err != nil { + log.Fatal(err) + } + + var users []*url.Userinfo + if user != "" || passwd != "" { + users = append(users, url.UserPassword(user, passwd)) + } + h := gost.HTTP2Handler( + gost.UsersHandlerOption(users...), + ) + log.Fatal(s.Serve(ln, h)) +} + +var ( + rawCert = []byte(`-----BEGIN CERTIFICATE----- +MIIC+jCCAeKgAwIBAgIRAMlREhz8Miu1FQozsxbeqyMwDQYJKoZIhvcNAQELBQAw +EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNzA1MTkwNTM5MDJaFw0xODA1MTkwNTM5 +MDJaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCyfqvv0kDriciEAVIW6JaWYFCL9a19jj1wmAGmVGxV3kNsr01kpa6N +0EBqnrcy7WknhCt1d43CqhKtTcXgJ/J9phZVxlizb8sUB85hm+MvP0N3HCg3f0Jw +hLuMrPijS6xjyw0fKCK/p6OUYMIfo5cdqeZid2WV4Ozts5uRd6Dmy2kyBe8Zg1F4 +8YJGuTWZmL2L7uZUiPY4T3q9+1iucq3vUpxymVRi1BTXnTpx+C0GS8NNgeEmevHv +482vHM5DNflAQ+mvGZvBVduq/AfirCDnt2DIZm1DcZXLrY9F3EPrlRZexmAhCDGR +LIKnMmoGicBM11Aw1fDIfJAHynk43tjPAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF +oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC +CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAAx8Lna8DcQv0bRB3L9i2+KRN +l/UhPCoFagxk1cZore4p0w+1m7OgigOoTpg5jh78DzVDhScZlgJ0bBVYp5rojeJS +cBDC9lCDcaXQfFmT5LykCAwIgw/gs+rw5Aq0y3D0m8CcqKosyZa9wnZ2cVy/+45w +emcSdboc65ueZScv38/W7aTUoVRcjyRUv0jv0zW0EPnnDlluVkeZo9spBhiTTwoj +b3zGODs6alTNIJwZIHNxxyOmfJPpVVp8BzGbMk7YBixSlZ/vbrrYV34TcSiy7J57 +lNNoVWM+OwiVk1+AEZfQDwaQfef5tsIkAZBUyITkkDKRhygtwM2110dejbEsgg== +-----END CERTIFICATE-----`) + rawKey = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEAsn6r79JA64nIhAFSFuiWlmBQi/WtfY49cJgBplRsVd5DbK9N +ZKWujdBAap63Mu1pJ4QrdXeNwqoSrU3F4CfyfaYWVcZYs2/LFAfOYZvjLz9Ddxwo +N39CcIS7jKz4o0usY8sNHygiv6ejlGDCH6OXHanmYndlleDs7bObkXeg5stpMgXv +GYNRePGCRrk1mZi9i+7mVIj2OE96vftYrnKt71KccplUYtQU1506cfgtBkvDTYHh +Jnrx7+PNrxzOQzX5QEPprxmbwVXbqvwH4qwg57dgyGZtQ3GVy62PRdxD65UWXsZg +IQgxkSyCpzJqBonATNdQMNXwyHyQB8p5ON7YzwIDAQABAoIBAQCG4doj3Apa8z+n +IShbT1+cOyQi34A+xOIA151Hh7xmFxN0afRd/iWt3JUQ/OcLgQRZbDM7DSD+3W5H +r+G7xfQkpwFxx/T3g58+f7ehYx+GcJQWyhxJ88zNIkBnyb4KCAE5WBOOW9IGajPe +yE9pgUGMlPsXpYoKfHIOHg+NGY1pWUGBfBNR2kGrbkpZMmyy5bGa8dyrwAFBFRru +kcmmKvate8UlbRspFtd4nR/GQLTBrcDJ1k1i1Su/4BpDuDeK6LPI8ZRePGqbdcxk +TS30lsdYozuGfjZ5Zu8lSIJ//+7RjfDg8r684dpWjpalq8Quen60ZrIs01CSbfyU +k8gOzTHhAoGBAOKhp41wXveegq+WylSXFyngm4bzF4dVdTRsSbJVk7NaOx1vCU6o +/xIHoGEQyLI6wF+EaHmY89/Qu6tSV97XyBbiKeskopv5iXS/BsWTHJ1VbCA1ZLmK +HgGllEkS0xfc9AdB7b6/K7LxAAQVKP3DtN6+6pSDZh9Sv2M1j0DbhkNbAoGBAMmg +HcMfExaaeskjHqyLudtKX+znwaIoumleOGuavohR4R+Fpk8Yv8Xhb5U7Yr4gk0vY +CFmhp1WAi6QMZ/8jePlKKXl3Ney827luoKiMczp2DoYE0t0u2Kw3LfkNKfjADZ7d +JI6xPJV9/X1erwjq+4UdKqrpOf05SY4nkBMcvr6dAoGAXzisvbDJNiFTp5Mj0Abr +pJzKvBjHegVeCXi2PkfWlzUCQYu1zWcURO8PY7k5mik1SuzHONAbJ578Oy+N3AOt +/m9oTXRHHmHqbzMUFU+KZlDN7XqBp7NwiCCZ/Vn7d7tOjP4Wdl68baL07sI1RupD +xJNS3LOY5PBPmc+XMRkLgKECgYEAgBNDlJSCrZMHeAjlDTncn53I/VXiPD2e3BvL +vx6W9UT9ueZN1GSmPO6M0MDeYmOS7VSXSUhUYQ28pkJzNTC1QbWITu4YxP7anBnX +1/kPoQ0pAJzDzVharlqGy3M/PBHTFRzogfO3xkY35ZFlokaR6uayGcr42Q+w16nt +7RYPXEkCgYEA3GQYirHnGZuQ952jMvduqnpgkJiSnr0fa+94Rwa1pAhxHLFMo5s4 +fqZOtqKPj2s5X1JR0VCey1ilCcaAhWeb3tXCpbYLZSbMtjtqwA6LUeGY+Xdupsjw +cfWIcOfHsIm2kP+RCxEnZf1XwiN9wyJeiUKlE0dqmx9j7F0Bm+7YDhI= +-----END RSA PRIVATE KEY-----`) +) + +func tlsConfig() *tls.Config { + cert, err := tls.X509KeyPair(rawCert, rawKey) + if err != nil { + panic(err) + } + return &tls.Config{Certificates: []tls.Certificate{cert}} +} diff --git a/gost/http2.go b/gost/http2.go index d48b448..eadb896 100644 --- a/gost/http2.go +++ b/gost/http2.go @@ -184,10 +184,11 @@ func (h *http2Handler) Handle(conn net.Conn) { } func (h *http2Handler) handleFunc(w http.ResponseWriter, r *http.Request) { - target := r.Header.Get("Gost-Target") // compitable with old version - if target == "" { - target = r.Host - } + // target := r.Header.Get("Gost-Target") // compitable with old version + // if target == "" { + // target = r.Host + // } + target := r.Host if !strings.Contains(target, ":") { target += ":80" } @@ -291,27 +292,6 @@ func (h *http2Handler) handleFunc(w http.ResponseWriter, r *http.Request) { log.Logf("[http2] %s >-< %s", r.RemoteAddr, target) } -type http2Listener struct { - ln net.Listener -} - -// HTTP2Listener creates a Listener for server using HTTP2 as transport. -func HTTP2Listener(addr string, config *tls.Config) (Listener, error) { - var ln net.Listener - var err error - - if config != nil { - ln, err = tls.Listen("tcp", addr, config) - } else { - ln, err = net.Listen("tcp", addr) - } - if err != nil { - return nil, err - } - return ln, err - //return &http2Listener{ln: ln}, nil -} - type http2Session struct { conn net.Conn clientConn *http2.ClientConn