| 
														
															@@ -8,21 +8,36 @@ import ( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	"os/signal" 
														 | 
														
														 | 
														
															 	"os/signal" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	"syscall" 
														 | 
														
														 | 
														
															 	"syscall" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	"time" 
														 | 
														
														 | 
														
															 	"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 { 
														 | 
														
														 | 
														
															 func newServe(addr string, router http.Handler) *http.Server { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	return &http.Server{ 
														 | 
														
														 | 
														
															 	return &http.Server{ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		Addr:           addr, 
														 | 
														
														 | 
														
															 		Addr:           addr, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		Handler:        router, 
														 | 
														
														 | 
														
															 		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) 
														 | 
														
														 | 
														
															 	s := newServe(addr, router) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+	if useV2 { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		http2.VerboseLogs = false 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		http2.ConfigureServer(s, nil) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+	} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	errc := make(chan error) 
														 | 
														
														 | 
														
															 	errc := make(chan error) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	go func() { 
														 | 
														
														 | 
														
															 	go func() { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		c := make(chan os.Signal) 
														 | 
														
														 | 
														
															 		c := make(chan os.Signal) 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -32,27 +47,33 @@ func ListenAndServe(addr string, router http.Handler) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	go func() { 
														 | 
														
														 | 
														
															 	go func() { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		log.Println("HTTP Server listen on", addr) 
														 | 
														
														 | 
														
															 		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 HTTP server", "Quit") 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	}() 
														 | 
														
														 | 
														
															 	}() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	log.Println("Exit", <-errc) 
														 | 
														
														 | 
														
															 	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 
														 | 
														
														 | 
														
															 // ListenAndServeTLS new server and start 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 func ListenAndServeTLS(addr, certFile, keyFile string, router http.Handler) { 
														 | 
														
														 | 
														
															 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) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 |