| 76 | } |
| 77 | |
| 78 | func (lvl AtomicLevel) serveHTTP(w http.ResponseWriter, r *http.Request) error { |
| 79 | type errorResponse struct { |
| 80 | Error string `json:"error"` |
| 81 | } |
| 82 | type payload struct { |
| 83 | Level zapcore.Level `json:"level"` |
| 84 | } |
| 85 | |
| 86 | enc := json.NewEncoder(w) |
| 87 | |
| 88 | switch r.Method { |
| 89 | case http.MethodGet: |
| 90 | return enc.Encode(payload{Level: lvl.Level()}) |
| 91 | |
| 92 | case http.MethodPut: |
| 93 | requestedLvl, err := decodePutRequest(r.Header.Get("Content-Type"), r) |
| 94 | if err != nil { |
| 95 | w.WriteHeader(http.StatusBadRequest) |
| 96 | return enc.Encode(errorResponse{Error: err.Error()}) |
| 97 | } |
| 98 | lvl.SetLevel(requestedLvl) |
| 99 | return enc.Encode(payload{Level: lvl.Level()}) |
| 100 | |
| 101 | default: |
| 102 | w.WriteHeader(http.StatusMethodNotAllowed) |
| 103 | return enc.Encode(errorResponse{ |
| 104 | Error: "Only GET and PUT are supported.", |
| 105 | }) |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | // Decodes incoming PUT requests and returns the requested logging level. |
| 110 | func decodePutRequest(contentType string, r *http.Request) (zapcore.Level, error) { |