Override methods for customizing communication with WebDAV servers.

Fix #31 and #30
This commit is contained in:
Evgeny Ezhov 2020-01-20 17:31:25 -08:00
parent 95bea2182c
commit 336db8ae19
5 changed files with 31 additions and 8 deletions

View file

@ -33,12 +33,12 @@ client.execute_request("mkdir", 'directory_name')
Webdav API Webdav API
========== ==========
Webdav API is a set of webdav methods of work with cloud storage. This set includes the following methods: Webdav API is a set of webdav actions of work with cloud storage. This set includes the following actions:
`check`, `free`, `info`, `list`, `mkdir`, `clean`, `copy`, `move`, `download`, `upload`, `publish` and `unpublish`. `check`, `free`, `info`, `list`, `mkdir`, `clean`, `copy`, `move`, `download`, `upload`, `publish` and `unpublish`.
**Configuring the client** **Configuring the client**
Required keys for configuring client connection with WevDAV-server are webdav\_hostname and webdav\_login, webdav\_password. Required keys for configuring client connection with WevDAV-server are `webdav_hostname` and `webdav_login`, `webdav_password`.
```python ```python
from webdav3.client import Client from webdav3.client import Client
@ -51,6 +51,25 @@ options = {
client = Client(options) client = Client(options)
``` ```
If your server does not support `HEAD` method or there are other reasons to override default WebDAV methods for actions use a dictionary option `webdav_override_methods`.
The key should be in the following list: `check`, `free`, `info`, `list`, `mkdir`, `clean`, `copy`, `move`, `download`, `upload`,
`publish` and `unpublish`. The value should a string name of WebDAV method, for example `GET`.
```python
from webdav3.client import Client
options = {
'webdav_hostname': "https://webdav.server.ru",
'webdav_login': "login",
'webdav_password': "password",
'webdav_override_methods': {
'check': 'GET'
}
}
client = Client(options)
```
When a proxy server you need to specify settings to connect through it. When a proxy server you need to specify settings to connect through it.
```python ```python

View file

@ -21,7 +21,10 @@ class BaseClientTestCase(unittest.TestCase):
options = { options = {
'webdav_hostname': 'http://localhost:8585', 'webdav_hostname': 'http://localhost:8585',
'webdav_login': 'alice', 'webdav_login': 'alice',
'webdav_password': 'secret1234' 'webdav_password': 'secret1234',
'webdav_override_methods': {
'check': 'GET'
}
} }
# options = { # options = {

View file

@ -224,6 +224,9 @@ class ClientTestCase(BaseClientTestCase):
def test_valid(self): def test_valid(self):
self.assertTrue(self.client.valid()) self.assertTrue(self.client.valid())
def test_check_is_overridden(self):
self.assertEqual('GET', self.client.requests['check'])
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -153,10 +153,7 @@ class Client(object):
webdav_options = get_options(option_type=WebDAVSettings, from_options=options) webdav_options = get_options(option_type=WebDAVSettings, from_options=options)
self.webdav = WebDAVSettings(webdav_options) self.webdav = WebDAVSettings(webdav_options)
response = self.execute_request('options', '') self.requests.update(self.webdav.override_methods)
self.supported_methods = response.headers.get('Allow')
if 'HEAD' not in self.supported_methods:
self.requests['check'] = 'GET'
self.default_options = {} self.default_options = {}
def get_headers(self, action, headers_ext=None): def get_headers(self, action, headers_ext=None):

View file

@ -25,7 +25,7 @@ class WebDAVSettings(ConnectionSettings):
ns = "webdav:" ns = "webdav:"
prefix = "webdav_" prefix = "webdav_"
keys = {'hostname', 'login', 'password', 'token', 'root', 'cert_path', 'key_path', 'recv_speed', 'send_speed', keys = {'hostname', 'login', 'password', 'token', 'root', 'cert_path', 'key_path', 'recv_speed', 'send_speed',
'verbose', 'disable_check'} 'verbose', 'disable_check', 'override_methods'}
hostname = None hostname = None
login = None login = None
@ -38,6 +38,7 @@ class WebDAVSettings(ConnectionSettings):
send_speed = None send_speed = None
verbose = None verbose = None
disable_check = False disable_check = False
override_methods = {}
def __init__(self, options): def __init__(self, options):
self.options = dict() self.options = dict()