Skip to content

Instantly share code, notes, and snippets.

@avevlad
Forked from teknoraver/unixhttpc.go
Created June 22, 2023 15:56
Show Gist options
  • Save avevlad/f00d25715c30aa5abad048dbee1d1e01 to your computer and use it in GitHub Desktop.
Save avevlad/f00d25715c30aa5abad048dbee1d1e01 to your computer and use it in GitHub Desktop.
HTTP over Unix domain sockets in golang
package main
import (
"context"
"flag"
"fmt"
"io"
"net"
"net/http"
"os"
"strings"
)
func main() {
post := flag.String("d", "", "data to POST")
help := flag.Bool("h", false, "usage help")
flag.Parse()
if *help || len(flag.Args()) != 2 {
fmt.Fprintln(os.Stderr, "usage:", os.Args[0], "[-d data] /path.socket /uri")
flag.PrintDefaults()
os.Exit(0)
}
fmt.Println("Unix HTTP client")
httpc := http.Client{
Transport: &http.Transport{
DialContext: func(_ context.Context, _, _ string) (net.Conn, error) {
return net.Dial("unix", flag.Args()[0])
},
},
}
var response *http.Response
var err error
if len(*post) == 0 {
response, err = httpc.Get("http://unix" + flag.Args()[1])
} else {
response, err = httpc.Post("http://unix"+flag.Args()[1], "application/octet-stream", strings.NewReader(*post))
}
if err != nil {
panic(err)
}
io.Copy(os.Stdout, response.Body)
}
package main
import (
"fmt"
"net"
"net/http"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Fprintln(os.Stderr, "usage:", os.Args[0], "/path.sock [wwwroot]")
return
}
fmt.Println("Unix HTTP server")
root := "."
if len(os.Args) > 2 {
root = os.Args[2]
}
os.Remove(os.Args[1])
server := http.Server{
Handler: http.FileServer(http.Dir(root)),
}
unixListener, err := net.Listen("unix", os.Args[1])
if err != nil {
panic(err)
}
server.Serve(unixListener)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment