| 
					
				 | 
			
			
				@@ -0,0 +1,134 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package web 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"context" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"encoding/json" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"encoding/xml" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"fmt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"log" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"net/http" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"os" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"os/signal" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"syscall" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"time" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"git.chuangxin1.com/cx/tyr" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func header(w http.ResponseWriter, contentType string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	w.Header().Set(`Content-Type`, contentType) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	w.Header().Set(`X-Powered-By`, tyr.LibName+`/`+tyr.LibVersion) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	w.WriteHeader(http.StatusOK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Redirect redirect 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func Redirect(w http.ResponseWriter, url string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	w.Header().Set(`Location`, url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	w.WriteHeader(http.StatusFound) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// GetRealIP get real IP from Request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func GetRealIP(req *http.Request) (ip string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ips := req.Header["X-Real-Ip"]; ips != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ip = ips[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// SetCookie set http cookie 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func SetCookie(w http.ResponseWriter, name, value, path string, maxAge int) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	cookie := &http.Cookie{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Name:     name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Value:    value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Path:     path, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		HttpOnly: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MaxAge:   maxAge} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	http.SetCookie(w, cookie) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// WriteJSON response JSON data. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func WriteJSON(w http.ResponseWriter, response interface{}) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	header(w, `application/json; charset=utf-8`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return json.NewEncoder(w).Encode(response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// WriteXML response XML data. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func WriteXML(w http.ResponseWriter, response interface{}) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	header(w, `application/xml; charset=utf-8`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return xml.NewEncoder(w).Encode(response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// WriteBytes response bytes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func WriteBytes(w http.ResponseWriter, response interface{}) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	header(w, `text/html; charset=utf-8`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	w.Write(response.([]byte)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// WriteCtxJSON response JSON data. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func WriteCtxJSON(ctx context.Context, w http.ResponseWriter, response interface{}) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return WriteJSON(w, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// WriteCtxXML response XML data. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func WriteCtxXML(ctx context.Context, w http.ResponseWriter, response interface{}) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return WriteXML(w, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// WriteCtxBytes response text data. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func WriteCtxBytes(ctx context.Context, w http.ResponseWriter, response interface{}) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return WriteBytes(w, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ResponseJSON reply JSON 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func ResponseJSON(reply *tyr.ReplyData, req *http.Request, w http.ResponseWriter) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return WriteJSON(w, reply) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ListenAndServe new server and start 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func ListenAndServe(addr string, router http.Handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	s := newServe(addr, router) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	errc := make(chan error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	go func() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c := make(chan os.Signal) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		errc <- fmt.Errorf("%s", <-c) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	go func() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		log.Println("HTTP Server listen on", addr) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		errc <- s.ListenAndServe() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		log.Println("Exit HTTP server", "Quit") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	log.Println("Exit", <-errc) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ListenAndServeTLS new server and start 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func ListenAndServeTLS(addr, certFile, keyFile string, router http.Handler) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	s := newServe(addr, router) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	errc := make(chan error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	go func() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c := make(chan os.Signal) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		errc <- fmt.Errorf("%s", <-c) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	go func() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		log.Println("HTTP Server listen on", addr) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		errc <- s.ListenAndServeTLS(certFile, keyFile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		log.Println("Exit HTTP server", "Quit") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	log.Println("Exit", <-errc) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |