| 
					
				 | 
			
			
				@@ -8,21 +8,36 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"os/signal" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"syscall" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"time" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"golang.org/x/net/http2" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	megaByte = 1 << 20 // 1 mb , 2 mb 1 << 21, 4mb 1 << 22, 8mb 1 << 23 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	gigaByte = 1 << 30 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	readTimeout  = 30 * time.Second 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	writeTimeout = 30 * time.Second 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func newServe(addr string, router http.Handler) *http.Server { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return &http.Server{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Addr:           addr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Handler:        router, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ReadTimeout:    30 * time.Second, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		WriteTimeout:   30 * time.Second, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		MaxHeaderBytes: 1 << 20, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ReadTimeout:    readTimeout, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		WriteTimeout:   writeTimeout, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MaxHeaderBytes: megaByte, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// ListenAndServe new server and start 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func ListenAndServe(addr string, router http.Handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func run(useV2 bool, addr, certFile, keyFile string, router http.Handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	s := newServe(addr, router) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if useV2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		http2.VerboseLogs = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		http2.ConfigureServer(s, nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	errc := make(chan error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	go func() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c := make(chan os.Signal) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -32,27 +47,33 @@ func ListenAndServe(addr string, router http.Handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	go func() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		log.Println("HTTP Server listen on", addr) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		errc <- s.ListenAndServe() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(certFile) > 0 && len(keyFile) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			errc <- s.ListenAndServeTLS(certFile, keyFile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			errc <- s.ListenAndServe() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		log.Println("Exit HTTP server", "Quit") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	log.Println("Exit", <-errc) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ListenAndServe new server and start 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func ListenAndServe(addr string, router http.Handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	run(false, addr, ``, ``, router) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // ListenAndServeTLS new server and start 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func ListenAndServeTLS(addr, certFile, keyFile string, router http.Handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	s := newServe(addr, router) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	run(false, addr, certFile, keyFile, router) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	errc := make(chan error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	go func() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		c := make(chan os.Signal) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		errc <- fmt.Errorf("%s", <-c) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ListenAndServeV2 new http2 server and start 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func ListenAndServeV2(addr string, router http.Handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	run(true, addr, ``, ``, router) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	go func() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		log.Println("HTTP Server listen on", addr) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		errc <- s.ListenAndServeTLS(certFile, keyFile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		log.Println("Exit HTTP server", "Quit") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	log.Println("Exit", <-errc) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ListenAndServeTLSV2 new http2 server and start 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func ListenAndServeTLSV2(addr, certFile, keyFile string, router http.Handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	run(true, addr, certFile, keyFile, router) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |