Skip to content

Instantly share code, notes, and snippets.

@json-m
Last active May 13, 2021 03:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save json-m/a29f0a014fd931363a140ef9aaebfea5 to your computer and use it in GitHub Desktop.
Save json-m/a29f0a014fd931363a140ef9aaebfea5 to your computer and use it in GitHub Desktop.
httpserver for quickly sharing a folder on disks contents
/*
syntax:
httpserver port path cidr
arguments are optional but expected in the above order
current directory via just . works
*/
package main
import (
"fmt"
"log"
"net"
"net/http"
"os"
"strconv"
"strings"
)
var (
Port int
Path string
Acl *net.IPNet
)
// log/acl wrapper
func httpLogger(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
remoteIP := net.ParseIP(strings.Split(r.RemoteAddr, ":")[0])
if Acl.Contains(remoteIP) {
log.Println(r.RemoteAddr, r.URL)
h.ServeHTTP(w, r)
return
}
log.Println("denied:", r.RemoteAddr)
http.Error(w, "Permission Denied", http.StatusForbidden)
})
}
func init() {
// configure console logging
log.SetOutput(os.Stdout)
// assume some defaults
Port = 8888
Path = "."
_, Acl, _ = net.ParseCIDR("0.0.0.0/0")
// read/set args if any
if len(os.Args) >= 2 {
Port, _ = strconv.Atoi(os.Args[1])
}
if len(os.Args) >= 3 {
Path = os.Args[2]
}
if len(os.Args) >= 4 {
_, Acl, _ = net.ParseCIDR(os.Args[3])
}
}
func main() {
log.Println("sharing on port", Port)
// define server
srv := &http.Server{
Addr: fmt.Sprintf(":%d", Port),
Handler: httpLogger(http.FileServer(http.Dir(Path))),
ErrorLog: log.New(os.Stdout, "httpserver: ", log.LstdFlags),
}
// start server
if err := srv.ListenAndServe(); err != nil {
panic(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment