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  }