github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/clients/cmd/docker-driver/http.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "errors" 6 "io" 7 "net/http" 8 9 "github.com/docker/docker/daemon/logger" 10 "github.com/docker/docker/pkg/ioutils" 11 "github.com/docker/go-plugins-helpers/sdk" 12 ) 13 14 type StartLoggingRequest struct { 15 File string 16 Info logger.Info 17 } 18 19 type StopLoggingRequest struct { 20 File string 21 } 22 23 type CapabilitiesResponse struct { 24 Err string 25 Cap logger.Capability 26 } 27 28 type ReadLogsRequest struct { 29 Info logger.Info 30 Config logger.ReadConfig 31 } 32 33 func handlers(h *sdk.Handler, d *driver) { 34 h.HandleFunc("/LogDriver.StartLogging", func(w http.ResponseWriter, r *http.Request) { 35 var req StartLoggingRequest 36 if err := json.NewDecoder(r.Body).Decode(&req); err != nil { 37 http.Error(w, err.Error(), http.StatusBadRequest) 38 return 39 } 40 if req.Info.ContainerID == "" { 41 respond(errors.New("must provide container id in log context"), w) 42 return 43 } 44 45 err := d.StartLogging(req.File, req.Info) 46 respond(err, w) 47 }) 48 49 h.HandleFunc("/LogDriver.StopLogging", func(w http.ResponseWriter, r *http.Request) { 50 var req StopLoggingRequest 51 if err := json.NewDecoder(r.Body).Decode(&req); err != nil { 52 http.Error(w, err.Error(), http.StatusBadRequest) 53 return 54 } 55 d.StopLogging(req.File) 56 respond(nil, w) 57 }) 58 59 h.HandleFunc("/LogDriver.Capabilities", func(w http.ResponseWriter, r *http.Request) { 60 _ = json.NewEncoder(w).Encode(&CapabilitiesResponse{ 61 Cap: logger.Capability{ReadLogs: true}, 62 }) 63 }) 64 65 h.HandleFunc("/LogDriver.ReadLogs", func(w http.ResponseWriter, r *http.Request) { 66 var req ReadLogsRequest 67 if err := json.NewDecoder(r.Body).Decode(&req); err != nil { 68 http.Error(w, err.Error(), http.StatusBadRequest) 69 return 70 } 71 72 stream, err := d.ReadLogs(req.Info, req.Config) 73 if err != nil { 74 http.Error(w, err.Error(), http.StatusInternalServerError) 75 return 76 } 77 defer stream.Close() 78 79 w.Header().Set("Content-Type", "application/x-json-stream") 80 wf := ioutils.NewWriteFlusher(w) 81 _, _ = io.Copy(wf, stream) 82 }) 83 } 84 85 type response struct { 86 Err string 87 } 88 89 func respond(err error, w io.Writer) { 90 var res response 91 if err != nil { 92 res.Err = err.Error() 93 } 94 _ = json.NewEncoder(w).Encode(&res) 95 }