MapProxy 1.16.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mapproxy/__init__.py +0 -0
- mapproxy/cache/__init__.py +36 -0
- mapproxy/cache/azureblob.py +145 -0
- mapproxy/cache/base.py +111 -0
- mapproxy/cache/compact.py +664 -0
- mapproxy/cache/couchdb.py +295 -0
- mapproxy/cache/dummy.py +34 -0
- mapproxy/cache/file.py +185 -0
- mapproxy/cache/geopackage.py +609 -0
- mapproxy/cache/legend.py +83 -0
- mapproxy/cache/mbtiles.py +392 -0
- mapproxy/cache/meta.py +78 -0
- mapproxy/cache/path.py +250 -0
- mapproxy/cache/redis.py +88 -0
- mapproxy/cache/renderd.py +95 -0
- mapproxy/cache/riak.py +202 -0
- mapproxy/cache/s3.py +177 -0
- mapproxy/cache/tile.py +699 -0
- mapproxy/client/__init__.py +0 -0
- mapproxy/client/arcgis.py +79 -0
- mapproxy/client/cgi.py +139 -0
- mapproxy/client/http.py +315 -0
- mapproxy/client/log.py +33 -0
- mapproxy/client/tile.py +150 -0
- mapproxy/client/wms.py +254 -0
- mapproxy/compat/__init__.py +46 -0
- mapproxy/compat/image.py +79 -0
- mapproxy/compat/itertools.py +29 -0
- mapproxy/compat/modules.py +13 -0
- mapproxy/config/__init__.py +22 -0
- mapproxy/config/config.py +201 -0
- mapproxy/config/coverage.py +107 -0
- mapproxy/config/defaults.py +98 -0
- mapproxy/config/loader.py +2286 -0
- mapproxy/config/spec.py +644 -0
- mapproxy/config/validator.py +239 -0
- mapproxy/config_template/__init__.py +0 -0
- mapproxy/config_template/base_config/config.wsgi +10 -0
- mapproxy/config_template/base_config/full_example.yaml +593 -0
- mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
- mapproxy/config_template/base_config/log.ini +35 -0
- mapproxy/config_template/base_config/mapproxy.yaml +60 -0
- mapproxy/config_template/base_config/seed.yaml +27 -0
- mapproxy/exception.py +142 -0
- mapproxy/featureinfo.py +252 -0
- mapproxy/grid.py +1170 -0
- mapproxy/image/__init__.py +536 -0
- mapproxy/image/fonts/DejaVuSans.ttf +0 -0
- mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
- mapproxy/image/fonts/LICENSE +99 -0
- mapproxy/image/fonts/__init__.py +0 -0
- mapproxy/image/mask.py +75 -0
- mapproxy/image/merge.py +316 -0
- mapproxy/image/message.py +347 -0
- mapproxy/image/opts.py +182 -0
- mapproxy/image/tile.py +167 -0
- mapproxy/image/transform.py +350 -0
- mapproxy/layer.py +470 -0
- mapproxy/multiapp.py +231 -0
- mapproxy/proj.py +302 -0
- mapproxy/request/__init__.py +18 -0
- mapproxy/request/arcgis.py +259 -0
- mapproxy/request/base.py +476 -0
- mapproxy/request/tile.py +128 -0
- mapproxy/request/wms/__init__.py +793 -0
- mapproxy/request/wms/exception.py +99 -0
- mapproxy/request/wmts.py +436 -0
- mapproxy/response.py +237 -0
- mapproxy/script/__init__.py +0 -0
- mapproxy/script/conf/__init__.py +0 -0
- mapproxy/script/conf/app.py +195 -0
- mapproxy/script/conf/caches.py +45 -0
- mapproxy/script/conf/layers.py +54 -0
- mapproxy/script/conf/seeds.py +37 -0
- mapproxy/script/conf/sources.py +86 -0
- mapproxy/script/conf/utils.py +143 -0
- mapproxy/script/defrag.py +184 -0
- mapproxy/script/export.py +333 -0
- mapproxy/script/grids.py +188 -0
- mapproxy/script/scales.py +126 -0
- mapproxy/script/util.py +406 -0
- mapproxy/script/wms_capabilities.py +152 -0
- mapproxy/seed/__init__.py +0 -0
- mapproxy/seed/cachelock.py +121 -0
- mapproxy/seed/cleanup.py +187 -0
- mapproxy/seed/config.py +469 -0
- mapproxy/seed/script.py +388 -0
- mapproxy/seed/seeder.py +538 -0
- mapproxy/seed/spec.py +64 -0
- mapproxy/seed/util.py +254 -0
- mapproxy/service/__init__.py +14 -0
- mapproxy/service/base.py +46 -0
- mapproxy/service/demo.py +356 -0
- mapproxy/service/kml.py +331 -0
- mapproxy/service/ows.py +38 -0
- mapproxy/service/template_helper.py +53 -0
- mapproxy/service/templates/demo/capabilities_demo.html +16 -0
- mapproxy/service/templates/demo/demo.html +181 -0
- mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
- mapproxy/service/templates/demo/static/img/blank.gif +0 -0
- mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
- mapproxy/service/templates/demo/static/logo.png +0 -0
- mapproxy/service/templates/demo/static/ol.css +345 -0
- mapproxy/service/templates/demo/static/ol.js +4 -0
- mapproxy/service/templates/demo/static/proj4.min.js +1 -0
- mapproxy/service/templates/demo/static/proj4defs.js +1 -0
- mapproxy/service/templates/demo/static/site.css +137 -0
- mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
- mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
- mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
- mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
- mapproxy/service/templates/demo/static.html +34 -0
- mapproxy/service/templates/demo/tms_demo.html +103 -0
- mapproxy/service/templates/demo/wms_demo.html +140 -0
- mapproxy/service/templates/demo/wmts_demo.html +110 -0
- mapproxy/service/templates/tms_capabilities.xml +13 -0
- mapproxy/service/templates/tms_exception.xml +4 -0
- mapproxy/service/templates/tms_root_resource.xml +7 -0
- mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
- mapproxy/service/templates/wms100capabilities.xml +112 -0
- mapproxy/service/templates/wms100exception.xml +4 -0
- mapproxy/service/templates/wms110capabilities.xml +152 -0
- mapproxy/service/templates/wms110exception.xml +5 -0
- mapproxy/service/templates/wms111capabilities.xml +183 -0
- mapproxy/service/templates/wms111exception.xml +5 -0
- mapproxy/service/templates/wms130capabilities.xml +326 -0
- mapproxy/service/templates/wms130exception.xml +8 -0
- mapproxy/service/templates/wmts100capabilities.xml +155 -0
- mapproxy/service/templates/wmts100exception.xml +9 -0
- mapproxy/service/tile.py +536 -0
- mapproxy/service/wms.py +851 -0
- mapproxy/service/wmts.py +381 -0
- mapproxy/source/__init__.py +75 -0
- mapproxy/source/arcgis.py +39 -0
- mapproxy/source/error.py +39 -0
- mapproxy/source/mapnik.py +259 -0
- mapproxy/source/tile.py +96 -0
- mapproxy/source/wms.py +270 -0
- mapproxy/srs.py +726 -0
- mapproxy/template.py +54 -0
- mapproxy/test/__init__.py +0 -0
- mapproxy/test/conftest.py +7 -0
- mapproxy/test/helper.py +247 -0
- mapproxy/test/http.py +494 -0
- mapproxy/test/image.py +210 -0
- mapproxy/test/mocker.py +2268 -0
- mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
- mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
- mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
- mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
- mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
- mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
- mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
- mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
- mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
- mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
- mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
- mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
- mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
- mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
- mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
- mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
- mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
- mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
- mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
- mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
- mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
- mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
- mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
- mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
- mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
- mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
- mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
- mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
- mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
- mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
- mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
- mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
- mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
- mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
- mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
- mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
- mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
- mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
- mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
- mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
- mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
- mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
- mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
- mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
- mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
- mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
- mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
- mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
- mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
- mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
- mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
- mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
- mapproxy/test/schemas/xml.xsd +287 -0
- mapproxy/test/system/__init__.py +98 -0
- mapproxy/test/system/fixture/arcgis.yaml +57 -0
- mapproxy/test/system/fixture/auth.yaml +70 -0
- mapproxy/test/system/fixture/cache.mbtiles +0 -0
- mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
- mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
- mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
- mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
- mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
- mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
- mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
- mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
- mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
- mapproxy/test/system/fixture/cache_s3.yaml +58 -0
- mapproxy/test/system/fixture/cache_source.yaml +81 -0
- mapproxy/test/system/fixture/combined_sources.yaml +130 -0
- mapproxy/test/system/fixture/coverage.yaml +77 -0
- mapproxy/test/system/fixture/demo.yaml +135 -0
- mapproxy/test/system/fixture/dimension.yaml +59 -0
- mapproxy/test/system/fixture/disable_storage.yaml +25 -0
- mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
- mapproxy/test/system/fixture/formats.yaml +72 -0
- mapproxy/test/system/fixture/inspire.yaml +101 -0
- mapproxy/test/system/fixture/inspire_full.yaml +124 -0
- mapproxy/test/system/fixture/kml_layer.yaml +66 -0
- mapproxy/test/system/fixture/layer.yaml +260 -0
- mapproxy/test/system/fixture/layergroups.yaml +57 -0
- mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
- mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
- mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
- mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
- mapproxy/test/system/fixture/mapserver.yaml +23 -0
- mapproxy/test/system/fixture/minimal_cgi.py +16 -0
- mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
- mapproxy/test/system/fixture/multi_cache_layers.yaml +100 -0
- mapproxy/test/system/fixture/multiapp1.yaml +20 -0
- mapproxy/test/system/fixture/multiapp2.yaml +19 -0
- mapproxy/test/system/fixture/renderd_client.yaml +55 -0
- mapproxy/test/system/fixture/scalehints.yaml +70 -0
- mapproxy/test/system/fixture/seed.yaml +94 -0
- mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
- mapproxy/test/system/fixture/seed_old.yaml +12 -0
- mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
- mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
- mapproxy/test/system/fixture/seedonly.yaml +51 -0
- mapproxy/test/system/fixture/sld.yaml +35 -0
- mapproxy/test/system/fixture/source_errors.yaml +84 -0
- mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
- mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
- mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
- mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
- mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
- mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
- mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
- mapproxy/test/system/fixture/util_grids.yaml +30 -0
- mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
- mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
- mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
- mapproxy/test/system/fixture/watermark.yaml +50 -0
- mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
- mapproxy/test/system/fixture/wms_versions.yaml +38 -0
- mapproxy/test/system/fixture/wmts.yaml +134 -0
- mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
- mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
- mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
- mapproxy/test/system/test_arcgis.py +156 -0
- mapproxy/test/system/test_auth.py +1134 -0
- mapproxy/test/system/test_behind_proxy.py +75 -0
- mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
- mapproxy/test/system/test_cache_azureblob.py +127 -0
- mapproxy/test/system/test_cache_band_merge.py +103 -0
- mapproxy/test/system/test_cache_geopackage.py +144 -0
- mapproxy/test/system/test_cache_grid_names.py +89 -0
- mapproxy/test/system/test_cache_mbtiles.py +85 -0
- mapproxy/test/system/test_cache_s3.py +115 -0
- mapproxy/test/system/test_cache_source.py +146 -0
- mapproxy/test/system/test_combined_sources.py +335 -0
- mapproxy/test/system/test_coverage.py +140 -0
- mapproxy/test/system/test_decorate_img.py +214 -0
- mapproxy/test/system/test_demo.py +106 -0
- mapproxy/test/system/test_demo_with_extra_service.py +53 -0
- mapproxy/test/system/test_dimensions.py +278 -0
- mapproxy/test/system/test_disable_storage.py +42 -0
- mapproxy/test/system/test_formats.py +219 -0
- mapproxy/test/system/test_inspire_vs.py +173 -0
- mapproxy/test/system/test_kml.py +262 -0
- mapproxy/test/system/test_layergroups.py +160 -0
- mapproxy/test/system/test_legendgraphic.py +308 -0
- mapproxy/test/system/test_mapnik.py +161 -0
- mapproxy/test/system/test_mapserver.py +81 -0
- mapproxy/test/system/test_mixed_mode_format.py +195 -0
- mapproxy/test/system/test_multi_cache_layers.py +167 -0
- mapproxy/test/system/test_multiapp.py +92 -0
- mapproxy/test/system/test_refresh.py +207 -0
- mapproxy/test/system/test_renderd_client.py +304 -0
- mapproxy/test/system/test_response_headers.py +54 -0
- mapproxy/test/system/test_scalehints.py +140 -0
- mapproxy/test/system/test_seed.py +422 -0
- mapproxy/test/system/test_seed_only.py +93 -0
- mapproxy/test/system/test_sld.py +120 -0
- mapproxy/test/system/test_source_errors.py +377 -0
- mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
- mapproxy/test/system/test_tms.py +276 -0
- mapproxy/test/system/test_tms_origin.py +46 -0
- mapproxy/test/system/test_util_conf.py +304 -0
- mapproxy/test/system/test_util_export.py +210 -0
- mapproxy/test/system/test_util_grids.py +88 -0
- mapproxy/test/system/test_util_wms_capabilities.py +182 -0
- mapproxy/test/system/test_watermark.py +91 -0
- mapproxy/test/system/test_wms.py +1611 -0
- mapproxy/test/system/test_wms_srs_extent.py +165 -0
- mapproxy/test/system/test_wms_version.py +85 -0
- mapproxy/test/system/test_wmsc.py +116 -0
- mapproxy/test/system/test_wmts.py +334 -0
- mapproxy/test/system/test_wmts_dimensions.py +206 -0
- mapproxy/test/system/test_wmts_restful.py +198 -0
- mapproxy/test/system/test_xslt_featureinfo.py +425 -0
- mapproxy/test/test_http_helper.py +219 -0
- mapproxy/test/unit/__init__.py +0 -0
- mapproxy/test/unit/epsg +2 -0
- mapproxy/test/unit/polygons/polygons.dbf +0 -0
- mapproxy/test/unit/polygons/polygons.shp +0 -0
- mapproxy/test/unit/polygons/polygons.shx +0 -0
- mapproxy/test/unit/test_async.py +245 -0
- mapproxy/test/unit/test_auth.py +419 -0
- mapproxy/test/unit/test_cache.py +1193 -0
- mapproxy/test/unit/test_cache_azureblob.py +94 -0
- mapproxy/test/unit/test_cache_compact.py +319 -0
- mapproxy/test/unit/test_cache_couchdb.py +114 -0
- mapproxy/test/unit/test_cache_geopackage.py +221 -0
- mapproxy/test/unit/test_cache_redis.py +67 -0
- mapproxy/test/unit/test_cache_riak.py +76 -0
- mapproxy/test/unit/test_cache_s3.py +84 -0
- mapproxy/test/unit/test_cache_tile.py +427 -0
- mapproxy/test/unit/test_client.py +479 -0
- mapproxy/test/unit/test_client_arcgis.py +73 -0
- mapproxy/test/unit/test_client_cgi.py +136 -0
- mapproxy/test/unit/test_collections.py +116 -0
- mapproxy/test/unit/test_concat_legends.py +37 -0
- mapproxy/test/unit/test_conf_loader.py +1061 -0
- mapproxy/test/unit/test_conf_validator.py +416 -0
- mapproxy/test/unit/test_config.py +117 -0
- mapproxy/test/unit/test_decorate_img.py +185 -0
- mapproxy/test/unit/test_exceptions.py +258 -0
- mapproxy/test/unit/test_featureinfo.py +291 -0
- mapproxy/test/unit/test_file_lock_load.py +49 -0
- mapproxy/test/unit/test_geom.py +503 -0
- mapproxy/test/unit/test_grid.py +1258 -0
- mapproxy/test/unit/test_image.py +1053 -0
- mapproxy/test/unit/test_image_mask.py +181 -0
- mapproxy/test/unit/test_image_messages.py +197 -0
- mapproxy/test/unit/test_image_options.py +160 -0
- mapproxy/test/unit/test_isodate.py +122 -0
- mapproxy/test/unit/test_multiapp.py +163 -0
- mapproxy/test/unit/test_ogr_reader.py +50 -0
- mapproxy/test/unit/test_request.py +745 -0
- mapproxy/test/unit/test_request_wmts.py +178 -0
- mapproxy/test/unit/test_response.py +79 -0
- mapproxy/test/unit/test_seed.py +365 -0
- mapproxy/test/unit/test_seed_cachelock.py +90 -0
- mapproxy/test/unit/test_srs.py +215 -0
- mapproxy/test/unit/test_tiled_source.py +122 -0
- mapproxy/test/unit/test_tilefilter.py +31 -0
- mapproxy/test/unit/test_times.py +25 -0
- mapproxy/test/unit/test_timeutils.py +50 -0
- mapproxy/test/unit/test_util_conf_utils.py +75 -0
- mapproxy/test/unit/test_utils.py +476 -0
- mapproxy/test/unit/test_wms_capabilities.py +44 -0
- mapproxy/test/unit/test_wms_layer.py +113 -0
- mapproxy/test/unit/test_yaml.py +69 -0
- mapproxy/tilefilter.py +59 -0
- mapproxy/util/__init__.py +0 -0
- mapproxy/util/async_.py +227 -0
- mapproxy/util/collections.py +132 -0
- mapproxy/util/coverage.py +329 -0
- mapproxy/util/escape.py +10 -0
- mapproxy/util/ext/__init__.py +14 -0
- mapproxy/util/ext/dictspec/__init__.py +1 -0
- mapproxy/util/ext/dictspec/spec.py +124 -0
- mapproxy/util/ext/dictspec/test/__init__.py +0 -0
- mapproxy/util/ext/dictspec/test/test_validator.py +274 -0
- mapproxy/util/ext/dictspec/validator.py +189 -0
- mapproxy/util/ext/local.py +196 -0
- mapproxy/util/ext/lockfile.py +138 -0
- mapproxy/util/ext/odict.py +330 -0
- mapproxy/util/ext/serving.py +508 -0
- mapproxy/util/ext/tempita/__init__.py +1174 -0
- mapproxy/util/ext/tempita/_looper.py +163 -0
- mapproxy/util/ext/tempita/compat3.py +46 -0
- mapproxy/util/ext/wmsparse/__init__.py +3 -0
- mapproxy/util/ext/wmsparse/duration.py +597 -0
- mapproxy/util/ext/wmsparse/parse.py +305 -0
- mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
- mapproxy/util/ext/wmsparse/test/test_parse.py +162 -0
- mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
- mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
- mapproxy/util/ext/wmsparse/test/wms-omniscale-111.xml +90 -0
- mapproxy/util/ext/wmsparse/test/wms-omniscale-130.xml +120 -0
- mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
- mapproxy/util/ext/wmsparse/util.py +187 -0
- mapproxy/util/fs.py +156 -0
- mapproxy/util/geom.py +295 -0
- mapproxy/util/lib.py +115 -0
- mapproxy/util/lock.py +163 -0
- mapproxy/util/ogr.py +231 -0
- mapproxy/util/py.py +81 -0
- mapproxy/util/times.py +75 -0
- mapproxy/util/yaml.py +56 -0
- mapproxy/version.py +31 -0
- mapproxy/wsgiapp.py +164 -0
- mapproxy-1.16.1.dist-info/METADATA +151 -0
- mapproxy-1.16.1.dist-info/RECORD +458 -0
- mapproxy-1.16.1.dist-info/WHEEL +5 -0
- mapproxy-1.16.1.dist-info/entry_points.txt +3 -0
- mapproxy-1.16.1.dist-info/licenses/AUTHORS.txt +33 -0
- mapproxy-1.16.1.dist-info/licenses/COPYING.txt +60 -0
- mapproxy-1.16.1.dist-info/licenses/LICENSE.txt +202 -0
- mapproxy-1.16.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2010-2012 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
|
|
18
|
+
import pytest
|
|
19
|
+
|
|
20
|
+
from mapproxy.test.image import img_from_buf
|
|
21
|
+
from mapproxy.test.http import mock_single_req_httpd
|
|
22
|
+
from mapproxy.test.system import SysTest
|
|
23
|
+
from mapproxy.request.wms import (
|
|
24
|
+
WMS111MapRequest,
|
|
25
|
+
WMS111FeatureInfoRequest,
|
|
26
|
+
WMS111CapabilitiesRequest,
|
|
27
|
+
)
|
|
28
|
+
from mapproxy.test.helper import validate_with_dtd
|
|
29
|
+
from mapproxy.test.http import mock_httpd
|
|
30
|
+
from mapproxy.test.image import create_tmp_image
|
|
31
|
+
from mapproxy.test.system.test_wms import is_111_exception
|
|
32
|
+
from mapproxy.cache.renderd import has_renderd_support
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@pytest.fixture(scope="module")
|
|
36
|
+
def config_file():
|
|
37
|
+
return "renderd_client.yaml"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
pytestmark = pytest.mark.skipif(not has_renderd_support(), reason="requests required")
|
|
41
|
+
|
|
42
|
+
try:
|
|
43
|
+
from http.server import BaseHTTPRequestHandler
|
|
44
|
+
except ImportError:
|
|
45
|
+
from BaseHTTPServer import BaseHTTPRequestHandler
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class TestWMS111(SysTest):
|
|
49
|
+
|
|
50
|
+
def setup(self):
|
|
51
|
+
self.common_req = WMS111MapRequest(
|
|
52
|
+
url="/service?", param=dict(service="WMS", version="1.1.1")
|
|
53
|
+
)
|
|
54
|
+
self.common_map_req = WMS111MapRequest(
|
|
55
|
+
url="/service?",
|
|
56
|
+
param=dict(
|
|
57
|
+
service="WMS",
|
|
58
|
+
version="1.1.1",
|
|
59
|
+
bbox="-180,0,0,80",
|
|
60
|
+
width="200",
|
|
61
|
+
height="200",
|
|
62
|
+
layers="wms_cache",
|
|
63
|
+
srs="EPSG:4326",
|
|
64
|
+
format="image/png",
|
|
65
|
+
exceptions="xml",
|
|
66
|
+
styles="",
|
|
67
|
+
request="GetMap",
|
|
68
|
+
),
|
|
69
|
+
)
|
|
70
|
+
self.common_fi_req = WMS111FeatureInfoRequest(
|
|
71
|
+
url="/service?",
|
|
72
|
+
param=dict(
|
|
73
|
+
x="10",
|
|
74
|
+
y="20",
|
|
75
|
+
width="200",
|
|
76
|
+
height="200",
|
|
77
|
+
layers="wms_cache",
|
|
78
|
+
format="image/png",
|
|
79
|
+
query_layers="wms_cache",
|
|
80
|
+
styles="",
|
|
81
|
+
bbox="1000,400,2000,1400",
|
|
82
|
+
srs="EPSG:900913",
|
|
83
|
+
),
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
def test_wms_capabilities(self, app):
|
|
87
|
+
req = WMS111CapabilitiesRequest(url="/service?").copy_with_request_params(
|
|
88
|
+
self.common_req
|
|
89
|
+
)
|
|
90
|
+
resp = app.get(req)
|
|
91
|
+
assert resp.content_type == "application/vnd.ogc.wms_xml"
|
|
92
|
+
xml = resp.lxml
|
|
93
|
+
assert (
|
|
94
|
+
xml.xpath(
|
|
95
|
+
"//GetMap//OnlineResource/@xlink:href",
|
|
96
|
+
namespaces=dict(xlink="http://www.w3.org/1999/xlink"),
|
|
97
|
+
)[0]
|
|
98
|
+
== "http://localhost/service?"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
layer_names = set(xml.xpath("//Layer/Layer/Name/text()"))
|
|
102
|
+
expected_names = set(["direct", "wms_cache", "tms_cache"])
|
|
103
|
+
assert layer_names == expected_names
|
|
104
|
+
assert validate_with_dtd(xml, dtd_name="wms/1.1.1/WMS_MS_Capabilities.dtd")
|
|
105
|
+
|
|
106
|
+
def test_get_map(self, app, cache_dir):
|
|
107
|
+
|
|
108
|
+
class req_handler(BaseHTTPRequestHandler):
|
|
109
|
+
|
|
110
|
+
def do_POST(self):
|
|
111
|
+
length = int(self.headers["content-length"])
|
|
112
|
+
json_data = self.rfile.read(length)
|
|
113
|
+
task = json.loads(json_data.decode("utf-8"))
|
|
114
|
+
assert task["command"] == "tile"
|
|
115
|
+
# request main tile of metatile
|
|
116
|
+
assert task["tiles"] == [[15, 17, 5]]
|
|
117
|
+
assert task["cache_identifier"] == "wms_cache_GLOBAL_MERCATOR"
|
|
118
|
+
assert task["priority"] == 100
|
|
119
|
+
# this id should not change for the same tile/cache_identifier combination
|
|
120
|
+
assert task["id"] == "aeb52b506e4e82d0a1edf649d56e0451cfd5862c"
|
|
121
|
+
|
|
122
|
+
# manually create tile renderd should create
|
|
123
|
+
cache_dir.join(
|
|
124
|
+
"wms_cache_EPSG900913/05/000/000/016/000/000/016.jpeg"
|
|
125
|
+
).write_binary(
|
|
126
|
+
create_tmp_image((256, 256), format="jpeg", color=(255, 0, 100)),
|
|
127
|
+
ensure=True,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
self.send_response(200)
|
|
131
|
+
self.send_header("Content-type", "application/json")
|
|
132
|
+
self.end_headers()
|
|
133
|
+
self.wfile.write(b'{"status": "ok"}')
|
|
134
|
+
|
|
135
|
+
def log_request(self, code, size=None):
|
|
136
|
+
pass
|
|
137
|
+
|
|
138
|
+
with mock_single_req_httpd(("localhost", 42423), req_handler):
|
|
139
|
+
self.common_map_req.params["bbox"] = "0,0,9,9"
|
|
140
|
+
resp = app.get(self.common_map_req)
|
|
141
|
+
|
|
142
|
+
img = img_from_buf(resp.body)
|
|
143
|
+
main_color = sorted(img.convert("RGBA").getcolors())[-1]
|
|
144
|
+
# check for red color (jpeg/png conversion requires fuzzy comparision)
|
|
145
|
+
assert main_color[0] == 40000
|
|
146
|
+
assert main_color[1][0] > 250
|
|
147
|
+
assert main_color[1][1] < 5
|
|
148
|
+
assert 95 < main_color[1][2] < 105
|
|
149
|
+
assert main_color[1][3] == 255
|
|
150
|
+
|
|
151
|
+
assert resp.content_type == "image/png"
|
|
152
|
+
assert cache_dir.join(
|
|
153
|
+
"wms_cache_EPSG900913/05/000/000/016/000/000/016.jpeg"
|
|
154
|
+
).check()
|
|
155
|
+
|
|
156
|
+
def test_get_map_error(self, app):
|
|
157
|
+
|
|
158
|
+
class req_handler(BaseHTTPRequestHandler):
|
|
159
|
+
|
|
160
|
+
def do_POST(self):
|
|
161
|
+
length = int(self.headers["content-length"])
|
|
162
|
+
json_data = self.rfile.read(length)
|
|
163
|
+
task = json.loads(json_data.decode("utf-8"))
|
|
164
|
+
assert task["command"] == "tile"
|
|
165
|
+
# request main tile of metatile
|
|
166
|
+
assert task["tiles"] == [[15, 17, 5]]
|
|
167
|
+
assert task["cache_identifier"] == "wms_cache_GLOBAL_MERCATOR"
|
|
168
|
+
assert task["priority"] == 100
|
|
169
|
+
# this id should not change for the same tile/cache_identifier combination
|
|
170
|
+
assert task["id"] == "aeb52b506e4e82d0a1edf649d56e0451cfd5862c"
|
|
171
|
+
|
|
172
|
+
self.send_response(200)
|
|
173
|
+
self.send_header("Content-type", "application/json")
|
|
174
|
+
self.end_headers()
|
|
175
|
+
self.wfile.write(b'{"status": "error", "error_message": "barf"}')
|
|
176
|
+
|
|
177
|
+
def log_request(self, code, size=None):
|
|
178
|
+
pass
|
|
179
|
+
|
|
180
|
+
with mock_single_req_httpd(("localhost", 42423), req_handler):
|
|
181
|
+
self.common_map_req.params["bbox"] = "0,0,9,9"
|
|
182
|
+
resp = app.get(self.common_map_req)
|
|
183
|
+
|
|
184
|
+
assert resp.content_type == "application/vnd.ogc.se_xml"
|
|
185
|
+
is_111_exception(resp.lxml, re_msg="Error from renderd: barf")
|
|
186
|
+
|
|
187
|
+
def test_get_map_connection_error(self, app):
|
|
188
|
+
self.common_map_req.params["bbox"] = "0,0,9,9"
|
|
189
|
+
resp = app.get(self.common_map_req)
|
|
190
|
+
|
|
191
|
+
assert resp.content_type == "application/vnd.ogc.se_xml"
|
|
192
|
+
is_111_exception(resp.lxml, re_msg="Error while communicating with renderd:")
|
|
193
|
+
|
|
194
|
+
def test_get_map_non_json_response(self, app):
|
|
195
|
+
|
|
196
|
+
class req_handler(BaseHTTPRequestHandler):
|
|
197
|
+
|
|
198
|
+
def do_POST(self):
|
|
199
|
+
length = int(self.headers["content-length"])
|
|
200
|
+
json_data = self.rfile.read(length)
|
|
201
|
+
json.loads(json_data.decode("utf-8"))
|
|
202
|
+
|
|
203
|
+
self.send_response(200)
|
|
204
|
+
self.send_header("Content-type", "application/json")
|
|
205
|
+
self.end_headers()
|
|
206
|
+
self.wfile.write(b'{"invalid')
|
|
207
|
+
|
|
208
|
+
def log_request(self, code, size=None):
|
|
209
|
+
pass
|
|
210
|
+
|
|
211
|
+
with mock_single_req_httpd(("localhost", 42423), req_handler):
|
|
212
|
+
self.common_map_req.params["bbox"] = "0,0,9,9"
|
|
213
|
+
resp = app.get(self.common_map_req)
|
|
214
|
+
|
|
215
|
+
assert resp.content_type == "application/vnd.ogc.se_xml"
|
|
216
|
+
is_111_exception(
|
|
217
|
+
resp.lxml, re_msg="Error while communicating with renderd: invalid JSON"
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
def test_get_featureinfo(self, app):
|
|
221
|
+
expected_req = (
|
|
222
|
+
{
|
|
223
|
+
"path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fpng"
|
|
224
|
+
"&REQUEST=GetFeatureInfo&HEIGHT=200&SRS=EPSG%3A900913"
|
|
225
|
+
"&VERSION=1.1.1&BBOX=1000.0,400.0,2000.0,1400.0&styles="
|
|
226
|
+
"&WIDTH=200&QUERY_LAYERS=foo,bar&X=10&Y=20&feature_count=100"
|
|
227
|
+
},
|
|
228
|
+
{"body": b"info", "headers": {"content-type": "text/plain"}},
|
|
229
|
+
)
|
|
230
|
+
with mock_httpd(("localhost", 42423), [expected_req]):
|
|
231
|
+
self.common_fi_req.params["feature_count"] = 100
|
|
232
|
+
resp = app.get(self.common_fi_req)
|
|
233
|
+
assert resp.content_type == "text/plain"
|
|
234
|
+
assert resp.body == b"info"
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
class TestTiles(SysTest):
|
|
238
|
+
|
|
239
|
+
def test_get_tile(self, app, cache_dir):
|
|
240
|
+
|
|
241
|
+
class req_handler(BaseHTTPRequestHandler):
|
|
242
|
+
|
|
243
|
+
def do_POST(self):
|
|
244
|
+
length = int(self.headers["content-length"])
|
|
245
|
+
json_data = self.rfile.read(length)
|
|
246
|
+
task = json.loads(json_data.decode("utf-8"))
|
|
247
|
+
assert task["command"] == "tile"
|
|
248
|
+
assert task["tiles"] == [[10, 20, 6]]
|
|
249
|
+
assert task["cache_identifier"] == "tms_cache_GLOBAL_MERCATOR"
|
|
250
|
+
assert task["priority"] == 100
|
|
251
|
+
# this id should not change for the same tile/cache_identifier combination
|
|
252
|
+
assert task["id"] == "cf35c1c927158e188d8fbe0db380c1772b536da9"
|
|
253
|
+
|
|
254
|
+
# manually create tile renderd should create
|
|
255
|
+
cache_dir.join(
|
|
256
|
+
"tms_cache_EPSG900913/06/000/000/010/000/000/020.png"
|
|
257
|
+
).write_binary(b"foobaz", ensure=True)
|
|
258
|
+
|
|
259
|
+
self.send_response(200)
|
|
260
|
+
self.send_header("Content-type", "application/json")
|
|
261
|
+
self.end_headers()
|
|
262
|
+
self.wfile.write(b'{"status": "ok"}')
|
|
263
|
+
|
|
264
|
+
def log_request(self, code, size=None):
|
|
265
|
+
pass
|
|
266
|
+
|
|
267
|
+
with mock_single_req_httpd(("localhost", 42423), req_handler):
|
|
268
|
+
resp = app.get("/tiles/tms_cache/EPSG900913/6/10/20.png")
|
|
269
|
+
|
|
270
|
+
assert resp.content_type == "image/png"
|
|
271
|
+
assert resp.body == b"foobaz"
|
|
272
|
+
assert cache_dir.join(
|
|
273
|
+
"tms_cache_EPSG900913/06/000/000/010/000/000/020.png"
|
|
274
|
+
).check()
|
|
275
|
+
|
|
276
|
+
def test_get_tile_error(self, app):
|
|
277
|
+
|
|
278
|
+
class req_handler(BaseHTTPRequestHandler):
|
|
279
|
+
|
|
280
|
+
def do_POST(self):
|
|
281
|
+
length = int(self.headers["content-length"])
|
|
282
|
+
json_data = self.rfile.read(length)
|
|
283
|
+
task = json.loads(json_data.decode("utf-8"))
|
|
284
|
+
assert task["command"] == "tile"
|
|
285
|
+
assert task["tiles"] == [[10, 20, 7]]
|
|
286
|
+
assert task["cache_identifier"] == "tms_cache_GLOBAL_MERCATOR"
|
|
287
|
+
assert task["priority"] == 100
|
|
288
|
+
# this id should not change for the same tile/cache_identifier combination
|
|
289
|
+
assert task["id"] == "c24b8c3247afec34fd0a53e5d3706e977877ef47"
|
|
290
|
+
|
|
291
|
+
self.send_response(200)
|
|
292
|
+
self.send_header("Content-type", "application/json")
|
|
293
|
+
self.end_headers()
|
|
294
|
+
self.wfile.write(
|
|
295
|
+
b'{"status": "error", "error_message": "you told me to fail"}'
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
def log_request(self, code, size=None):
|
|
299
|
+
pass
|
|
300
|
+
|
|
301
|
+
with mock_single_req_httpd(("localhost", 42423), req_handler):
|
|
302
|
+
resp = app.get("/tiles/tms_cache/EPSG900913/7/10/20.png", status=500)
|
|
303
|
+
assert resp.content_type == "text/plain"
|
|
304
|
+
assert resp.body == b"Error from renderd: you told me to fail"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2011 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from __future__ import division
|
|
17
|
+
|
|
18
|
+
import pytest
|
|
19
|
+
|
|
20
|
+
from mapproxy.test.system import SysTest
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TestResponseHeaders(SysTest):
|
|
24
|
+
"""
|
|
25
|
+
Check if the vary header is set for text / xml content like capabilities
|
|
26
|
+
"""
|
|
27
|
+
@pytest.fixture(scope='class')
|
|
28
|
+
def config_file(self):
|
|
29
|
+
return 'auth.yaml'
|
|
30
|
+
|
|
31
|
+
def test_tms(self, app):
|
|
32
|
+
resp = app.get('http://localhost/tms')
|
|
33
|
+
assert resp.vary == ('X-Script-Name', 'X-Forwarded-Host', 'X-Forwarded-Proto')
|
|
34
|
+
|
|
35
|
+
def test_wms(self, app):
|
|
36
|
+
resp = app.get('http://localhost/service?SERVICE=WMS&REQUEST=GetCapabilities'
|
|
37
|
+
'&VERSION=1.1.0')
|
|
38
|
+
assert resp.vary == ('X-Script-Name', 'X-Forwarded-Host', 'X-Forwarded-Proto')
|
|
39
|
+
|
|
40
|
+
def test_wmts(self, app):
|
|
41
|
+
resp = app.get('http://localhost/service?SERVICE=WMTS&REQUEST=GetCapabilities')
|
|
42
|
+
assert resp.vary == ('X-Script-Name', 'X-Forwarded-Host', 'X-Forwarded-Proto')
|
|
43
|
+
|
|
44
|
+
def test_restful_wmts(self, app):
|
|
45
|
+
resp = app.get('http://localhost/wmts/1.0.0/WMTSCapabilities.xml')
|
|
46
|
+
assert resp.vary == ('X-Script-Name', 'X-Forwarded-Host', 'X-Forwarded-Proto')
|
|
47
|
+
|
|
48
|
+
def test_no_endpoint(self, app):
|
|
49
|
+
resp = app.get('http://localhost/service?')
|
|
50
|
+
assert resp.vary == ('X-Script-Name', 'X-Forwarded-Host', 'X-Forwarded-Proto')
|
|
51
|
+
|
|
52
|
+
def test_image_response(self, app):
|
|
53
|
+
resp = app.get('http://localhost/tms/1.0.0/layer1a/EPSG900913/0/0/0.png')
|
|
54
|
+
assert resp.vary == None
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2010 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from __future__ import division
|
|
17
|
+
import math
|
|
18
|
+
|
|
19
|
+
import pytest
|
|
20
|
+
|
|
21
|
+
from mapproxy.request.wms import (
|
|
22
|
+
WMS111MapRequest,
|
|
23
|
+
WMS111CapabilitiesRequest,
|
|
24
|
+
WMS130CapabilitiesRequest,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
from mapproxy.test.system import SysTest
|
|
28
|
+
from mapproxy.test.image import is_png, is_transparent, tmp_image
|
|
29
|
+
from mapproxy.test.http import mock_httpd
|
|
30
|
+
from mapproxy.test.system.test_wms import is_111_capa, is_130_capa, ns130
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@pytest.fixture(scope="module")
|
|
34
|
+
def config_file():
|
|
35
|
+
return "scalehints.yaml"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def diagonal_res_to_pixel_res(res):
|
|
39
|
+
"""
|
|
40
|
+
>>> '%.2f' % round(diagonal_res_to_pixel_res(14.14214), 4)
|
|
41
|
+
'10.00'
|
|
42
|
+
"""
|
|
43
|
+
return math.sqrt((float(res) ** 2) / 2)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class TestWMS(SysTest):
|
|
47
|
+
|
|
48
|
+
def setup(self):
|
|
49
|
+
self.common_req = WMS111MapRequest(
|
|
50
|
+
url="/service?", param=dict(service="WMS", version="1.1.1")
|
|
51
|
+
)
|
|
52
|
+
self.common_map_req = WMS111MapRequest(
|
|
53
|
+
url="/service?",
|
|
54
|
+
param=dict(
|
|
55
|
+
service="WMS",
|
|
56
|
+
version="1.1.1",
|
|
57
|
+
bbox="-180,0,0,80",
|
|
58
|
+
width="200",
|
|
59
|
+
height="200",
|
|
60
|
+
layers="res",
|
|
61
|
+
srs="EPSG:4326",
|
|
62
|
+
format="image/png",
|
|
63
|
+
transparent="true",
|
|
64
|
+
styles="",
|
|
65
|
+
request="GetMap",
|
|
66
|
+
),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def test_capabilities_111(self, app):
|
|
70
|
+
req = WMS111CapabilitiesRequest(url="/service?").copy_with_request_params(
|
|
71
|
+
self.common_req
|
|
72
|
+
)
|
|
73
|
+
resp = app.get(req)
|
|
74
|
+
xml = resp.lxml
|
|
75
|
+
assert is_111_capa(xml)
|
|
76
|
+
hints = xml.xpath("//Layer/Layer/ScaleHint")
|
|
77
|
+
assert diagonal_res_to_pixel_res(hints[0].attrib["min"]) == pytest.approx(10)
|
|
78
|
+
assert diagonal_res_to_pixel_res(hints[0].attrib["max"]) == pytest.approx(10000)
|
|
79
|
+
|
|
80
|
+
assert diagonal_res_to_pixel_res(hints[1].attrib["min"]) == pytest.approx(2.8)
|
|
81
|
+
assert diagonal_res_to_pixel_res(hints[1].attrib["max"]) == pytest.approx(280)
|
|
82
|
+
|
|
83
|
+
assert diagonal_res_to_pixel_res(hints[2].attrib["min"]) == pytest.approx(0.28)
|
|
84
|
+
assert diagonal_res_to_pixel_res(hints[2].attrib["max"]) == pytest.approx(2.8)
|
|
85
|
+
|
|
86
|
+
def test_capabilities_130(self, app):
|
|
87
|
+
req = WMS130CapabilitiesRequest(url="/service?").copy_with_request_params(
|
|
88
|
+
self.common_req
|
|
89
|
+
)
|
|
90
|
+
resp = app.get(req)
|
|
91
|
+
xml = resp.lxml
|
|
92
|
+
assert is_130_capa(xml)
|
|
93
|
+
min_scales = xml.xpath(
|
|
94
|
+
"//wms:Layer/wms:Layer/wms:MinScaleDenominator/text()", namespaces=ns130
|
|
95
|
+
)
|
|
96
|
+
max_scales = xml.xpath(
|
|
97
|
+
"//wms:Layer/wms:Layer/wms:MaxScaleDenominator/text()", namespaces=ns130
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
assert float(min_scales[0]) == pytest.approx(35714.28)
|
|
101
|
+
assert float(max_scales[0]) == pytest.approx(35714285.7)
|
|
102
|
+
|
|
103
|
+
assert float(min_scales[1]) == pytest.approx(10000)
|
|
104
|
+
assert float(max_scales[1]) == pytest.approx(1000000)
|
|
105
|
+
|
|
106
|
+
assert float(min_scales[2]) == pytest.approx(1000)
|
|
107
|
+
assert float(max_scales[2]) == pytest.approx(10000)
|
|
108
|
+
|
|
109
|
+
def test_get_map_above_res(self, app):
|
|
110
|
+
# no layer rendered
|
|
111
|
+
resp = app.get(self.common_map_req)
|
|
112
|
+
assert is_png(resp.body)
|
|
113
|
+
assert is_transparent(resp.body)
|
|
114
|
+
|
|
115
|
+
def test_get_map_mixed(self, app, cache_dir):
|
|
116
|
+
# only res layer matches resolution range
|
|
117
|
+
self.common_map_req.params["layers"] = "res,scale"
|
|
118
|
+
self.common_map_req.params["bbox"] = "0,0,100000,100000"
|
|
119
|
+
self.common_map_req.params["srs"] = "EPSG:900913"
|
|
120
|
+
self.common_map_req.params.size = 100, 100
|
|
121
|
+
with tmp_image((256, 256), format="jpeg") as img:
|
|
122
|
+
expected_req = (
|
|
123
|
+
{
|
|
124
|
+
"path": r"/service?LAYERs=reslayer&SERVICE=WMS&FORMAT=image%2Fjpeg"
|
|
125
|
+
"&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
|
|
126
|
+
"&VERSION=1.1.1&BBOX=0.0,0.0,156543.033928,156543.033928"
|
|
127
|
+
"&WIDTH=256"
|
|
128
|
+
},
|
|
129
|
+
{"body": img.read(), "headers": {"content-type": "image/png"}},
|
|
130
|
+
)
|
|
131
|
+
with mock_httpd(
|
|
132
|
+
("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
|
|
133
|
+
):
|
|
134
|
+
resp = app.get(self.common_map_req)
|
|
135
|
+
assert is_png(resp.body)
|
|
136
|
+
assert not is_transparent(resp.body)
|
|
137
|
+
|
|
138
|
+
assert cache_dir.join(
|
|
139
|
+
"res_cache_EPSG900913/08/000/000/128/000/000/128.jpeg"
|
|
140
|
+
).check()
|