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  }