Odd WebDav issue


#1

Hello,

Having an odd issue with Webdav trying to set it up, this is a typical setup behind NGINX, access to it works with /seafdav, i’m prompted for login details but after the login i am getting this error.

 type 'exceptions.AttributeError'>: 'module' object has no attribute 'HTTPSConnection' 
      args = ("'module' object has no attribute 'HTTPSConnection'",) 
      message = "'module' object has no attribute 'HTTPSConnection'"

From what i can tell this is related possibly to python not being compiled with HTTPS? hopefully someone has some input on this

Update : looks like this is probably a bug with seafdav and S3, does anyone know if this is possible?

see below code for error

 /usr/local/lib/python2.7/dist-packages/boto-2.46.1-py2.7.egg/boto/connection.py in get_http_connection(self=S3Connection:s3.amazonaws.com, host='seafcommit.s3.amazonaws.com', port=443, is_secure=True)
    703             return conn
    704         else:
=>  705             return self.new_http_connection(host, port, is_secure)
    706 
    707     def skip_proxy(self, host):
self = S3Connection:s3.amazonaws.com, self.new_http_connection = <bound method S3Connection.new_http_connection of S3Connection:s3.amazonaws.com>, host = 'seafcommit.s3.amazonaws.com', port = 443, is_secure = True
 /usr/local/lib/python2.7/dist-packages/boto-2.46.1-py2.7.egg/boto/connection.py in new_http_connection(self=S3Connection:s3.amazonaws.com, host='seafcommit.s3.amazonaws.com', port=443, is_secure=True)
    753                     **http_connection_kwargs)
    754             else:
=>  755                 connection = http_client.HTTPSConnection(
=>  756                     host, **http_connection_kwargs)
    757         else:
connection undefined, global http_client = <module 'httplib' from '/usr/lib/python2.7/httplib.pyc'>, http_client.HTTPSConnection undefined, host = 'seafcommit.s3.amazonaws.com', http_connection_kwargs = {'port': 443, 'timeout': 70}

#2

Well after a boatload of testing and fresh install testing ive narrowed it down to webdav not being S3 backend compatible, is this a bug? or is it not supported.


#3

Having the similar problem
it works with S3 self-hosted minio on http
but on https I am getting
<type ‘exceptions.ValueError’> with a very colourful and very long list of python analysis.

A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/flup/server/fcgi_base.py in run(self=<flup.server.fcgi_base.Request object>)
    556         """Runs the handler, flushes the streams, and ends the request."""
    557         try:
=>  558             protocolStatus, appStatus = self.server.handler(self)
    559         except:
    560             traceback.print_exc(file=self.stderr)
protocolStatus undefined, appStatus undefined, self = <flup.server.fcgi_base.Request object>, self.server = <flup.server.fcgi.WSGIServer object>, self.server.handler = <bound method WSGIServer.handler of <flup.server.fcgi.WSGIServer object>>
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/flup/server/fcgi_base.py in handler(self=<flup.server.fcgi.WSGIServer object>, req=<flup.server.fcgi_base.Request object>)
   1118                 result = self.application(environ, start_response)
   1119                 try:
=> 1120                     for data in result:
   1121                         if data:
   1122                             write(data)
data undefined, result = <generator object __call__>
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/wsgidav_app.py in __call__(self=<wsgidav.wsgidav_app.WsgiDAVApp object>, environ={'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, start_response=<function start_response>)
    395         # Call next middleware
    396         app_iter = self._application(environ, _start_response_wrapper)
=>  397         for v in app_iter:
    398             yield v
    399         if hasattr(app_iter, "close"):
v undefined, app_iter = <generator object __call__>
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/debug_filter.py in __call__(self=<wsgidav.debug_filter.WsgiDavDebugFilter object>, environ={'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, start_response=<function _start_response_wrapper>)
    152         app_iter = self._application(environ, sub_app_start_response)
    153 
=>  154         for v in app_iter:
    155             # Start response (the first time)
    156             if first_yield:
v undefined, app_iter = <generator object __call__>
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/error_printer.py in __call__(self=<wsgidav.error_printer.ErrorPrinter object>, environ={'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, start_response=<wsgidav.util.SubAppStartResponse object>)
     40                 # Otherwise the we could not catch exceptions here. 
     41                 response_started = False
=>   42                 app_iter = self._application(environ, sub_app_start_response)
     43                 for v in app_iter:
     44                     # Start response (the first time)
app_iter undefined, self = <wsgidav.error_printer.ErrorPrinter object>, self._application = <wsgidav.http_authenticator.HTTPAuthenticator object>, environ = {'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, sub_app_start_response = <wsgidav.util.SubAppStartResponse object>
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/http_authenticator.py in __call__(self=<wsgidav.http_authenticator.HTTPAuthenticator object>, environ={'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, start_response=<wsgidav.util.SubAppStartResponse object>)
    193                 return self.sendBasicAuthResponse(environ, start_response)
    194             elif authmethod == "basic" and self._acceptbasic:
=>  195                 return self.authBasicAuthRequest(environ, start_response)
    196 
    197             util.log("HTTPAuthenticator: respond with 400 Bad request; Auth-Method: %s" % authmethod)
self = <wsgidav.http_authenticator.HTTPAuthenticator object>, self.authBasicAuthRequest = <bound method HTTPAuthenticator.authBasicAuthReq...dav.http_authenticator.HTTPAuthenticator object>>, environ = {'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, start_response = <wsgidav.util.SubAppStartResponse object>
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/http_authenticator.py in authBasicAuthRequest(self=<wsgidav.http_authenticator.HTTPAuthenticator object>, environ={'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, start_response=<wsgidav.util.SubAppStartResponse object>)
    236             environ["http_authenticator.realm"] = realmname
    237             environ["http_authenticator.username"] = username
=>  238             return self._application(environ, start_response)
    239         return self.sendBasicAuthResponse(environ, start_response)
    240         
self = <wsgidav.http_authenticator.HTTPAuthenticator object>, self._application = <wsgidav.dir_browser.WsgiDavDirBrowser object>, environ = {'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, start_response = <wsgidav.util.SubAppStartResponse object>
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/dir_browser.py in __call__(self=<wsgidav.dir_browser.WsgiDavDirBrowser object>, environ={'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, start_response=<wsgidav.util.SubAppStartResponse object>)
    171 #                # sort: 0:"calls",1:"time", 2: "cumulative"
    172 #                profile.print_stats(sort=2)
=>  173             return self._listDirectory(davres, environ, start_response)
    174         
    175         return self._application(environ, start_response)
self = <wsgidav.dir_browser.WsgiDavDirBrowser object>, self._listDirectory = <bound method WsgiDavDirBrowser._listDirectory of <wsgidav.dir_browser.WsgiDavDirBrowser object>>, davres = RootResource('/'), environ = {'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, start_response = <wsgidav.util.SubAppStartResponse object>
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/dir_browser.py in _listDirectory(self=<wsgidav.dir_browser.WsgiDavDirBrowser object>, davres=RootResource('/'), environ={'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTPS': 'on', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_AUTHORIZATION': 'Basic YWRtaW5Aa2lzaWVsLm5ldC5wbDpwcmVkaWN0IHVuYWZyYWlkIHN1cnZpdm9yIGNoYWluIHdyZWNrYWdlIHB1cmlmaWVy', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_HOST': 'seafile.kisiel.net.pl', 'HTTP_SCHEME': 'https', ...}, start_response=<wsgidav.util.SubAppStartResponse object>)
    261             # No pre-build info: traverse members
    262             dirInfoList = []
=>  263             childList = davres.getDescendants(depth="1", addSelf=False)
    264             for res in childList:
    265                 di = res.getDisplayInfo()
childList undefined, davres = RootResource('/'), davres.getDescendants = <bound method RootResource.getDescendants of RootResource('/')>, depth undefined, addSelf undefined, builtin False = False
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/dav_provider.py in getDescendants(self=RootResource('/'), collections=True, resources=True, depthFirst=False, depth='1', addSelf=False)
    445             res.append(self)
    446         if depth != "0" and self.isCollection:
=>  447             for child in self.getMemberList():
    448                 if not child:
    449                     _ = self.getMemberList()
child undefined, self = RootResource('/'), self.getMemberList = <bound method RootResource.getMemberList of RootResource('/')>
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/addons/seafile/seafile_dav_provider.py in getMemberList(self=RootResource('/'))
    494             if len(r_list) == 1:
    495                 repo = r_list[0]
=>  496                 res = self._createRootRes(repo, repo.name)
    497                 member_list.append(res)
    498             else:
res undefined, self = RootResource('/'), self._createRootRes = <bound method RootResource._createRootRes of RootResource('/')>, repo = <pysearpc.client._SearpcObj object>, repo.name = 'photos'
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/addons/seafile/seafile_dav_provider.py in _createRootRes(self=RootResource('/'), repo=<pysearpc.client._SearpcObj object>, name='photos')
    505 
    506     def _createRootRes(self, repo, name):
=>  507         obj = get_repo_root_seafdir(repo)
    508         return SeafDirResource("/"+name, repo, "", obj, self.environ)
    509 
obj undefined, global get_repo_root_seafdir = <function get_repo_root_seafdir>, repo = <pysearpc.client._SearpcObj object>
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/wsgidav/addons/seafile/seafile_dav_provider.py in get_repo_root_seafdir(repo=<pysearpc.client._SearpcObj object>)
    618 
    619 def get_repo_root_seafdir(repo):
=>  620     root_id = commit_mgr.get_commit_root_id(repo.id, repo.version, repo.head_cmmt_id)
    621     return fs_mgr.load_seafdir(repo.store_id, repo.version, root_id)
    622 
root_id undefined, global commit_mgr = <seafobj.commits.SeafCommitManager object>, commit_mgr.get_commit_root_id = <bound method SeafCommitManager.get_commit_root_id of <seafobj.commits.SeafCommitManager object>>, repo = <pysearpc.client._SearpcObj object>, repo.id = u'46584b3b-69bc-4380-9e4c-927d82b0022e', repo.version = 1, repo.head_cmmt_id = u'3c502857ec5a293b0819f83ac2ca804d4bdd09dd'
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/seafobj/commits.py in get_commit_root_id(self=<seafobj.commits.SeafCommitManager object>, repo_id=u'46584b3b-69bc-4380-9e4c-927d82b0022e', version=1, commit_id=u'3c502857ec5a293b0819f83ac2ca804d4bdd09dd')
     55 
     56     def get_commit_root_id(self, repo_id, version, commit_id):
=>   57         commit = self.load_commit(repo_id, version, commit_id)
     58         return commit.root_id
     59         
commit undefined, self = <seafobj.commits.SeafCommitManager object>, self.load_commit = <bound method SeafCommitManager.load_commit of <seafobj.commits.SeafCommitManager object>>, repo_id = u'46584b3b-69bc-4380-9e4c-927d82b0022e', version = 1, commit_id = u'3c502857ec5a293b0819f83ac2ca804d4bdd09dd'
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/seafobj/commits.py in load_commit(self=<seafobj.commits.SeafCommitManager object>, repo_id=u'46584b3b-69bc-4380-9e4c-927d82b0022e', version=1, obj_id=u'3c502857ec5a293b0819f83ac2ca804d4bdd09dd')
     41             else:
     42                 data = self.obj_stores['__default__'].read_obj(repo_id, version, obj_id)
=>   43         return self.parse_commit(data)
     44 
     45     def parse_commit(self, data):
self = <seafobj.commits.SeafCommitManager object>, self.parse_commit = <bound method SeafCommitManager.parse_commit of <seafobj.commits.SeafCommitManager object>>, data = ''
 /mnt/mfs/sfroot/seafile-pro-server-6.3.4/seahub/thirdpart/seafobj/commits.py in parse_commit(self=<seafobj.commits.SeafCommitManager object>, data='')
     44 
     45     def parse_commit(self, data):
=>   46         dict = json.loads(data)
     47         d = {}
     48         for k, v in dict.iteritems():
builtin dict = <type 'dict'>, global json = <module 'json' from '/usr/lib/python2.7/json/__init__.pyc'>, json.loads = <function loads>, data = ''
 /usr/lib/python2.7/json/__init__.py in loads(s='', encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw={})
    337             parse_int is None and parse_float is None and
    338             parse_constant is None and object_pairs_hook is None and not kw):
=>  339         return _default_decoder.decode(s)
    340     if cls is None:
    341         cls = JSONDecoder
global _default_decoder = <json.decoder.JSONDecoder object>, _default_decoder.decode = <bound method JSONDecoder.decode of <json.decoder.JSONDecoder object>>, s = ''
 /usr/lib/python2.7/json/decoder.py in decode(self=<json.decoder.JSONDecoder object>, s='', _w=<built-in method match of _sre.SRE_Pattern object>)
    362 
    363         """
=>  364         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    365         end = _w(s, end).end()
    366         if end != len(s):
obj undefined, end undefined, self = <json.decoder.JSONDecoder object>, self.raw_decode = <bound method JSONDecoder.raw_decode of <json.decoder.JSONDecoder object>>, s = '', idx undefined, _w = <built-in method match of _sre.SRE_Pattern object>, ).end undefined
 /usr/lib/python2.7/json/decoder.py in raw_decode(self=<json.decoder.JSONDecoder object>, s='', idx=0)
    379         try:
    380             obj, end = self.scan_once(s, idx)
    381         except StopIteration:
=>  382             raise ValueError("No JSON object could be decoded")
    383         return obj, end
builtin ValueError = <type 'exceptions.ValueError'>

<type 'exceptions.ValueError'>: No JSON object could be decoded
      args = ('No JSON object could be decoded',)
      message = 'No JSON object could be decoded'