blob: 2c189b30827fa012b016db07925c8d2811a626a9 [file] [log] [blame]
package impl
import (
"net/http"
"os"
"path/filepath"
"strings"
"veyron.io/veyron/veyron2/vlog"
"veyron.io/veyron/veyron/services/mgmt/binary/impl/merge_file"
)
// NewHTTPRoot returns an implementation of http.FileSystem that can be used
// to serve the content in the binary service.
func NewHTTPRoot(state *state) http.FileSystem {
return &httpRoot{state}
}
type httpRoot struct {
state *state
}
// TODO(caprita): Tie this in with DownloadURL, to control which binaries
// are downloadable via url.
// Open implements http.FileSystem. It uses the merge file implementation
// to wrap the content parts into one logical file.
func (r httpRoot) Open(name string) (http.File, error) {
name = strings.TrimPrefix(name, "/")
vlog.Infof("HTTP handler opening %s", name)
parts, err := getParts(dir(name, r.state))
if err != nil {
return nil, err
}
partFiles := make([]*os.File, len(parts))
for i, part := range parts {
if err := checksumExists(part); err != nil {
return nil, err
}
dataPath := filepath.Join(part, data)
var err error
if partFiles[i], err = os.Open(dataPath); err != nil {
vlog.Errorf("Open(%v) failed: %v", dataPath, err)
return nil, errOperationFailed
}
}
return merge_file.NewMergeFile(name, partFiles)
}