{"id":37205092,"url":"https://github.com/miquels/webdavfs","last_synced_at":"2026-01-14T23:38:04.922Z","repository":{"id":77156881,"uuid":"95925742","full_name":"miquels/webdavfs","owner":"miquels","description":"Linux / OSX FUSE webdav filesystem. This filesystem behaves like a real network filesystem- no unnecessary copying of entire files.","archived":false,"fork":false,"pushed_at":"2023-12-06T15:38:12.000Z","size":90,"stargazers_count":232,"open_issues_count":9,"forks_count":27,"subscribers_count":15,"default_branch":"master","last_synced_at":"2024-11-22T01:55:31.251Z","etag":null,"topics":["fuse","go","linux","mount","osx","webdav","webdav-client"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/miquels.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-06-30T21:37:36.000Z","updated_at":"2024-11-21T08:44:50.000Z","dependencies_parsed_at":"2024-06-20T08:20:54.704Z","dependency_job_id":"da783b6e-23fc-490d-9f96-58d9a7731ddf","html_url":"https://github.com/miquels/webdavfs","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/miquels/webdavfs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miquels%2Fwebdavfs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miquels%2Fwebdavfs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miquels%2Fwebdavfs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miquels%2Fwebdavfs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/miquels","download_url":"https://codeload.github.com/miquels/webdavfs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miquels%2Fwebdavfs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28439144,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T22:37:52.437Z","status":"ssl_error","status_checked_at":"2026-01-14T22:37:31.496Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fuse","go","linux","mount","osx","webdav","webdav-client"],"created_at":"2026-01-14T23:38:03.901Z","updated_at":"2026-01-14T23:38:04.901Z","avatar_url":"https://github.com/miquels.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# webdavfs\n\n## A FUSE filesystem for WEBDAV shares.\n\nMost filesystem drivers for Webdav shares act somewhat like a mirror;\nif a file is read it's first downloaded then cached in its entirety\non a local drive, then read from there. Writing files is similar or\neven worse- a partial update to a file might involve downloading it first,\nmodifying it, then uploading it again. In many cases that is not optimal.\n\nThis filesystem driver behaves like a network filesystem. It doesn't\ncache anything locally, it just sends out partial reads/writes over the\nnetwork.\n\nFor that to work, you need partial write support- and unfortunately,\nthere is no standard for that. See\nhttps://blog.sphere.chronosempire.org.uk/2012/11/21/webdav-and-the-http-patch-nightmare\n\nHowever, there is support in Apache (the webserver, using mod_dav) and\n[SabreDav](SABREDAV-partialupdate.md) (a php webserver server library,\nused by e.g. NextCloud) for partial writes. So we detect if it's Apache or\nSabreDav we're talking to and then use their specific methods to partially\nupdate files.\n\nIf no support for partial writes is detected, mount.webdavfs will\nprint a warning and mount the filesystem read-only. In that case you can\nalso use the `rwdirops` mount option, this will make metadata writable\n(i.e. you can use rm / mv / mkdir / rmdir) but you still won't be able\nto write to files.\n\nBut if you only need to read files it's still way faster than davfs2 :)\n\n## What is working\n\nBasic filesystem operations.\n\n- files: create/delete/read/write/truncate/seek\n- directories: mkdir rmdir readdir\n- query filesystem size (df / vfsstat)\n\n## What is not yet working\n\n- locking\n\n## What will not ever work\n\n- change permissions (all files are 644, all dirs are 755)\n- change user/group\n- devices / fifos / chardev / blockdev etc\n- truncate(2) / ftruncate(2) for lengths between 1 .. currentfilesize - 1\n\nThis is basically because these are mostly just missing properties\nfrom webdav.\n\n## What platforms does it run on\n\n- Linux\n- FreeBSD (untested, but should work)\n- It might work on macos if you use [osxfuse 3](https://github.com/osxfuse/osxfuse/releases/tag/osxfuse-3.11.2). Then again it might not. This is completely unsupported. See also [this issue](https://github.com/miquels/webdavfs/issues/11).\n\n## How to install and use.\n\nFirst you need to install golang, git, fuse, and set up your environment.\nFor Debian:\n\n```\n$ sudo -s\nPassword:\n# apt-get install golang git fuse\n# exit\n```\n\nNow with go and git installed, get a copy of this github repository:\n\n```\n$ git clone https://github.com/miquels/webdavfs\n$ cd webdavfs\n```\n\nYou're now ready to build the binary:\n\n```\n$ go get\n$ go build\n```\n\nAnd install it:\n\n```\n$ sudo -s\nPassword:\n# cp webdavfs /sbin/mount.webdavfs\n```\n\nUsing it is simple as:\n```\n# mount -t webdavfs -ousername=you,password=pass https://webdav.where.ever/subdir /mnt\n```\n\n## Command line options\n\n| Option | Description |\n| --- | --- |\n| -f | don't actually mount |\n| -D | daemonize | default when called as mount.* |\n| -T opts | trace options: fuse,webdav,httpreq,httphdr |\n| -F file | trace file. file will be reopened when renamed, tracing will stop when file is removed |\n| -o opts | mount options |\n\n## Mount options\n\n| Option | Description |\n| --- | --- |\n| allow_root\t\t| If mounted as normal user, allow access by root |\n| allow_other\t\t| Allow access by others than the mount owner. This |\n|\t\t\t| also sets \"default_permisions\" |\n| default_permissions\t| As per fuse documentation |\n| no_default_permissions | Don't set \"default_permissions\" with \"allow_other\" |\n| ro\t\t\t| Read only |\n| rwdirops\t\t| Read-write for directory operations, but no file-writing (no PUT) |\n| rw\t\t\t| Read-write (default) |\n| uid\t\t\t| User ID for filesystem |\n| gid\t\t\t| Group ID for filesystem. |\n| mode\t\t\t| Mode for files/directories on the filesystem (600, 666, etc). |\n|\t\t\t| Files will never have the executable bit on, directories always. |\n| cookie\t\t| Authorization Cookie (Useful for O365 Sharepoint/OneDrive for Business) |\n| password\t\t| Password of webdav user |\n| username\t\t| Username of webdav user |\n| async_read\t\t| As per fuse documentation |\n| nonempty\t\t| As per fuse documentation |\n| maxconns              | Maximum number of parallel connections to the webdav\n|                       | server (default 8)\n| maxidleconns          | Maximum number of idle connections (default 8)\n| sabredav_partialupdate | Use the sabredav partialupdate protocol even when\n|                        | the remote server doesn't advertise support (DANGEROUS)\n\nIf the webdavfs program is called via `mount -t webdavfs` or as `mount.webdav`,\nit will fork, re-exec and run in the background. In that case it will remove\nthe username and password options from the command line, and communicate them\nvia the environment instead.\n\nThe environment options for username and password are WEBDAV_USERNAME and\nWEBDAV_PASSWORD, respectively.\n\nIn the future it will also be possible to read the credentials from a\nconfiguration file.\n\n## TODO\n\n- maxconns doesn't work yet. this is complicated with the Go HTTP client.\n- add configuration file\n- timeout handling and interrupt handling\n- we use busy-loop locking, yuck. use semaphores built on channels.\n- rewrite fuse.go code to use the bazil/fuse abstraction instead of bazil/fuse/fs.  \n  perhaps switch to  \n  - https://github.com/hanwen/go-fuse\n  - https://github.com/jacobsa/fuse\n\n## Unix filesystem extensions for webdav.\n\nNot ever going to happen, but if you wanted a more unix-like\nexperience and better performance, here are a few ideas:\n\n- Content-Type: for unix pipes / chardevs / etc\n- contentsize property (read-write)\n- inodenumber property\n- unix properties like uid/gid/mode\n- DELETE Depth 0 for collections (no delete if non-empty)\n- return updated PROPSTAT information after operations\n  like PUT / DELETE / MKCOL / MOVE\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiquels%2Fwebdavfs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmiquels%2Fwebdavfs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiquels%2Fwebdavfs/lists"}