Question

I'm trying to connect to a owncloud instance with python. I've found easywebdav that should make it easy to connect via webdav, but when trying to connect I'm getting "404 Not Found"

import easywebdav
webdav = easywebdav.connect('test.org/owncloud/remote.php/webdav/', username='user', password='pass', protocol='https', port=443, verify_ssl=False)
print webdav.ls(".")

I would expect a list of files found on my owncloud instance, but I'm getting

python ./test.py 
Traceback (most recent call last):
File "./test.py", line 8, in <module>
    print webdav.ls(".")
File "/usr/lib/python2.7/site-packages/easywebdav-1.0.7-py2.7.egg/easywebdav/client.py", line 131, in ls
    response = self._send('PROPFIND', remote_path, (207, 301), headers=headers)
File "/usr/lib/python2.7/site-packages/easywebdav-1.0.7-py2.7.egg/easywebdav/client.py", line 81, in _send
    raise OperationFailed(method, path, expected_code, response.status_code)
easywebdav.client.OperationFailed: Failed to list directory ".".
Operation     :  PROPFIND .
Expected code :  207 UNKNOWN, 301 Moved Permanently
Actual code   :  404 Not Found

What I find weird, is that if I connect to a invalid path, with

webdav = easywebdav.connect('test.org/owncloud-not-existent/', ......)

I get

Traceback (most recent call last):
File "./test.py", line 8, in <module>
    print webdav.ls(".")
File "/usr/lib/python2.7/site-packages/easywebdav-1.0.7-py2.7.egg/easywebdav/client.py", line 131, in ls
    response = self._send('PROPFIND', remote_path, (207, 301), headers=headers)
File "/usr/lib/python2.7/site-packages/easywebdav-1.0.7-py2.7.egg/easywebdav/client.py", line 81, in _send
    raise OperationFailed(method, path, expected_code, response.status_code)
easywebdav.client.OperationFailed: Failed to list directory ".".
Operation     :  PROPFIND .
Expected code :  207 UNKNOWN, 301 Moved Permanently
Actual code   :  405 Method Not Allowed
Was it helpful?

Solution

I've tested with a personal WebDav server and I found a similar issue, although I think that my easywebdav version is different, I use v1.0.7 and the parameter verify_ssl is not allowed, so I did the test with "http".

Anyway, I got to reproduce your issue, to fix it change the connection url and use only the host, putting the path in the ls() command :

import easywebdav
webdav = easywebdav.connect('test.org', username='user', password='pass', protocol='https', port=443, verify_ssl=False)
print webdav.ls("/owncloud/remote.php/webdav")

OTHER TIPS

While the solution in the previous answer does work around the issue, it's less convenient to have to pass in the path on each command.

Digging deeper, it appears that owncloud simply doesn't support paths with '.' on the end. easywebdav actually has a default path of '.' for commands like ls() such that doing webdav.ls() should print the current directory, but as seen above you get an error instead.

Simply calling ls with a complete path works fine though, which is why the suggested answer above worked.

A simpler solution to the original question is:

import easywebdav
webdav = easywebdav.connect('test.org/owncloud/remote.php/webdav/', username='user', password='pass', protocol='https', port=443, verify_ssl=False)
print webdav.ls("/")
connection = easywebdav.connect( 'something.tld',
                    username   = 'your_username',
                    password   = 'your_password',
                    protocol   = 'https',
                    path       = 'owncloud/remote.php/webdav',
                    verify_ssl = False) #not commended
connection.cd("my_folder")
connection.ls("") # Seafile's seafdav will return a 404 if you use the "." or ".." directory
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top