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  }