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  }