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) } } }