def handle(self, req): if req.path.startswith('/demo/static/'): filename = req.path.lstrip('/') filename = static_filename(filename) if not os.path.isfile(filename): return Response('file not found', content_type='text/plain', status=404) type, encoding = mimetypes.guess_type(filename) return Response(open(filename, 'rb'), content_type=type) # we don't authorize the static files (css, js) # since they are not confidential try: authorized = self.authorized_demo(req.environ) except RequestError as ex: return ex.render() if not authorized: return Response('forbidden', content_type='text/plain', status=403) if 'wms_layer' in req.args: demo = self._render_wms_template('demo/wms_demo.html', req) elif 'tms_layer' in req.args: demo = self._render_tms_template('demo/tms_demo.html', req) elif 'wmts_layer' in req.args: demo = self._render_wmts_template('demo/wmts_demo.html', req) elif 'wms_capabilities' in req.args: internal_url = '%s/service?REQUEST=GetCapabilities'%(req.server_script_url) url = internal_url.replace(req.server_script_url, req.script_url)
def __call__(self, environ, start_response): resp = None req = Request(environ) if self.cors_origin: orig_start_response = start_response def start_response(status, headers, exc_info=None): headers.append(('Access-control-allow-origin', self.cors_origin)) return orig_start_response(status, headers, exc_info) with local_base_config(self.base_config): match = self.handler_path_re.match(req.path) if match: handler_name = match.group(1) if handler_name in self.handlers: try: resp = self.handlers[handler_name].handle(req) except Exception: if self.base_config.debug_mode: raise else: log_wsgiapp.fatal('fatal error in %s for %s?%s', handler_name, environ.get('PATH_INFO'), environ.get('QUERY_STRING'), exc_info=True) import traceback traceback.print_exc(file=environ['wsgi.errors']) resp = Response('internal error', status=500) if resp is None: if req.path in ('', '/'): resp = self.welcome_response(req.script_url) else: resp = Response('not found', mimetype='text/plain', status=404) return resp(environ, start_response)
def __call__(self, environ, start_response): req = Request(environ) try: if req.path == '/': resp = self.do_request(req) elif req.path == '/_status': resp = self.do_status(req) else: resp = Response(json.dumps({ 'status': 'error', 'error_message': 'endpoint not found' }), content_type='application/json', status=404) except LockTimeout, ex: resp = Response(json.dumps({ 'status': 'lock', 'error_message': 'lock timeout error: %s' % ex.args[0] }), content_type='application/json', status=503)
def handle(self, req): if req.path.startswith('/demo/static/'): filename = req.path.lstrip('/') filename = static_filename(filename) if not os.path.isfile(filename): return Response('file not found', content_type='text/plain', status=404) type, encoding = mimetypes.guess_type(filename) return Response(open(filename, 'rb'), content_type=type) # we don't authorize the static files (css, js) # since they are not confidential try: authorized = self.authorized_demo(req.environ) except RequestError as ex: return ex.render() if not authorized: return Response('forbidden', content_type='text/plain', status=403) if 'wms_layer' in req.args: demo = self._render_wms_template('demo/wms_demo.html', req) elif 'tms_layer' in req.args: demo = self._render_tms_template('demo/tms_demo.html', req) elif 'wmts_layer' in req.args: demo = self._render_wmts_template('demo/wmts_demo.html', req) elif 'wms_capabilities' in req.args: url = '%s/service?REQUEST=GetCapabilities' % (req.script_url) capabilities = urllib2.urlopen(url) demo = self._render_capabilities_template( 'demo/capabilities_demo.html', capabilities, 'WMS', url) elif 'wmsc_capabilities' in req.args: url = '%s/service?REQUEST=GetCapabilities&tiled=true' % ( req.script_url) capabilities = urllib2.urlopen(url) demo = self._render_capabilities_template( 'demo/capabilities_demo.html', capabilities, 'WMS-C', url) elif 'wmts_capabilities' in req.args: url = '%s/wmts/1.0.0/WMTSCapabilities.xml' % (req.script_url) capabilities = urllib2.urlopen(url) demo = self._render_capabilities_template( 'demo/capabilities_demo.html', capabilities, 'WMTS', url) elif 'tms_capabilities' in req.args: if 'layer' in req.args and 'srs' in req.args: url = '%s/tms/1.0.0/%s/%s' % ( req.script_url, req.args['layer'], req.args['srs']) else: url = '%s/tms/1.0.0/' % (req.script_url) capabilities = urllib2.urlopen(url) demo = self._render_capabilities_template( 'demo/capabilities_demo.html', capabilities, 'TMS', url) elif req.path == '/demo/': demo = self._render_template('demo/demo.html') else: resp = Response('', status=301) resp.headers['Location'] = req.script_url.rstrip('/') + '/demo/' return resp return Response(demo, content_type='text/html')
def create_app(self, user, uuid): try: mapproxy_conf = self.config_cache.config(user, uuid, self.max_uuids_per_user) except RequestError: log.exception('unable to query config') return Response('service unavailable', status=503) if not mapproxy_conf: return Response('not found', status=404) log.debug('initializing project %s', mapproxy_conf) return make_mapproxy_wsgi_app(mapproxy_conf)
def handle(self, req): if req.path.startswith('/demo/static/'): filename = req.path.lstrip('/') if not pkg_resources.resource_exists(__name__, 'templates/' + filename): return Response('file not found', content_type='text/plain', status=404) type, encoding = mimetypes.guess_type(filename) return Response(pkg_resources.resource_string(__name__, 'templates/' + filename), content_type=type) # we don't authorize the static files (css, js) # since they are not confidential try: authorized = self.authorized_demo(req.environ) except RequestError, ex: return ex.render()
def render(self): """ Return a response with the rendered exception. The rendering is delegated to the ``exception_handler`` that issued the ``RequestError``. :rtype: `Response` """ if self.request is not None: handler = self.request.exception_handler return handler.render(self) elif self.status is not None: return Response(self.msg, status=self.status) else: return Response('internal error: %s' % self.msg, status=500)
def kml(self, map_request): """ :return: the rendered KML response """ layer = self.layer(map_request) self.authorize_tile_layer(layer.name, map_request.http.environ) tile_coord = map_request.tile initial_level = False if tile_coord[2] == 0: initial_level = True bbox = self._tile_wgs_bbox(tile_coord, layer.grid, limit=True) if bbox is None: raise RequestError('The requested tile is outside the bounding box ' 'of the tile map.', request=map_request) tile = SubTile(tile_coord, bbox) subtiles = self._get_subtiles(tile_coord, layer) tile_size = layer.grid.tile_size[0] url = map_request.http.script_url.rstrip('/') result = KMLRenderer().render(tile=tile, subtiles=subtiles, layer=layer, url=url, name=map_request.layer, format=layer.format, name_path=layer.md['name_path'], initial_level=initial_level, tile_size=tile_size) resp = Response(result, content_type='application/vnd.google-earth.kml+xml') resp.cache_headers(etag_data=(result,), max_age=self.max_tile_age) resp.make_conditional(map_request.http) return resp
def welcome_response(self, script_url): import mapproxy.version html = "<html><body><h1>Welcome to MapProxy %s</h1>" % mapproxy.version.version if 'demo' in self.handlers: html += '<p>See all configured layers and services at: <a href="%s/demo/">demo</a>' % ( script_url, ) return Response(html, mimetype='text/html')
def tile(self, request): self.check_request(request) tile_layer = self.layers[request.layer][request.tilematrixset] if not request.format: request.format = tile_layer.format self.check_request_dimensions(tile_layer, request) limited_to = self.authorize_tile_layer(tile_layer, request) def decorate_img(image): query_extent = tile_layer.grid.srs.srs_code, tile_layer.tile_bbox( request) return self.decorate_img(image, 'wmts', [tile_layer.name], request.http.environ, query_extent) tile = tile_layer.render(request, coverage=limited_to, decorate_img=decorate_img) # set the content_type to tile.format and not to request.format ( to support mixed_mode) resp = Response(tile.as_buffer(), content_type='image/' + tile.format) resp.cache_headers(tile.timestamp, etag_data=(tile.timestamp, tile.size), max_age=self.max_tile_age) resp.make_conditional(request.http) return resp
def map(self, tile_request): """ :return: the requested tile :rtype: Response """ if self.origin and not tile_request.origin: tile_request.origin = self.origin layer, limit_to = self.layer(tile_request) def decorate_img(image): query_extent = (layer.grid.srs.srs_code, layer.tile_bbox( tile_request, use_profiles=tile_request.use_profiles)) return self.decorate_img(image, 'tms', [layer.name], tile_request.http.environ, query_extent) tile = layer.render(tile_request, use_profiles=tile_request.use_profiles, coverage=limit_to, decorate_img=decorate_img) tile_format = getattr(tile, 'format', tile_request.format) resp = Response(tile.as_buffer(), content_type='image/' + tile_format) if tile.cacheable: resp.cache_headers(tile.timestamp, etag_data=(tile.timestamp, tile.size), max_age=self.max_tile_age) else: resp.cache_headers(no_cache=True) resp.make_conditional(tile_request.http) return resp
def capabilities(self, request): service = self._service_md(request) layers = self.authorized_tile_layers(request.http.environ) result = self.capabilities_class(service, layers, self.matrix_sets, info_formats=self.info_formats).render(request) return Response(result, mimetype='application/xml')
def capabilities(self, map_request): # TODO: debug layer # if '__debug__' in map_request.params: # layers = self.layers.values() # else: # layers = [layer for name, layer in self.layers.iteritems() # if name != '__debug__'] if map_request.params.get('tiled', 'false').lower() == 'true': tile_layers = self.tile_layers.values() else: tile_layers = [] service = self._service_md(map_request) root_layer = self.authorized_capability_layers( map_request.http.environ) info_types = ['text', 'html', 'xml'] # defaults if self.info_types: info_types = self.info_types elif self.fi_transformers: info_types = self.fi_transformers.keys() info_formats = [ mimetype_from_infotype(map_request.version, info_type) for info_type in info_types ] result = Capabilities(service, root_layer, tile_layers, self.image_formats, info_formats, srs=self.srs, bbox_srs=self.bbox_srs).render(map_request) return Response(result, mimetype=map_request.mime_type)
def handle(self, req): log.info('%s', req.path) year = req.pop_path() month = req.pop_path() day = req.pop_path() hour = req.pop_path() app_part = req.pop_path() #log.info('year: %s month: %s day: %s hour: %s app_part: %s', year, month, day, hour, app_part) app_name = os.path.join(year, month, day, hour, app_part) #log.info('req: %s appname: %s', req.path, app_name) if not app_name: return self.index_list(req) if not app_name or (app_name not in self.apps and not self.loader.app_available(app_name)): return Response('not found', status=404) # safe instance/app name for authorization req.environ['mapproxy.instance_name'] = app_name return self.proj_app(app_name)
def tms_root_resource(self, tms_request): """ :return: root resource with all available versions of the service :rtype: Response """ service = self._service_md(tms_request) result = self._render_root_resource_template(service) return Response(result, mimetype='text/xml')
def test_str_response(self): resp = Response('string content') assert isinstance(resp.response, basestring) start_response = self.mock() self.expect(start_response('200 OK', ANY)) self.replay() result = resp({'REQUEST_METHOD': 'GET'}, start_response) assert result.next() == 'string content'
def test_str_response(self): resp = Response("string content") assert isinstance(resp.response, string_type) start_response = self.mock() self.expect(start_response("200 OK", ANY)) self.replay() result = resp({"REQUEST_METHOD": "GET"}, start_response) assert next(result) == b"string content"
def handle(self, req): if req.path.startswith('/demo/static/'): filename = req.path.lstrip('/') filename = static_filename(filename) if not os.path.isfile(filename): return Response('file not found', content_type='text/plain', status=404) type, encoding = mimetypes.guess_type(filename) return Response(open(filename, 'rb'), content_type=type) # we don't authorize the static files (css, js) # since they are not confidential try: authorized = self.authorized_demo(req.environ) except RequestError, ex: return ex.render()
def featureinfo(self, request): infos = [] self.check_request(request, self.info_formats) tile_layer = self.layers[request.layer][request.tilematrixset] if not request.format: request.format = tile_layer.format bbox = tile_layer.grid.tile_bbox(request.tile) query = InfoQuery( bbox, tile_layer.grid.tile_size, tile_layer.grid.srs, request.pos, request.infoformat, ) self.check_request_dimensions(tile_layer, request) coverage = self.authorize_tile_layer(tile_layer, request, featureinfo=True) if not tile_layer.info_sources: raise RequestError('layer %s not queryable' % str(request.layer), code='OperationNotSupported', request=request) if coverage and not coverage.contains(query.coord, query.srs): infos = [] else: for source in tile_layer.info_sources: info = source.get_info(query) if info is None: continue infos.append(info) mimetype = request.infoformat if not infos: return Response('', mimetype=mimetype) resp, _ = combine_docs(infos) return Response(resp, mimetype=mimetype)
def test_file_response_content_length(self): data = StringIO('*' * 342) resp = Response(data) assert resp.response == data start_response = self.mock() self.expect(start_response('200 OK', ANY)) self.replay() resp({'REQUEST_METHOD': 'GET'}, start_response) assert resp.content_length == 342
def test_itr_response(self): resp = Response(iter(['string content', 'as iterable'])) assert hasattr(resp.response, 'next') start_response = self.mock() self.expect(start_response('200 OK', ANY)) self.replay() result = resp({'REQUEST_METHOD': 'GET'}, start_response) assert result.next() == 'string content' assert result.next() == 'as iterable'
def test_file_response_content_length(self): data = BytesIO(b"*" * 342) resp = Response(data) assert resp.response == data start_response = self.mock() self.expect(start_response("200 OK", ANY)) self.replay() resp({"REQUEST_METHOD": "GET"}, start_response) assert resp.content_length == 342
def test_itr_response(self): resp = Response(iter(["string content", "as iterable"])) assert hasattr(resp.response, "next") or hasattr(resp.response, "__next__") start_response = self.mock() self.expect(start_response("200 OK", ANY)) self.replay() result = resp({"REQUEST_METHOD": "GET"}, start_response) assert next(result) == "string content" assert next(result) == "as iterable"
def test_file_response(self): data = StringIO('foobar') resp = Response(data) assert resp.response == data start_response = self.mock() self.expect(start_response('200 OK', ANY)) self.replay() result = resp({'REQUEST_METHOD': 'GET'}, start_response) assert result.next() == 'foobar'
def test_file_response(self): data = BytesIO(b"foobar") resp = Response(data) assert resp.response == data start_response = self.mock() self.expect(start_response("200 OK", ANY)) self.replay() result = resp({"REQUEST_METHOD": "GET"}, start_response) assert next(result) == b"foobar"
def do_request(self, req): req = json.loads(req.body()) log.info('got request: %s', req) req_id = req.get('id') if not req_id: req_id = uuid.uuid4().hex resp = self.broker.dispatch( Task(req_id, req, priority=req.get('priority', 10))) log.info('got resp: %s', resp) return Response(json.dumps(resp.doc), content_type='application/json')
def handle(self, req): app_name = req.pop_path() # if not app_name: # return self.index_list(req) if not app_name or (app_name not in self.apps and not self.loader.app_available(app_name)): return Response('not found', status=404) # safe instance/app name for authorization req.environ['mapproxy.instance_name'] = app_name return self.proj_app(app_name)
def do_status(self, req): body = """\ running: %d waiting: %d worker: %d """ % ( self.broker.render_queue.running, self.broker.render_queue.waiting, self.broker.worker.pool_size, ) body = textwrap.dedent(body) return Response(body, content_type='text/plain')
def render(self, request_error): """ Render the template of this exception handler. Passes the ``request_error.msg`` and ``request_error.code`` to the template. :type request_error: `RequestError` """ status_code = self.status_codes.get(request_error.code, self.status_code) # escape &<> in error message (e.g. URL params) msg = cgi.escape(request_error.msg) result = self.template.substitute(exception=msg, code=request_error.code) return Response(result, mimetype=self.mimetype, content_type=self.content_type, status=status_code)
def tms_capabilities(self, tms_request): """ :return: the rendered tms capabilities :rtype: Response """ service = self._service_md(tms_request) if hasattr(tms_request, 'layer'): layer, limit_to = self.layer(tms_request) result = self._render_layer_template(layer, service) else: layers = self.authorized_tile_layers(tms_request.http.environ) result = self._render_template(layers, service) return Response(result, mimetype='text/xml')