def doOPTIONSSpec(self, environ, start_response): mappedpath = environ['pyfileserver.mappedpath'] if os.path.isdir(mappedpath): start_response('200 OK', [ ('Content-Type', 'text/html'), ('Content-Length', '0'), ('Allow', 'OPTIONS HEAD GET DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK' ), ('DAV', '1,2'), ('Server', 'DAV/2'), ('Date', httpdatehelper.getstrftime()) ]) elif os.path.isfile(mappedpath): start_response('200 OK', [ ('Content-Type', 'text/html'), ('Content-Length', '0'), ('Allow', 'OPTIONS HEAD GET PUT DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK' ), ('DAV', '1,2'), ('Allow-Ranges', 'bytes'), ('Date', httpdatehelper.getstrftime()) ]) elif os.path.isdir(os.path.dirname(mappedpath)): start_response('200 OK', [('Content-Type', 'text/html'), ('Content-Length', '0'), ('Allow', 'OPTIONS PUT MKCOL'), ('DAV', '1,2'), ('Date', httpdatehelper.getstrftime())]) else: raise HTTPRequestException( processrequesterrorhandler.HTTP_NOT_FOUND) # @@: I'd say that return [''] is generally better, as you don't set up an unnecessary # generator context yield '' return
def getProperty(self, respath, propertyname, propertyns): if propertyns == 'DAV:': isfile = os.path.isfile(respath) if propertyname == 'creationdate': statresults = os.stat(respath) return httpdatehelper.getstrftime(statresults[stat.ST_CTIME]) elif propertyname == 'getcontenttype': return self.getContentType(respath) elif propertyname == 'resourcetype': if os.path.isdir(respath): return '<D:collection />' else: return '' elif propertyname == 'getlastmodified': statresults = os.stat(respath) return httpdatehelper.getstrftime(statresults[stat.ST_MTIME]) elif propertyname == 'getcontentlength': if isfile: statresults = os.stat(respath) return str(statresults[stat.ST_SIZE]) raise HTTPRequestException( processrequesterrorhandler.HTTP_NOT_FOUND) elif propertyname == 'getetag': return self.getEntityTag(respath) raise HTTPRequestException(processrequesterrorhandler.HTTP_NOT_FOUND)
def getProperty(pm, lm, mappedpath, displaypath, propns, propname, etagprovider): if propns == None: propns = '' if propns == 'DAV:': isfile = os.path.isfile(mappedpath) if propname == 'creationdate': statresults = os.stat(mappedpath) return (httpdatehelper.getstrftime(statresults[stat.ST_CTIME]), "200 OK") elif propname == 'displayname': return (displaypath, "200 OK") elif propname == 'getcontenttype': if isfile: (mimetype, mimeencoding) = mimetypes.guess_type(mappedpath); if mimetype == '' or mimetype == None: mimetype = 'application/octet-stream' return (mimetype, "200 OK") else: return ('text/html', "200 OK") elif propname == 'resourcetype': if os.path.isdir(mappedpath): return ('<D:collection />', "200 OK") else: return ('', "200 OK") elif propname == 'getlastmodified': statresults = os.stat(mappedpath) return (httpdatehelper.getstrftime(statresults[stat.ST_MTIME]), "200 OK") elif propname == 'getcontentlength': if isfile: statresults = os.stat(mappedpath) return (str(statresults[stat.ST_SIZE]), "200 OK") return (None, "404 Not Found") elif propname == 'getetag': if isfile: return (etagprovider(mappedpath), "200 OK") return (None, "404 Not Found") elif propname == 'lockdiscovery': lockinfo = '' activelocklist = lm.getURLLocktokenList(displaypath) for activelocktoken in activelocklist: lockinfo = lockinfo + '<D:activelock>\n' lockinfo = lockinfo + '<D:locktype><' + lm.getLockProperty(activelocktoken, 'LOCKTYPE') + '/></D:locktype>\n' lockinfo = lockinfo + '<D:lockscope><' + lm.getLockProperty(activelocktoken, 'LOCKSCOPE') + '/></D:lockscope>\n' lockinfo = lockinfo + '<D:depth>' + lm.getLockProperty(activelocktoken, 'LOCKDEPTH') + '</D:depth>\n' lockinfo = lockinfo + '<D:owner>' + lm.getLockProperty(activelocktoken, 'LOCKOWNER') + '</D:owner>\n' lockinfo = lockinfo + '<D:timeout>' + lm.getLockProperty(activelocktoken, 'LOCKTIME') + '</D:timeout>\n' lockinfo = lockinfo + '<D:locktoken><D:href>' + activelocktoken + '</D:href></D:locktoken>\n' lockinfo = lockinfo + '</D:activelock>\n' return (lockinfo, "200 OK") elif propname == 'supportedlock': return ('<D:lockentry xmlns:D=\"DAV:\" >\n<D:lockscope><D:exclusive/></D:lockscope>\n<D:locktype><D:write/></D:locktype>\n</D:lockentry>\n<D:lockentry xmlns:D=\"DAV:\" >\n<D:lockscope><D:shared/></D:lockscope>\n<D:locktype><D:write/></D:locktype>\n</D:lockentry>', "200 OK") elif propname == 'getcontentlanguage' or propname == 'source': return (None, "404 Not Found") propvalue = pm.getProperty(displaypath, propns + ';' + propname) if propvalue == None: return (None, "404 Not Found") else: return (propvalue, "200 OK")
def doOPTIONSSpec(self, environ, start_response): resourceAL = environ['pyfileserver.resourceAL'] headers = [] if resourceAL.isCollection(environ['pyfileserver.mappedpath']): headers.append(( 'Allow', 'OPTIONS HEAD GET DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK' )) elif resourceAL.isResource(environ['pyfileserver.mappedpath']): headers.append(( 'Allow', 'OPTIONS HEAD GET PUT DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK' )) if resourceAL.supportRanges(): headers.append(('Allow-Ranges', 'bytes')) elif resourceAL.isCollection( resourceAL.getContainingCollection( environ['pyfileserver.mappedpath'])): headers.append(('Allow', 'OPTIONS PUT MKCOL')) else: raise HTTPRequestException( processrequesterrorhandler.HTTP_NOT_FOUND) headers.append(('Content-Type', 'text/html')) headers.append(('Content-Length', '0')) headers.append(('DAV', '1,2')) headers.append(('Server', 'DAV/2')) headers.append(('Date', httpdatehelper.getstrftime())) start_response('200 OK', headers) return ['']
def getResourceDescriptor(self, respath): resdesc = self.getResourceDescription(respath) ressize = str(self.getContentLength(respath)) + " B" resmod = httpdatehelper.getstrftime(self.getLastModified(respath)) if os.path.isdir(respath): ressize = "" return [resdesc, ressize, resmod]
def __call__(self, environ, start_response): environ['pyfileserver.config'] = self._srvcfg environ['pyfileserver.trailer'] = self._infoHeader if self._verbose == 1: print >> environ['wsgi.errors'], '[',httpdatehelper.getstrftime(),'] from ', environ.get('REMOTE_ADDR','unknown'), ' ', environ.get('REQUEST_METHOD','unknown'), ' ', environ.get('PATH_INFO','unknown'), ' ', environ.get('HTTP_DESTINATION', '') elif self._verbose == 2: print >> environ['wsgi.errors'], "<======== Request Environ" for envitem in environ.keys(): if envitem == envitem.upper(): print >> environ['wsgi.errors'], "\t", envitem, ":\t", repr(environ[envitem]) print >> environ['wsgi.errors'], "\n" def _start_response(respcode, headers, excinfo=None): if self._verbose == 2: print >> environ['wsgi.errors'], "=========> Response" print >> environ['wsgi.errors'], 'Response code:', respcode headersdict = dict(headers) for envitem in headersdict.keys(): print >> environ['wsgi.errors'], "\t", envitem, ":\t", repr(headersdict[envitem]) print >> environ['wsgi.errors'], "\n" return start_response(respcode, headers, excinfo) for v in iter(self._application(environ, _start_response)): if self._verbose == 2 and environ['REQUEST_METHOD'] != 'GET': print >> environ['wsgi.errors'], v yield v return
def __call__(self, environ, start_response): environ['pyfileserver.config'] = self._srvcfg environ['pyfileserver.trailer'] = self._infoHeader # @@: Really this should be doing print >> environ['wsgi.errors'], ... if self._verbose == 1: print '[',httpdatehelper.getstrftime(),'] from ', environ.get('REMOTE_ADDR','unknown'), ' ', environ.get('REQUEST_METHOD','unknown'), ' ', environ.get('PATH_INFO','unknown'), ' ', environ.get('HTTP_DESTINATION', '') elif self._verbose == 2: print "<======== Request Environ" for envitem in environ.keys(): if envitem == envitem.upper(): print "\t", envitem, ":\t", repr(environ[envitem]) print "\n" def _start_response(respcode, headers, excinfo=None): if self._verbose == 2: print "=========> Response" print 'Response code:', respcode headersdict = dict(headers) for envitem in headersdict.keys(): print "\t", envitem, ":\t", repr(headersdict[envitem]) print "\n" return start_response(respcode, headers, excinfo) for v in iter(self._application(environ, _start_response)): if self._verbose == 2 and environ['REQUEST_METHOD'] != 'GET': print v yield v return
def doOPTIONS(self, environ, start_response): headers = [] headers.append( ('Content-Type', 'text/html') ) headers.append( ('Content-Length','0') ) headers.append( ('DAV','1,2') ) headers.append( ('Server','DAV/2') ) headers.append( ('Date',httpdatehelper.getstrftime()) ) start_response('200 OK', headers) return ['']
def doOPTIONS(self, environ, start_response): headers = [] headers.append(('Content-Type', 'text/html')) headers.append(('Content-Length', '0')) headers.append(('DAV', '1,2')) headers.append(('Server', 'DAV/2')) headers.append(('Date', httpdatehelper.getstrftime())) start_response('200 OK', headers) return ['']
def doOPTIONSSpec(self, environ, start_response): mappedpath = environ["pyfileserver.mappedpath"] if os.path.isdir(mappedpath): start_response( "200 OK", [ ("Content-Type", "text/html"), ("Content-Length", "0"), ("Allow", "OPTIONS HEAD GET DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK"), ("DAV", "1,2"), ("Server", "DAV/2"), ("Date", httpdatehelper.getstrftime()), ], ) elif os.path.isfile(mappedpath): start_response( "200 OK", [ ("Content-Type", "text/html"), ("Content-Length", "0"), ("Allow", "OPTIONS HEAD GET PUT DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK"), ("DAV", "1,2"), ("Allow-Ranges", "bytes"), ("Date", httpdatehelper.getstrftime()), ], ) elif os.path.isdir(os.path.dirname(mappedpath)): start_response( "200 OK", [ ("Content-Type", "text/html"), ("Content-Length", "0"), ("Allow", "OPTIONS PUT MKCOL"), ("DAV", "1,2"), ("Date", httpdatehelper.getstrftime()), ], ) else: raise HTTPRequestException(processrequesterrorhandler.HTTP_NOT_FOUND) # @@: I'd say that return [''] is generally better, as you don't set up an unnecessary # generator context yield "" return
def doOPTIONS(self, environ, start_response): start_response( "200 OK", [ ("Content-Type", "text/html"), ("Content-Length", "0"), ("DAV", "1,2"), ("Server", "DAV/2"), ("Date", httpdatehelper.getstrftime()), ], ) return [""]
def printConfigErrorMessage(self, environ, start_response): message = """\ <html><head><title>Welcome to PyFileServer</title></head> <body> <h1>Welcome to PyFileServer</h1> <p>Thank you for using <a href="http://pyfilesync.berlios.de/">PyFileServer</a> .If you are seeing this message, you have either not specified any realm/mappings to be shared or PyFileServer is having difficulties reading your configuration file. Please check that you have specified a valid configuration file.</p> </body> </html> """ start_response('200 OK', [('Cache-Control', 'no-cache'), ('Content-Type', 'text/html'), ('Date', httpdatehelper.getstrftime())]) return [message]
def getProperty(self, respath, propertyname, propertyns): if propertyns == 'DAV:': isfile = os.path.isfile(respath) if propertyname == 'creationdate': statresults = os.stat(respath) return httpdatehelper.getstrftime(statresults[stat.ST_CTIME]) elif propertyname == 'getcontenttype': return self.getContentType(respath) elif propertyname == 'resourcetype': if os.path.isdir(respath): return '<D:collection />' else: return '' elif propertyname == 'getlastmodified': statresults = os.stat(respath) return httpdatehelper.getstrftime(statresults[stat.ST_MTIME]) elif propertyname == 'getcontentlength': if isfile: statresults = os.stat(respath) return str(statresults[stat.ST_SIZE]) raise HTTPRequestException(processrequesterrorhandler.HTTP_NOT_FOUND) elif propertyname == 'getetag': return self.getEntityTag(respath) raise HTTPRequestException(processrequesterrorhandler.HTTP_NOT_FOUND)
def printConfigErrorMessage(self): message = """\ <html><head><title>Welcome to PyFileServer</title></head> <body> <h1>Welcome to PyFileServer</h1> <p>Thank you for using <a href="http://pyfilesync.berlios.de/">PyFileServer</a> .If you are seeing this message, you have either not specified any realm/mappings to be shared or PyFileServer is having difficulties reading your configuration file. Please check that you have specified a valid configuration file.</p> </body> </html> """ start_response( "200 OK", [("Cache-Control", "no-cache"), ("Content-Type", "text/html"), ("Date", httpdatehelper.getstrftime())], ) # @@: ditto on the return; you should only use yield when you really are doing # extra work on each iteration yield message return
def doOPTIONSSpec(self, environ, start_response): resourceAL = environ['pyfileserver.resourceAL'] headers = [] if resourceAL.isCollection(environ['pyfileserver.mappedpath']): headers.append( ('Allow','OPTIONS HEAD GET DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK') ) elif resourceAL.isResource(environ['pyfileserver.mappedpath']): headers.append( ('Allow','OPTIONS HEAD GET PUT DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK') ) if resourceAL.supportRanges(): headers.append( ('Allow-Ranges','bytes') ) elif resourceAL.isCollection(resourceAL.getContainingCollection(environ['pyfileserver.mappedpath'])): headers.append( ('Allow','OPTIONS PUT MKCOL') ) else: raise HTTPRequestException(processrequesterrorhandler.HTTP_NOT_FOUND) headers.append( ('Content-Type', 'text/html') ) headers.append( ('Content-Length','0') ) headers.append( ('DAV','1,2') ) headers.append( ('Server','DAV/2') ) headers.append( ('Date',httpdatehelper.getstrftime()) ) start_response('200 OK', headers) return ['']
def __call__(self, environ, start_response): environ['pyfileserver.config'] = self._srvcfg environ['pyfileserver.trailer'] = self._infoHeader if self._verbose == 1: logging.info( '[' + httpdatehelper.getstrftime() +'] from ' + \ environ.get('REMOTE_ADDR','unknown') + ' ' + \ environ.get('REQUEST_METHOD','unknown') + ' ' + \ environ.get('PATH_INFO','unknown') + ' ' + \ environ.get('HTTP_DESTINATION', '') ) elif self._verbose == 2: logging.debug("<======== Request Environ") for envitem in environ.keys(): if envitem == envitem.upper(): logging.debug("\t" + envitem + ":\t" + repr(environ[envitem])) logging.debug("\n") def _start_response(respcode, headers, excinfo=None): if self._verbose == 2: logging.debug("=========> Response") logging.debug('Response code: %s', respcode) headersdict = dict(headers) for envitem in headersdict.keys(): logging.debug("\t" + envitem + ":\t" + repr(headersdict[envitem])) logging.debug("\n") return start_response(respcode, headers, excinfo) for v in iter(self._application(environ, _start_response)): if isinstance(v, unicode): v = v.encode('utf-8') if self._verbose == 2 and environ['REQUEST_METHOD'] != 'GET': logging.debug(v) yield v return
def printConfigErrorMessage(self): message = """\ <html><head><title>Welcome to PyFileServer</title></head> <body> <h1>Welcome to PyFileServer</h1> <p>Thank you for using <a href="http://pyfilesync.berlios.de/">PyFileServer</a> .If you are seeing this message, you have either not specified any realm/mappings to be shared or PyFileServer is having difficulties reading your configuration file. Please check that you have specified a valid configuration file.</p> </body> </html> """ start_response('200 OK', [('Cache-Control','no-cache'), ('Content-Type', 'text/html'), ('Date',httpdatehelper.getstrftime())]) return [message]
def doOPTIONS(self, environ, start_response): start_response('200 OK', [('Content-Type', 'text/html'), ('Content-Length', '0'), ('DAV', '1,2'), ('Server', 'DAV/2'), ('Date', httpdatehelper.getstrftime())]) return ['']