github.com/kumasuke120/mockuma@v1.1.9/internal/server/handler.go (about) 1 package server 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 "sort" 8 9 "github.com/kumasuke120/mockuma/internal" 10 "github.com/kumasuke120/mockuma/internal/mckmaps" 11 "github.com/kumasuke120/mockuma/internal/myhttp" 12 ) 13 14 var HeaderValueServer = fmt.Sprintf("%s/%s", internal.AppName, internal.VersionNumber) 15 16 type mockHandler struct { 17 mappings *mckmaps.MockuMappings 18 pathMatcher *pathMatcher 19 } 20 21 func newMockHandler(mappings *mckmaps.MockuMappings) http.Handler { 22 h := new(mockHandler) 23 h.mappings = mappings 24 h.pathMatcher = newPathMatcher(mappings) 25 26 h.listAllMappings() 27 28 corsOption := mappings.Config.CORS 29 if corsOption.Enabled { 30 log.Println("[handler ] enabled : cors handler") 31 return corsOption.ToCors().Handler(h) 32 } else { 33 return h 34 } 35 } 36 37 func (h *mockHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 38 w.Header().Set(myhttp.HeaderServer, HeaderValueServer) 39 40 executor := h.matchNewExecutor(r, w) 41 if err := executor.execute(); err != nil { 42 h.handleExecuteError(w, r, err) 43 } 44 } 45 46 func (h *mockHandler) matchNewExecutor(r *http.Request, w http.ResponseWriter) *policyExecutor { 47 executor := &policyExecutor{h: h, r: r, w: &w} 48 49 matcher := h.pathMatcher.bind(r) 50 if matcher.matches() { 51 executor.returnHead = matcher.headMatches() 52 executor.policy = matcher.matchPolicy() 53 } else { 54 executor.policy = pNotFound 55 } 56 57 return executor 58 } 59 60 func (h *mockHandler) handleExecuteError(w http.ResponseWriter, r *http.Request, err error) { 61 log.Printf("[handler ] error : %s %s => %v\n", r.Method, r.URL, err) 62 63 switch err.(type) { 64 case *forwardError: 65 executor := &policyExecutor{h: h, r: r, w: &w, policy: pBadGateway} 66 err = executor.execute() 67 default: 68 executor := &policyExecutor{h: h, r: r, w: &w, policy: pInternalServerError} 69 err = executor.execute() 70 } 71 72 if err != nil { 73 log.Printf("[handler ] error : %s %s => fail to render response: %v\n", r.Method, r.URL, err) 74 } 75 } 76 77 func (h *mockHandler) listAllMappings() { 78 uri2Methods := h.mappings.GroupMethodsByURI() 79 80 var uris []string 81 for uri := range uri2Methods { 82 uris = append(uris, uri) 83 } 84 sort.Strings(uris) 85 86 for _, uri := range uris { 87 methods := uri2Methods[uri] 88 log.Printf("[handler ] mapped : %s, methods = %v\n", uri, methods) 89 } 90 }