github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/common/flogging/httpadmin/spec.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package httpadmin 8 9 import ( 10 "encoding/json" 11 "fmt" 12 "net/http" 13 14 "github.com/hechain20/hechain/common/flogging" 15 ) 16 17 //go:generate counterfeiter -o fakes/logging.go -fake-name Logging . Logging 18 19 type Logging interface { 20 ActivateSpec(spec string) error 21 Spec() string 22 } 23 24 // swagger:model spec 25 type LogSpec struct { 26 Spec string `json:"spec,omitempty"` 27 } 28 29 type ErrorResponse struct { 30 Error string `json:"error"` 31 } 32 33 func NewSpecHandler() *SpecHandler { 34 return &SpecHandler{ 35 Logging: flogging.Global, 36 Logger: flogging.MustGetLogger("flogging.httpadmin"), 37 } 38 } 39 40 type SpecHandler struct { 41 Logging Logging 42 Logger *flogging.FabricLogger 43 } 44 45 func (h *SpecHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) { 46 switch req.Method { 47 case http.MethodPut: 48 var logSpec LogSpec 49 decoder := json.NewDecoder(req.Body) 50 if err := decoder.Decode(&logSpec); err != nil { 51 h.sendResponse(resp, http.StatusBadRequest, err) 52 return 53 } 54 req.Body.Close() 55 56 if err := h.Logging.ActivateSpec(logSpec.Spec); err != nil { 57 h.sendResponse(resp, http.StatusBadRequest, err) 58 return 59 } 60 resp.WriteHeader(http.StatusNoContent) 61 62 case http.MethodGet: 63 h.sendResponse(resp, http.StatusOK, &LogSpec{Spec: h.Logging.Spec()}) 64 65 default: 66 err := fmt.Errorf("invalid request method: %s", req.Method) 67 h.sendResponse(resp, http.StatusBadRequest, err) 68 } 69 } 70 71 func (h *SpecHandler) sendResponse(resp http.ResponseWriter, code int, payload interface{}) { 72 encoder := json.NewEncoder(resp) 73 if err, ok := payload.(error); ok { 74 payload = &ErrorResponse{Error: err.Error()} 75 } 76 77 resp.Header().Set("Content-Type", "application/json") 78 resp.WriteHeader(code) 79 80 if err := encoder.Encode(payload); err != nil { 81 h.Logger.Errorw("failed to encode payload", "error", err) 82 } 83 }