def handle_DELETE(self, environ, start_response): endpoint, path = base.get_endpoint_and_path(environ) if endpoint != 'files': raise HttpError('400 Bad Request', 'DELETE can be only performed on "/files/..."') query_params = self.parse_query_params(environ) last_modified = query_params.get('last_modified', (None,))[0] if last_modified: last_modified = email.utils.parsedate_tz(last_modified) last_modified = email.utils.mktime_tz(last_modified) else: raise base.HttpError('400 Bad Request', '"?last-modified=" is required') logger.debug('Handling DELETE %s@%d', path, last_modified) try: self.storage.delete(name=path, version=last_modified) except FiletrackerFileNotFoundError: raise base.HttpError('404 Not Found', '') start_response('200 OK', []) return []
def handle_PUT(self, environ, start_response): endpoint, path = base.get_endpoint_and_path(environ) if endpoint != 'files': raise base.HttpError('400 Bad Request', 'PUT can be only performed on "/files/..."') content_length = int(environ.get('CONTENT_LENGTH')) query_params = self.parse_query_params(environ) last_modified = query_params.get('last_modified', (None, ))[0] if last_modified: last_modified = email.utils.parsedate_tz(last_modified) last_modified = email.utils.mktime_tz(last_modified) else: raise base.HttpError('400 Bad Request', '"?last-modified=" is required') compressed = environ.get('HTTP_CONTENT_ENCODING', None) == 'gzip' digest = environ.get('HTTP_SHA256_CHECKSUM', None) logical_size = environ.get('HTTP_LOGICAL_SIZE', None) if compressed and digest and logical_size: logger.debug('Handling PUT %s.', path) else: logger.info( 'Handling PUT %s with unusual headers: ' 'compressed=%s, digest=%s, logical_size=%s', path, compressed, digest, logical_size, ) version = self.storage.store( name=path, data=environ['wsgi.input'], version=last_modified, size=content_length, compressed=compressed, digest=digest, logical_size=logical_size, ) start_response( '200 OK', [ ('Content-Type', 'text/plain'), ('Last-Modified', email.utils.formatdate(version)), ], ) return []
def handle_GET(self, environ, start_response): endpoint, path = base.get_endpoint_and_path(environ) if endpoint == 'list': return self.handle_list(environ, start_response) elif endpoint == 'version': return self.handle_version(environ, start_response) elif endpoint == 'files': full_path = os.path.join(self.dir, path) if not os.path.isfile(full_path): raise base.HttpError('404 Not Found', 'File "{}" not found'.format(full_path)) start_response('200 OK', self._file_headers(path)) return _FileIterator(open(full_path, 'rb')) else: raise base.HttpError( '400 Bad Request', 'Unknown endpoint "{}", expected "files" or "list"'.format( endpoint))
def handle_list(self, environ, start_response): _, path = base.get_endpoint_and_path(environ) query_params = self.parse_query_params(environ) last_modified = query_params.get('last_modified', (None, ))[0] if not last_modified: last_modified = int(time.time()) logger.debug('Handling GET /list/%s (@%d)', path, last_modified) root_dir = os.path.join(self.dir, path) if not os.path.isdir(root_dir): raise base.HttpError('400 Bad Request', 'Path doesn\'t exist or is not a directory') start_response('200 OK', []) return _list_files_iterator(root_dir, last_modified)