serve http, webdav, restic: ensure rclone exits if the port is in use

This commit is contained in:
Nick Craig-Wood
2018-11-02 17:32:20 +00:00
parent 1f05d5bf4a
commit bb5637d46a
7 changed files with 65 additions and 40 deletions
+16 -10
View File
@@ -68,8 +68,12 @@ Use "rclone hashsum" to see the full list.
fs.Debugf(f, "Using hash %v for ETag", hashType)
}
cmd.Run(false, false, command, func() error {
w := newWebDAV(f, &httpflags.Opt)
w.serve()
s := newWebDAV(f, &httpflags.Opt)
err := s.serve()
if err != nil {
return err
}
s.Wait()
return nil
})
return nil
@@ -89,9 +93,9 @@ Use "rclone hashsum" to see the full list.
// might apply". In particular, whether or not renaming a file or directory
// overwriting another existing file or directory is an error is OS-dependent.
type WebDAV struct {
*httplib.Server
f fs.Fs
vfs *vfs.VFS
srv *httplib.Server
}
// check interface
@@ -110,18 +114,20 @@ func newWebDAV(f fs.Fs, opt *httplib.Options) *WebDAV {
Logger: w.logRequest, // FIXME
}
w.srv = httplib.NewServer(handler, opt)
w.Server = httplib.NewServer(handler, opt)
return w
}
// serve runs the http server - doesn't return
func (w *WebDAV) serve() {
err := w.srv.Serve()
// serve runs the http server in the background.
//
// Use s.Close() and s.Wait() to shutdown server
func (w *WebDAV) serve() error {
err := w.Serve()
if err != nil {
fs.Errorf(w.f, "Opening listener: %v", err)
return err
}
fs.Logf(w.f, "WebDav Server started on %s", w.srv.URL())
w.srv.Wait()
fs.Logf(w.f, "WebDav Server started on %s", w.URL())
return nil
}
// logRequest is called by the webdav module on every request