veyron/services/mgmt/binary: HTTP download for binary service.
The implementation uses the http file server functionality, and we provide
an implementation of http.File that wraps the content parts we have in the
binary server.
For now, make any content available via http (DownloadURL is still not
implemented). We'll revisit that later.
As part of this change, factor out some code from dispatcher and invoker
that was also needed for the http implementation.
While at it, fix some issues discovered while working with this codebase.
Among them, how Upload/Download handle invalid part indices.
Change-Id: Ief4153b68930d5edbf8b83e36c3b1396369d5f3c
diff --git a/services/mgmt/binary/binaryd/main.go b/services/mgmt/binary/binaryd/main.go
index 3a74c7c..28bb8ad 100644
--- a/services/mgmt/binary/binaryd/main.go
+++ b/services/mgmt/binary/binaryd/main.go
@@ -3,6 +3,7 @@
import (
"flag"
"io/ioutil"
+ "net/http"
"os"
"path/filepath"
@@ -59,6 +60,21 @@
}
}
vlog.Infof("Binary repository rooted at %v", *root)
+
+ state, err := impl.NewState(*root, defaultDepth)
+ if err != nil {
+ vlog.Errorf("NewState(%v, %v) failed: %v", *root, defaultDepth, err)
+ return
+ }
+
+ // TODO(caprita): Flagify port.
+ go func() {
+ if err := http.ListenAndServe(":8080", http.FileServer(impl.NewHTTPRoot(state))); err != nil {
+ vlog.Errorf("ListenAndServe() failed: %v", err)
+ os.Exit(1)
+ }
+ }()
+
runtime := rt.Init()
defer runtime.Cleanup()
server, err := runtime.NewServer()
@@ -68,17 +84,12 @@
}
defer server.Stop()
auth := vflag.NewAuthorizerOrDie()
- dispatcher, err := impl.NewDispatcher(*root, defaultDepth, auth)
- if err != nil {
- vlog.Errorf("NewDispatcher(%v, %v, %v) failed: %v", *root, defaultDepth, auth, err)
- return
- }
endpoint, err := server.Listen(roaming.ListenSpec)
if err != nil {
vlog.Errorf("Listen(%s) failed: %v", roaming.ListenSpec, err)
return
}
- if err := server.Serve(*name, dispatcher); err != nil {
+ if err := server.Serve(*name, impl.NewDispatcher(state, auth)); err != nil {
vlog.Errorf("Serve(%v) failed: %v", *name, err)
return
}