diff --git a/cmd/htpacker/packer/packer.go b/cmd/htpacker/packer/packer.go index 00cc31e..6dba182 100644 --- a/cmd/htpacker/packer/packer.go +++ b/cmd/htpacker/packer/packer.go @@ -325,11 +325,14 @@ func (p *packer) packFile(path string, fileToPack FileToPack) { return } - data, err := unix.Mmap(int(f.Fd()), 0, int(fi.Size()), - unix.PROT_READ, unix.MAP_SHARED) - if err != nil { - p.Abort(fmt.Errorf("mmap %s: %v", fileToPack.Filename, err)) - return + var data []byte + if fi.Size() > 0 { + data, err = unix.Mmap(int(f.Fd()), 0, int(fi.Size()), + unix.PROT_READ, unix.MAP_SHARED) + if err != nil { + p.Abort(fmt.Errorf("mmap %s: %v", fileToPack.Filename, err)) + return + } } // prepare initial directory entry diff --git a/cmd/htpacker/yaml.go b/cmd/htpacker/yaml.go index 042932e..37e10e1 100644 --- a/cmd/htpacker/yaml.go +++ b/cmd/htpacker/yaml.go @@ -3,6 +3,7 @@ package main import ( "errors" "fmt" + "io" "io/ioutil" "net/http" "os" @@ -125,13 +126,22 @@ func filesFromListR(prefix, arg string, ftp packer.FilesToPack) error { case fi.Mode().IsRegular(): // sniff content type + var ctype string buf := make([]byte, 512) n, err := f.Read(buf) - if err != nil { + switch err { + case nil: + buf = buf[:n] + ctype = http.DetectContentType(buf) + + case io.EOF: + // Empty file; this is typically due to things like + // npm webpack producing empty .css files. + ctype = "text/plain; charset=UTF-8" + + default: return fmt.Errorf("failed to read %s: %v", arg, err) } - buf = buf[:n] - ctype := http.DetectContentType(buf) // augmented rules for JS / CSS / etc. switch {