89 строки
2.6 KiB
Go
89 строки
2.6 KiB
Go
package sdk
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
"os"
|
|
)
|
|
|
|
const activatePath = "/Plugin.Activate"
|
|
|
|
// Handler is the base to create plugin handlers.
|
|
// It initializes connections and sockets to listen to.
|
|
type Handler struct {
|
|
mux *http.ServeMux
|
|
}
|
|
|
|
// NewHandler creates a new Handler with an http mux.
|
|
func NewHandler(manifest string) Handler {
|
|
mux := http.NewServeMux()
|
|
|
|
mux.HandleFunc(activatePath, func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", DefaultContentTypeV1_1)
|
|
fmt.Fprintln(w, manifest)
|
|
})
|
|
|
|
return Handler{mux: mux}
|
|
}
|
|
|
|
// Serve sets up the handler to serve requests on the passed in listener
|
|
func (h Handler) Serve(l net.Listener) error {
|
|
server := http.Server{
|
|
Addr: l.Addr().String(),
|
|
Handler: h.mux,
|
|
}
|
|
return server.Serve(l)
|
|
}
|
|
|
|
// ServeTCP makes the handler to listen for request in a given TCP address.
|
|
// It also writes the spec file in the right directory for docker to read.
|
|
// Due to constrains for running Docker in Docker on Windows, data-root directory
|
|
// of docker daemon must be provided. To get default directory, use
|
|
// WindowsDefaultDaemonRootDir() function. On Unix, this parameter is ignored.
|
|
func (h Handler) ServeTCP(pluginName, addr, daemonDir string, tlsConfig *tls.Config) error {
|
|
l, spec, err := newTCPListener(addr, pluginName, daemonDir, tlsConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if spec != "" {
|
|
defer os.Remove(spec)
|
|
}
|
|
return h.Serve(l)
|
|
}
|
|
|
|
// ServeUnix makes the handler to listen for requests in a unix socket.
|
|
// It also creates the socket file in the right directory for docker to read.
|
|
func (h Handler) ServeUnix(addr string, gid int) error {
|
|
l, spec, err := newUnixListener(addr, gid)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if spec != "" {
|
|
defer os.Remove(spec)
|
|
}
|
|
return h.Serve(l)
|
|
}
|
|
|
|
// ServeWindows makes the handler to listen for request in a Windows named pipe.
|
|
// It also creates the spec file in the right directory for docker to read.
|
|
// Due to constrains for running Docker in Docker on Windows, data-root directory
|
|
// of docker daemon must be provided. To get default directory, use
|
|
// WindowsDefaultDaemonRootDir() function. On Unix, this parameter is ignored.
|
|
func (h Handler) ServeWindows(addr, pluginName, daemonDir string, pipeConfig *WindowsPipeConfig) error {
|
|
l, spec, err := newWindowsListener(addr, pluginName, daemonDir, pipeConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if spec != "" {
|
|
defer os.Remove(spec)
|
|
}
|
|
return h.Serve(l)
|
|
}
|
|
|
|
// HandleFunc registers a function to handle a request path with.
|
|
func (h Handler) HandleFunc(path string, fn func(w http.ResponseWriter, r *http.Request)) {
|
|
h.mux.HandleFunc(path, fn)
|
|
}
|