github.com/0chain/gosdk@v1.17.11/zmagmacore/http/server.go (about) 1 package http 2 3 import ( 4 "net/http" 5 "net/url" 6 "strconv" 7 "strings" 8 "time" 9 10 "github.com/gorilla/handlers" 11 "github.com/gorilla/mux" 12 13 "github.com/0chain/gosdk/zmagmacore/config" 14 "github.com/0chain/gosdk/zmagmacore/log" 15 ) 16 17 type setupHandlers func(r *mux.Router, cfg config.Handler) 18 19 // CreateServer creates http.Server and setups handlers. 20 func CreateServer(setupHandlers setupHandlers, cfg config.Handler, port int, development bool) *http.Server { 21 // setup CORS 22 router := mux.NewRouter() 23 setupHandlers(router, cfg) 24 25 address := ":" + strconv.Itoa(port) 26 originsOk := handlers.AllowedOriginValidator(isValidOrigin) 27 headersOk := handlers.AllowedHeaders([]string{ 28 "X-Requested-With", "X-App-cmd-ID", 29 "X-App-cmd-Key", "Content-Type", 30 }) 31 methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS"}) 32 33 server := &http.Server{ 34 Addr: address, 35 ReadHeaderTimeout: 30 * time.Second, 36 WriteTimeout: 30 * time.Second, 37 IdleTimeout: 30 * time.Second, 38 MaxHeaderBytes: 1 << 20, 39 Handler: handlers.CORS(originsOk, headersOk, methodsOk)(router), 40 } 41 if development { // non idle & write timeouts setup to enable pprof 42 server.IdleTimeout = 0 43 server.WriteTimeout = 0 44 } 45 46 log.Logger.Info("Ready to listen to the requests") 47 48 return server 49 } 50 51 // StartServer calls http.Server.ListenAndServe and calls app context cancel if error occurs. 52 func StartServer(server *http.Server, appCtxCancel func()) { 53 err := server.ListenAndServe() 54 if err != nil { 55 log.Logger.Warn(err.Error()) 56 appCtxCancel() 57 } 58 } 59 60 func isValidOrigin(origin string) bool { 61 uri, err := url.Parse(origin) 62 if err != nil { 63 return false 64 } 65 66 host := uri.Hostname() 67 switch { // allowed origins 68 case host == "localhost": 69 case host == "0chain.net": 70 case strings.HasSuffix(host, ".0chain.net"): 71 case strings.HasSuffix(host, ".alphanet-0chain.net"): 72 case strings.HasSuffix(host, ".devnet-0chain.net"): 73 case strings.HasSuffix(host, ".testnet-0chain.net"): 74 case strings.HasSuffix(host, ".mainnet-0chain.net"): 75 76 default: // not allowed 77 return false 78 } 79 80 return true 81 }