juicedata/juicefs · error

The PROPPATCH method is not currently enabled,please add the

Error message

The PROPPATCH method is not currently enabled,please add the --enable-proppatch parameter and run it again

What it means

The WebDAV server rejects PROPPATCH requests with HTTP 501 unless explicitly enabled, because property modification (dead properties / live property updates such as last-modified) is disabled by default in JuiceFS. ServeHTTP in pkg/fs/http.go intercepts PROPPATCH before delegating to the webdav handler when h.EnableProppatch is false.

Source

Thrown at pkg/fs/http.go:334

	//
	// On the other hand, the Go standard library's encoding/xml package
	// accepts an empty xmlns namespace, as per the discussion at
	// https://github.com/golang/go/issues/8068
	//
	// Empty namespaces seem disallowed in the second (2006) edition of the XML
	// standard, but allowed in a later edition. The grammar differs between
	// http://www.w3.org/TR/2006/REC-xml-names-20060816/#ns-decl and
	// http://www.w3.org/TR/REC-xml-names/#dt-prefix
	//
	// Thus, we assume that the propfind_invalid2 test is obsolete, and
	// hard-code the 400 Bad Request response that the test expects.
	if r.Header.Get("X-Litmus") == "props: 3 (propfind_invalid2)" {
		http.Error(w, "400 Bad Request", http.StatusBadRequest)
		return
	}

	if !h.EnableProppatch && r.Method == "PROPPATCH" {
		http.Error(w, "The PROPPATCH method is not currently enabled,please add the --enable-proppatch parameter and run it again", http.StatusNotImplemented)
		return
	}

	h.Handler.ServeHTTP(w, r)
}

func newWebdavHandler(fs *FileSystem, config WebdavConfig) http.Handler {
	ctx := meta.NewContext(uint32(os.Getpid()), uint32(utils.GetCurrentUID()), []uint32{uint32(utils.GetCurrentGID())})
	hfs := &webdavFS{ctx, fs, uint16(utils.GetUmask()), config}
	srv := &webdav.Handler{
		FileSystem: hfs,
		LockSystem: webdav.NewMemLS(),
		Logger: func(r *http.Request, err error) {
			if err != nil {
				logger.Errorf("WEBDAV [%s]: %s, ERROR: %s", r.Method, r.URL, err)
			} else {
				logger.Debugf("WEBDAV [%s]: %s", r.Method, r.URL)
			}

View on GitHub (pinned to c9a67b23e8)

Solutions

  1. Restart the WebDAV server with the --enable-proppatch flag to allow PROPPATCH
  2. Configure the client to skip setting WebDAV properties / timestamps (e.g. mount with read-only property semantics or disable mtime preservation)
  3. Treat the 501 as 'server does not support property modification' and fall back to plain PUT/GET operations

Example fix

// before
juicefs webdav sqlite3://test.db /mnt/jfs
// after
juicefs webdav --enable-proppatch sqlite3://test.db /mnt/jfs
Defensive patterns

Strategy: fallback

Validate before calling

// Feature-detect PROPPATCH with an OPTIONS request before using it
resp, _ := http.NewRequest("OPTIONS", url, nil); // check Allow header for PROPPATCH

Type guard

func proppatchSupported(allowMethods []string) bool {
	for _, m := range allowMethods { if m == "PROPPATCH" { return true } }
	return false
}

Try / catch

resp, err := client.Do(proppatchReq)
if err != nil { return err }
if resp.StatusCode == http.StatusNotImplemented { /* skip property update */ return nil }

Prevention

When it happens

Trigger: Issuing a PROPPATCH method request (e.g. via a WebDAV client trying to set properties or update mtime) against a WebDAV server started without the --enable-proppatch flag.

Common situations: WebDAV clients like Windows mapped drives, Cyberduck, or sync tools that attempt to preserve timestamps by setting properties on upload; CI tools copying files with metadata preservation.

Related errors


AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06). Data as JSON: /api/errors/72be36e2a855eb99. Report an issue: GitHub.