github.com/yasker/longhorn-engine@v0.0.0-20160621014712-6ed6cfca0729/util/util.go (about) 1 package util 2 3 import ( 4 "fmt" 5 "io" 6 "net/http" 7 "regexp" 8 "strconv" 9 10 "github.com/gorilla/handlers" 11 "github.com/satori/go.uuid" 12 ) 13 14 var ( 15 parsePattern = regexp.MustCompile(`(.*):(\d+)`) 16 ) 17 18 func ParseAddresses(name string) (string, string, string, error) { 19 matches := parsePattern.FindStringSubmatch(name) 20 if matches == nil { 21 return "", "", "", fmt.Errorf("Invalid address %s does not match pattern: %v", name, parsePattern) 22 } 23 24 host := matches[1] 25 port, _ := strconv.Atoi(matches[2]) 26 27 return fmt.Sprintf("%s:%d", host, port), 28 fmt.Sprintf("%s:%d", host, port+1), 29 fmt.Sprintf("%s:%d", host, port+2), nil 30 } 31 32 func UUID() string { 33 return uuid.NewV4().String() 34 } 35 36 func Filter(list []string, check func(string) bool) []string { 37 result := make([]string, 0, len(list)) 38 for _, i := range list { 39 if check(i) { 40 result = append(result, i) 41 } 42 } 43 return result 44 } 45 46 func Contains(arr []string, val string) bool { 47 for _, a := range arr { 48 if a == val { 49 return true 50 } 51 } 52 return false 53 } 54 55 type filteredLoggingHandler struct { 56 filteredPaths map[string]struct{} 57 handler http.Handler 58 loggingHandler http.Handler 59 } 60 61 func FilteredLoggingHandler(filteredPaths map[string]struct{}, writer io.Writer, router http.Handler) http.Handler { 62 return filteredLoggingHandler{ 63 filteredPaths: filteredPaths, 64 handler: router, 65 loggingHandler: handlers.LoggingHandler(writer, router), 66 } 67 } 68 69 func (h filteredLoggingHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { 70 switch req.Method { 71 case "GET": 72 if _, exists := h.filteredPaths[req.URL.Path]; exists { 73 h.handler.ServeHTTP(w, req) 74 return 75 } 76 } 77 h.loggingHandler.ServeHTTP(w, req) 78 }