summaryrefslogtreecommitdiff
path: root/addons/document_webdav/webdav_server.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/document_webdav/webdav_server.py')
-rw-r--r--addons/document_webdav/webdav_server.py19
1 files changed, 15 insertions, 4 deletions
diff --git a/addons/document_webdav/webdav_server.py b/addons/document_webdav/webdav_server.py
index df2c4a871f6..0e5973c95b3 100644
--- a/addons/document_webdav/webdav_server.py
+++ b/addons/document_webdav/webdav_server.py
@@ -28,7 +28,6 @@
import netsvc
-import tools
from dav_fs import openerp_dav_handler
from tools.config import config
from DAV.WebDAVServer import DAVRequestHandler
@@ -36,10 +35,13 @@ from service.websrv_lib import HTTPDir, FixSendError, HttpOptions
from BaseHTTPServer import BaseHTTPRequestHandler
import urlparse
import urllib
-from string import atoi,split
+import re
+from string import atoi
from DAV.errors import *
# from DAV.constants import DAV_VERSION_1, DAV_VERSION_2
+khtml_re = re.compile(r' KHTML/([0-9\.]+) ')
+
def OpenDAVConfig(**kw):
class OpenDAV:
def __init__(self, **kw):
@@ -96,7 +98,6 @@ class DAVHandler(HttpOptions, FixSendError, DAVRequestHandler):
""" Our uri scheme removes the /webdav/ component from there, so we
need to mangle the header, too.
"""
- dest = self.headers['Destination']
up = urlparse.urlparse(urllib.unquote(self.headers['Destination']))
if up.path.startswith(self.davpath):
self.headers['Destination'] = up.path[len(self.davpath):]
@@ -131,6 +132,16 @@ class DAVHandler(HttpOptions, FixSendError, DAVRequestHandler):
# the BufferingHttpServer will send Connection: close , while
# the BaseHTTPRequestHandler will only accept int code.
# workaround both of them.
+ if self.command == 'PROPFIND' and int(code) == 404:
+ kh = khtml_re.search(self.headers.get('User-Agent',''))
+ if kh and (kh.group(1) < '4.5'):
+ # There is an ugly bug in all khtml < 4.5.x, where the 404
+ # response is treated as an immediate error, which would even
+ # break the flow of a subsequent PUT request. At the same time,
+ # the 200 response (rather than 207 with content) is treated
+ # as "path not exist", so we send this instead
+ # https://bugs.kde.org/show_bug.cgi?id=166081
+ code = 200
BaseHTTPRequestHandler.send_response(self, int(code), message)
def send_header(self, key, value):
@@ -216,7 +227,7 @@ class DAVHandler(HttpOptions, FixSendError, DAVRequestHandler):
try:
location = dc.put(uri, body, ct)
except DAV_Error, (ec,dd):
- self._logger.warning("Cannot PUT to %s: %s", uri, dd, exc_info=True)
+ self.log_error("Cannot PUT to %s: %s", uri, dd)
return self.send_status(ec)
headers = {}