cmd/htpacker: cope with zero-length input files

Sometimes we might be asked to serve up a zero-length input file,
typically from some machine-generated CSS etc. We make some very
rudimentary guess about the content-type the caller wanted and skip the
mmap(2) call.
This commit is contained in:
Laurence Withers 2020-04-02 12:33:04 +01:00
parent 52213cf67e
commit 1b84160dcf
2 changed files with 21 additions and 8 deletions

View File

@ -325,12 +325,15 @@ func (p *packer) packFile(path string, fileToPack FileToPack) {
return return
} }
data, err := unix.Mmap(int(f.Fd()), 0, int(fi.Size()), var data []byte
if fi.Size() > 0 {
data, err = unix.Mmap(int(f.Fd()), 0, int(fi.Size()),
unix.PROT_READ, unix.MAP_SHARED) unix.PROT_READ, unix.MAP_SHARED)
if err != nil { if err != nil {
p.Abort(fmt.Errorf("mmap %s: %v", fileToPack.Filename, err)) p.Abort(fmt.Errorf("mmap %s: %v", fileToPack.Filename, err))
return return
} }
}
// prepare initial directory entry // prepare initial directory entry
info := &packed.File{ info := &packed.File{

View File

@ -3,6 +3,7 @@ package main
import ( import (
"errors" "errors"
"fmt" "fmt"
"io"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"os" "os"
@ -125,13 +126,22 @@ func filesFromListR(prefix, arg string, ftp packer.FilesToPack) error {
case fi.Mode().IsRegular(): case fi.Mode().IsRegular():
// sniff content type // sniff content type
var ctype string
buf := make([]byte, 512) buf := make([]byte, 512)
n, err := f.Read(buf) 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) return fmt.Errorf("failed to read %s: %v", arg, err)
} }
buf = buf[:n]
ctype := http.DetectContentType(buf)
// augmented rules for JS / CSS / etc. // augmented rules for JS / CSS / etc.
switch { switch {