mirror of https://github.com/portainer/portainer
48 lines
874 B
Go
48 lines
874 B
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
"net/http/httputil"
|
|
)
|
|
|
|
// unixHandler defines a handler holding the path to a socket under UNIX
|
|
type unixHandler struct {
|
|
path string
|
|
}
|
|
|
|
// ServeHTTP implementation for unixHandler
|
|
func (h *unixHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
conn, err := net.Dial("unix", h.path)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
log.Println(err)
|
|
return
|
|
}
|
|
c := httputil.NewClientConn(conn, nil)
|
|
defer c.Close()
|
|
|
|
res, err := c.Do(r)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
log.Println(err)
|
|
return
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
copyHeader(w.Header(), res.Header)
|
|
if _, err := io.Copy(w, res.Body); err != nil {
|
|
log.Println(err)
|
|
}
|
|
}
|
|
|
|
func copyHeader(dst, src http.Header) {
|
|
for k, vv := range src {
|
|
for _, v := range vv {
|
|
dst.Add(k, v)
|
|
}
|
|
}
|
|
}
|