diff --git a/changelog/unreleased/add-tus-global-capabilities.md b/changelog/unreleased/add-tus-global-capabilities.md new file mode 100644 index 0000000000..8b825b07b8 --- /dev/null +++ b/changelog/unreleased/add-tus-global-capabilities.md @@ -0,0 +1,9 @@ +Enhancement: Add TUS global capability + +The TUS global capabilities from Reva are now exposed. + +The advertised max chunk size can be configured using the "--upload-max-chunk-size" CLI switch or "REVA_FRONTEND_UPLOAD_MAX_CHUNK_SIZE" environment variable. +The advertised http method override can be configured using the "--upload-http-method-override" CLI switch or "REVA_FRONTEND_UPLOAD_HTTP_METHOD_OVERRIDE" environment variable. + +https://github.com/owncloud/ocis-reva/issues/177 +https://github.com/owncloud/ocis-reva/pull/228 diff --git a/pkg/command/frontend.go b/pkg/command/frontend.go index dd271311e6..15789286ad 100644 --- a/pkg/command/frontend.go +++ b/pkg/command/frontend.go @@ -78,6 +78,24 @@ func Frontend(cfg *config.Config) *cli.Command { desktopRedirectURIs[port] = fmt.Sprintf("http://localhost:%d", (port + 1024)) } + filesCfg := map[string]interface{}{ + "private_links": false, + "bigfilechunking": false, + "blacklisted_files": []string{}, + "undelete": true, + "versioning": true, + } + + if !cfg.Reva.UploadDisableTus { + filesCfg["tus_support"] = map[string]interface{}{ + "version": "1.0.0", + "resumable": "1.0.0", + "extension": "creation,creation-with-upload", + "http_method_override": cfg.Reva.UploadHTTPMethodOverride, + "max_chunk_size": int(cfg.Reva.UploadMaxChunkSize), + } + } + rcfg := map[string]interface{}{ "core": map[string]interface{}{ "max_cpus": cfg.Reva.Users.MaxCPUs, @@ -108,6 +126,7 @@ func Frontend(cfg *config.Config) *cli.Command { "chunk_folder": "/var/tmp/reva/chunks", "files_namespace": cfg.Reva.OCDav.DavFilesNamespace, "webdav_namespace": cfg.Reva.OCDav.WebdavNamespace, + "disable_tus": cfg.Reva.UploadDisableTus, }, "ocs": map[string]interface{}{ "config": map[string]interface{}{ @@ -117,6 +136,7 @@ func Frontend(cfg *config.Config) *cli.Command { "contact": "admin@localhost", "ssl": "false", }, + "disable_tus": cfg.Reva.UploadDisableTus, "capabilities": map[string]interface{}{ "capabilities": map[string]interface{}{ "core": map[string]interface{}{ @@ -137,14 +157,8 @@ func Frontend(cfg *config.Config) *cli.Command { "supported_types": []string{"SHA256"}, "preferred_upload_type": "SHA256", }, - "files": map[string]interface{}{ - "private_links": false, - "bigfilechunking": false, - "blacklisted_files": []string{}, - "undelete": true, - "versioning": true, - }, - "dav": map[string]interface{}{}, + "files": filesCfg, + "dav": map[string]interface{}{}, "files_sharing": map[string]interface{}{ "api_enabled": true, "resharing": true, diff --git a/pkg/config/config.go b/pkg/config/config.go index 6641c20db0..66ac115d9b 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -253,6 +253,10 @@ type Reva struct { // Configs can be used to configure the reva instance. // Services and Ports will be ignored if this is used Configs map[string]interface{} + // chunking and resumable upload config (TUS) + UploadMaxChunkSize int + UploadHTTPMethodOverride string + UploadDisableTus bool } // Tracing defines the available tracing configuration. diff --git a/pkg/flagset/frontend.go b/pkg/flagset/frontend.go index ac660f3383..a53370fc4d 100644 --- a/pkg/flagset/frontend.go +++ b/pkg/flagset/frontend.go @@ -157,5 +157,28 @@ func FrontendWithConfig(cfg *config.Config) []cli.Flag { EnvVars: []string{"REVA_GATEWAY_URL"}, Destination: &cfg.Reva.Gateway.URL, }, + + // Chunking + &cli.BoolFlag{ + Name: "upload-disable-tus", + Value: false, + Usage: "Tells clients to not use TUS by disabling the capability (this doesn't disable the endpoints)", + EnvVars: []string{"REVA_FRONTEND_UPLOAD_DISABLE_TUS"}, + Destination: &cfg.Reva.UploadDisableTus, + }, + &cli.IntFlag{ + Name: "upload-max-chunk-size", + Value: 0, + Usage: "Max chunk size in bytes to advertise to clients through capabilities", + EnvVars: []string{"REVA_FRONTEND_UPLOAD_MAX_CHUNK_SIZE"}, + Destination: &cfg.Reva.UploadMaxChunkSize, + }, + &cli.StringFlag{ + Name: "upload-http-method-override", + Value: "", + Usage: "Specify an HTTP method (ex: POST) to use when uploading in case OPTIONS and PATCH are not available", + EnvVars: []string{"REVA_FRONTEND_UPLOAD_HTTP_METHOD_OVERRIDE"}, + Destination: &cfg.Reva.UploadHTTPMethodOverride, + }, } }