def _make_download(self, url, destination, cancel=False): self.completed_was_called = False self.error_was_called = False self.canceled_was_called = False self.progress_was_called = False self.exited_was_called = False loop = QEventLoop() downloader = QgsFileDownloader(QUrl(url), destination, False) downloader.downloadCompleted.connect( partial(self._set_slot, 'completed')) downloader.downloadExited.connect(partial(self._set_slot, 'exited')) downloader.downloadCanceled.connect(partial(self._set_slot, 'canceled')) downloader.downloadError.connect(partial(self._set_slot, 'error')) downloader.downloadProgress.connect(partial(self._set_slot, 'progress')) downloader.downloadExited.connect(loop.quit) if cancel: downloader.downloadProgress.connect(downloader.onDownloadCanceled) loop.exec_()
def testInvalidAuthFileDownload(self): """ Download a protected map tile without authcfg """ qs = "?" + "&".join(["%s=%s" % i for i in list({ "MAP": urllib.parse.quote(self.project_path), "SERVICE": "WMS", "VERSION": "1.1.1", "REQUEST": "GetMap", "LAYERS": "testlayer_èé".replace('_', '%20'), "STYLES": "", "FORMAT": "image/png", "BBOX": "-16817707,-4710778,5696513,14587125", "HEIGHT": "500", "WIDTH": "500", "CRS": "EPSG:3857" }.items())]) url = '%s://%s:%s/%s' % (self.protocol, self.hostname, self.port, qs) destination = tempfile.mktemp() loop = QEventLoop() downloader = QgsFileDownloader(QUrl(url), destination, False) downloader.downloadCompleted.connect(partial(self._set_slot, 'completed')) downloader.downloadExited.connect(partial(self._set_slot, 'exited')) downloader.downloadCanceled.connect(partial(self._set_slot, 'canceled')) downloader.downloadError.connect(partial(self._set_slot, 'error')) downloader.downloadProgress.connect(partial(self._set_slot, 'progress')) downloader.downloadExited.connect(loop.quit) loop.exec_() self.assertTrue(self.error_was_called) self.assertTrue("Download failed: Host requires authentication" in str(self.error_args), "Error args is: %s" % str(self.error_args))
def testValidAuthFileDownload(self): """ Download a map tile with valid authcfg """ qs = "?" + "&".join([ "%s=%s" % i for i in list({ "MAP": urllib.parse.quote(self.project_path), "SERVICE": "WMS", "VERSION": "1.1.1", "REQUEST": "GetMap", "LAYERS": "testlayer_èé".replace('_', '%20'), "STYLES": "", "FORMAT": "image/png", "BBOX": "-16817707,-4710778,5696513,14587125", "HEIGHT": "500", "WIDTH": "500", "CRS": "EPSG:3857" }.items()) ]) url = '%s://%s:%s/%s' % (self.protocol, self.hostname, self.port, qs) destination = tempfile.mktemp() loop = QEventLoop() downloader = QgsFileDownloader(QUrl(url), destination, False, self.auth_config.id()) downloader.downloadCompleted.connect( partial(self._set_slot, 'completed')) downloader.downloadExited.connect(partial(self._set_slot, 'exited')) downloader.downloadCanceled.connect(partial(self._set_slot, 'canceled')) downloader.downloadError.connect(partial(self._set_slot, 'error')) downloader.downloadProgress.connect(partial(self._set_slot, 'progress')) downloader.downloadExited.connect(loop.quit) loop.exec_() # Check the we've got a likely PNG image self.assertTrue(self.completed_was_called) self.assertTrue( os.path.getsize(destination) > 700000, "Image size: %s" % os.path.getsize(destination)) # > 1MB with open(destination, 'rb') as f: self.assertTrue(b'PNG' in f.read()) # is a PNG
def get_available_maps(maps_uri): """Fetch the list of available and QGIS supported maps from BCS endpoint, apparently this API method does not require auth""" # For testing purposes, we can also access to a json file directly if not maps_uri.startswith('http'): j = json.load(open(maps_uri)) else: t = mktemp() q = QgsFileDownloader(QUrl(maps_uri), t) loop = QEventLoop() q.downloadExited.connect(loop.quit) loop.exec_() if not os.path.isfile(t): return [] with open(t) as f: j = json.load(f) os.unlink(t) return [l for l in j if layer_is_supported(l)]
def get_available_providers(providers_uri): """Fetch the list of available providers from BCS endpoint, apparently this API method does not require auth""" # For testing purposes, we can also access to a json file directly if not providers_uri.startswith('http'): try: j = json.load(open(providers_uri, encoding='utf-8')) except: j = json.load(open(providers_uri)) else: t = mktemp() q = QgsFileDownloader(QUrl(providers_uri), t) loop = QEventLoop() q.downloadExited.connect(loop.quit) loop.exec_() if not os.path.isfile(t): return [] with open(t) as f: j = json.load(f) os.unlink(t) return j