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.
Files changed (458) hide show
  1. mapproxy/__init__.py +0 -0
  2. mapproxy/cache/__init__.py +36 -0
  3. mapproxy/cache/azureblob.py +145 -0
  4. mapproxy/cache/base.py +111 -0
  5. mapproxy/cache/compact.py +664 -0
  6. mapproxy/cache/couchdb.py +295 -0
  7. mapproxy/cache/dummy.py +34 -0
  8. mapproxy/cache/file.py +185 -0
  9. mapproxy/cache/geopackage.py +609 -0
  10. mapproxy/cache/legend.py +83 -0
  11. mapproxy/cache/mbtiles.py +392 -0
  12. mapproxy/cache/meta.py +78 -0
  13. mapproxy/cache/path.py +250 -0
  14. mapproxy/cache/redis.py +88 -0
  15. mapproxy/cache/renderd.py +95 -0
  16. mapproxy/cache/riak.py +202 -0
  17. mapproxy/cache/s3.py +177 -0
  18. mapproxy/cache/tile.py +699 -0
  19. mapproxy/client/__init__.py +0 -0
  20. mapproxy/client/arcgis.py +79 -0
  21. mapproxy/client/cgi.py +139 -0
  22. mapproxy/client/http.py +315 -0
  23. mapproxy/client/log.py +33 -0
  24. mapproxy/client/tile.py +150 -0
  25. mapproxy/client/wms.py +254 -0
  26. mapproxy/compat/__init__.py +46 -0
  27. mapproxy/compat/image.py +79 -0
  28. mapproxy/compat/itertools.py +29 -0
  29. mapproxy/compat/modules.py +13 -0
  30. mapproxy/config/__init__.py +22 -0
  31. mapproxy/config/config.py +201 -0
  32. mapproxy/config/coverage.py +107 -0
  33. mapproxy/config/defaults.py +98 -0
  34. mapproxy/config/loader.py +2286 -0
  35. mapproxy/config/spec.py +644 -0
  36. mapproxy/config/validator.py +239 -0
  37. mapproxy/config_template/__init__.py +0 -0
  38. mapproxy/config_template/base_config/config.wsgi +10 -0
  39. mapproxy/config_template/base_config/full_example.yaml +593 -0
  40. mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
  41. mapproxy/config_template/base_config/log.ini +35 -0
  42. mapproxy/config_template/base_config/mapproxy.yaml +60 -0
  43. mapproxy/config_template/base_config/seed.yaml +27 -0
  44. mapproxy/exception.py +142 -0
  45. mapproxy/featureinfo.py +252 -0
  46. mapproxy/grid.py +1170 -0
  47. mapproxy/image/__init__.py +536 -0
  48. mapproxy/image/fonts/DejaVuSans.ttf +0 -0
  49. mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
  50. mapproxy/image/fonts/LICENSE +99 -0
  51. mapproxy/image/fonts/__init__.py +0 -0
  52. mapproxy/image/mask.py +75 -0
  53. mapproxy/image/merge.py +316 -0
  54. mapproxy/image/message.py +347 -0
  55. mapproxy/image/opts.py +182 -0
  56. mapproxy/image/tile.py +167 -0
  57. mapproxy/image/transform.py +350 -0
  58. mapproxy/layer.py +470 -0
  59. mapproxy/multiapp.py +231 -0
  60. mapproxy/proj.py +302 -0
  61. mapproxy/request/__init__.py +18 -0
  62. mapproxy/request/arcgis.py +259 -0
  63. mapproxy/request/base.py +476 -0
  64. mapproxy/request/tile.py +128 -0
  65. mapproxy/request/wms/__init__.py +793 -0
  66. mapproxy/request/wms/exception.py +99 -0
  67. mapproxy/request/wmts.py +436 -0
  68. mapproxy/response.py +237 -0
  69. mapproxy/script/__init__.py +0 -0
  70. mapproxy/script/conf/__init__.py +0 -0
  71. mapproxy/script/conf/app.py +195 -0
  72. mapproxy/script/conf/caches.py +45 -0
  73. mapproxy/script/conf/layers.py +54 -0
  74. mapproxy/script/conf/seeds.py +37 -0
  75. mapproxy/script/conf/sources.py +86 -0
  76. mapproxy/script/conf/utils.py +143 -0
  77. mapproxy/script/defrag.py +184 -0
  78. mapproxy/script/export.py +333 -0
  79. mapproxy/script/grids.py +188 -0
  80. mapproxy/script/scales.py +126 -0
  81. mapproxy/script/util.py +406 -0
  82. mapproxy/script/wms_capabilities.py +152 -0
  83. mapproxy/seed/__init__.py +0 -0
  84. mapproxy/seed/cachelock.py +121 -0
  85. mapproxy/seed/cleanup.py +187 -0
  86. mapproxy/seed/config.py +469 -0
  87. mapproxy/seed/script.py +388 -0
  88. mapproxy/seed/seeder.py +538 -0
  89. mapproxy/seed/spec.py +64 -0
  90. mapproxy/seed/util.py +254 -0
  91. mapproxy/service/__init__.py +14 -0
  92. mapproxy/service/base.py +46 -0
  93. mapproxy/service/demo.py +356 -0
  94. mapproxy/service/kml.py +331 -0
  95. mapproxy/service/ows.py +38 -0
  96. mapproxy/service/template_helper.py +53 -0
  97. mapproxy/service/templates/demo/capabilities_demo.html +16 -0
  98. mapproxy/service/templates/demo/demo.html +181 -0
  99. mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
  100. mapproxy/service/templates/demo/static/img/blank.gif +0 -0
  101. mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
  102. mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
  103. mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
  104. mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
  105. mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
  106. mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
  107. mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
  108. mapproxy/service/templates/demo/static/logo.png +0 -0
  109. mapproxy/service/templates/demo/static/ol.css +345 -0
  110. mapproxy/service/templates/demo/static/ol.js +4 -0
  111. mapproxy/service/templates/demo/static/proj4.min.js +1 -0
  112. mapproxy/service/templates/demo/static/proj4defs.js +1 -0
  113. mapproxy/service/templates/demo/static/site.css +137 -0
  114. mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
  115. mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
  116. mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
  117. mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
  118. mapproxy/service/templates/demo/static.html +34 -0
  119. mapproxy/service/templates/demo/tms_demo.html +103 -0
  120. mapproxy/service/templates/demo/wms_demo.html +140 -0
  121. mapproxy/service/templates/demo/wmts_demo.html +110 -0
  122. mapproxy/service/templates/tms_capabilities.xml +13 -0
  123. mapproxy/service/templates/tms_exception.xml +4 -0
  124. mapproxy/service/templates/tms_root_resource.xml +7 -0
  125. mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
  126. mapproxy/service/templates/wms100capabilities.xml +112 -0
  127. mapproxy/service/templates/wms100exception.xml +4 -0
  128. mapproxy/service/templates/wms110capabilities.xml +152 -0
  129. mapproxy/service/templates/wms110exception.xml +5 -0
  130. mapproxy/service/templates/wms111capabilities.xml +183 -0
  131. mapproxy/service/templates/wms111exception.xml +5 -0
  132. mapproxy/service/templates/wms130capabilities.xml +326 -0
  133. mapproxy/service/templates/wms130exception.xml +8 -0
  134. mapproxy/service/templates/wmts100capabilities.xml +155 -0
  135. mapproxy/service/templates/wmts100exception.xml +9 -0
  136. mapproxy/service/tile.py +536 -0
  137. mapproxy/service/wms.py +851 -0
  138. mapproxy/service/wmts.py +381 -0
  139. mapproxy/source/__init__.py +75 -0
  140. mapproxy/source/arcgis.py +39 -0
  141. mapproxy/source/error.py +39 -0
  142. mapproxy/source/mapnik.py +259 -0
  143. mapproxy/source/tile.py +96 -0
  144. mapproxy/source/wms.py +270 -0
  145. mapproxy/srs.py +726 -0
  146. mapproxy/template.py +54 -0
  147. mapproxy/test/__init__.py +0 -0
  148. mapproxy/test/conftest.py +7 -0
  149. mapproxy/test/helper.py +247 -0
  150. mapproxy/test/http.py +494 -0
  151. mapproxy/test/image.py +210 -0
  152. mapproxy/test/mocker.py +2268 -0
  153. mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
  154. mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
  155. mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
  156. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
  157. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
  158. mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
  159. mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
  160. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
  161. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
  162. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
  163. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
  164. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
  165. mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
  166. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
  167. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
  168. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
  169. mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
  170. mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
  171. mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
  172. mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
  173. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
  174. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
  175. mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
  176. mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
  177. mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
  178. mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
  179. mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
  180. mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
  181. mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
  182. mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
  183. mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
  184. mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
  185. mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
  186. mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
  187. mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
  188. mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
  189. mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
  190. mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
  191. mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
  192. mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
  193. mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
  194. mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
  195. mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
  196. mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
  197. mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
  198. mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
  199. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
  200. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
  201. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
  202. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
  203. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
  204. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
  205. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
  206. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
  207. mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
  208. mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  209. mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
  210. mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  211. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
  212. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
  213. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
  214. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
  215. mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
  216. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
  217. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
  218. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
  219. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
  220. mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
  221. mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  222. mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
  223. mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  224. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
  225. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
  226. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
  227. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
  228. mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
  229. mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
  230. mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
  231. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
  232. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
  233. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
  234. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
  235. mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
  236. mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
  237. mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
  238. mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
  239. mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
  240. mapproxy/test/schemas/xml.xsd +287 -0
  241. mapproxy/test/system/__init__.py +98 -0
  242. mapproxy/test/system/fixture/arcgis.yaml +57 -0
  243. mapproxy/test/system/fixture/auth.yaml +70 -0
  244. mapproxy/test/system/fixture/cache.mbtiles +0 -0
  245. mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
  246. mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
  247. mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
  248. mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
  249. mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
  250. mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
  251. mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
  252. mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
  253. mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
  254. mapproxy/test/system/fixture/cache_s3.yaml +58 -0
  255. mapproxy/test/system/fixture/cache_source.yaml +81 -0
  256. mapproxy/test/system/fixture/combined_sources.yaml +130 -0
  257. mapproxy/test/system/fixture/coverage.yaml +77 -0
  258. mapproxy/test/system/fixture/demo.yaml +135 -0
  259. mapproxy/test/system/fixture/dimension.yaml +59 -0
  260. mapproxy/test/system/fixture/disable_storage.yaml +25 -0
  261. mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
  262. mapproxy/test/system/fixture/formats.yaml +72 -0
  263. mapproxy/test/system/fixture/inspire.yaml +101 -0
  264. mapproxy/test/system/fixture/inspire_full.yaml +124 -0
  265. mapproxy/test/system/fixture/kml_layer.yaml +66 -0
  266. mapproxy/test/system/fixture/layer.yaml +260 -0
  267. mapproxy/test/system/fixture/layergroups.yaml +57 -0
  268. mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
  269. mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
  270. mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
  271. mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
  272. mapproxy/test/system/fixture/mapserver.yaml +23 -0
  273. mapproxy/test/system/fixture/minimal_cgi.py +16 -0
  274. mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
  275. mapproxy/test/system/fixture/multi_cache_layers.yaml +100 -0
  276. mapproxy/test/system/fixture/multiapp1.yaml +20 -0
  277. mapproxy/test/system/fixture/multiapp2.yaml +19 -0
  278. mapproxy/test/system/fixture/renderd_client.yaml +55 -0
  279. mapproxy/test/system/fixture/scalehints.yaml +70 -0
  280. mapproxy/test/system/fixture/seed.yaml +94 -0
  281. mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
  282. mapproxy/test/system/fixture/seed_old.yaml +12 -0
  283. mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
  284. mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
  285. mapproxy/test/system/fixture/seedonly.yaml +51 -0
  286. mapproxy/test/system/fixture/sld.yaml +35 -0
  287. mapproxy/test/system/fixture/source_errors.yaml +84 -0
  288. mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
  289. mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
  290. mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
  291. mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
  292. mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
  293. mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
  294. mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
  295. mapproxy/test/system/fixture/util_grids.yaml +30 -0
  296. mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
  297. mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
  298. mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
  299. mapproxy/test/system/fixture/watermark.yaml +50 -0
  300. mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
  301. mapproxy/test/system/fixture/wms_versions.yaml +38 -0
  302. mapproxy/test/system/fixture/wmts.yaml +134 -0
  303. mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
  304. mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
  305. mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
  306. mapproxy/test/system/test_arcgis.py +156 -0
  307. mapproxy/test/system/test_auth.py +1134 -0
  308. mapproxy/test/system/test_behind_proxy.py +75 -0
  309. mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
  310. mapproxy/test/system/test_cache_azureblob.py +127 -0
  311. mapproxy/test/system/test_cache_band_merge.py +103 -0
  312. mapproxy/test/system/test_cache_geopackage.py +144 -0
  313. mapproxy/test/system/test_cache_grid_names.py +89 -0
  314. mapproxy/test/system/test_cache_mbtiles.py +85 -0
  315. mapproxy/test/system/test_cache_s3.py +115 -0
  316. mapproxy/test/system/test_cache_source.py +146 -0
  317. mapproxy/test/system/test_combined_sources.py +335 -0
  318. mapproxy/test/system/test_coverage.py +140 -0
  319. mapproxy/test/system/test_decorate_img.py +214 -0
  320. mapproxy/test/system/test_demo.py +106 -0
  321. mapproxy/test/system/test_demo_with_extra_service.py +53 -0
  322. mapproxy/test/system/test_dimensions.py +278 -0
  323. mapproxy/test/system/test_disable_storage.py +42 -0
  324. mapproxy/test/system/test_formats.py +219 -0
  325. mapproxy/test/system/test_inspire_vs.py +173 -0
  326. mapproxy/test/system/test_kml.py +262 -0
  327. mapproxy/test/system/test_layergroups.py +160 -0
  328. mapproxy/test/system/test_legendgraphic.py +308 -0
  329. mapproxy/test/system/test_mapnik.py +161 -0
  330. mapproxy/test/system/test_mapserver.py +81 -0
  331. mapproxy/test/system/test_mixed_mode_format.py +195 -0
  332. mapproxy/test/system/test_multi_cache_layers.py +167 -0
  333. mapproxy/test/system/test_multiapp.py +92 -0
  334. mapproxy/test/system/test_refresh.py +207 -0
  335. mapproxy/test/system/test_renderd_client.py +304 -0
  336. mapproxy/test/system/test_response_headers.py +54 -0
  337. mapproxy/test/system/test_scalehints.py +140 -0
  338. mapproxy/test/system/test_seed.py +422 -0
  339. mapproxy/test/system/test_seed_only.py +93 -0
  340. mapproxy/test/system/test_sld.py +120 -0
  341. mapproxy/test/system/test_source_errors.py +377 -0
  342. mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
  343. mapproxy/test/system/test_tms.py +276 -0
  344. mapproxy/test/system/test_tms_origin.py +46 -0
  345. mapproxy/test/system/test_util_conf.py +304 -0
  346. mapproxy/test/system/test_util_export.py +210 -0
  347. mapproxy/test/system/test_util_grids.py +88 -0
  348. mapproxy/test/system/test_util_wms_capabilities.py +182 -0
  349. mapproxy/test/system/test_watermark.py +91 -0
  350. mapproxy/test/system/test_wms.py +1611 -0
  351. mapproxy/test/system/test_wms_srs_extent.py +165 -0
  352. mapproxy/test/system/test_wms_version.py +85 -0
  353. mapproxy/test/system/test_wmsc.py +116 -0
  354. mapproxy/test/system/test_wmts.py +334 -0
  355. mapproxy/test/system/test_wmts_dimensions.py +206 -0
  356. mapproxy/test/system/test_wmts_restful.py +198 -0
  357. mapproxy/test/system/test_xslt_featureinfo.py +425 -0
  358. mapproxy/test/test_http_helper.py +219 -0
  359. mapproxy/test/unit/__init__.py +0 -0
  360. mapproxy/test/unit/epsg +2 -0
  361. mapproxy/test/unit/polygons/polygons.dbf +0 -0
  362. mapproxy/test/unit/polygons/polygons.shp +0 -0
  363. mapproxy/test/unit/polygons/polygons.shx +0 -0
  364. mapproxy/test/unit/test_async.py +245 -0
  365. mapproxy/test/unit/test_auth.py +419 -0
  366. mapproxy/test/unit/test_cache.py +1193 -0
  367. mapproxy/test/unit/test_cache_azureblob.py +94 -0
  368. mapproxy/test/unit/test_cache_compact.py +319 -0
  369. mapproxy/test/unit/test_cache_couchdb.py +114 -0
  370. mapproxy/test/unit/test_cache_geopackage.py +221 -0
  371. mapproxy/test/unit/test_cache_redis.py +67 -0
  372. mapproxy/test/unit/test_cache_riak.py +76 -0
  373. mapproxy/test/unit/test_cache_s3.py +84 -0
  374. mapproxy/test/unit/test_cache_tile.py +427 -0
  375. mapproxy/test/unit/test_client.py +479 -0
  376. mapproxy/test/unit/test_client_arcgis.py +73 -0
  377. mapproxy/test/unit/test_client_cgi.py +136 -0
  378. mapproxy/test/unit/test_collections.py +116 -0
  379. mapproxy/test/unit/test_concat_legends.py +37 -0
  380. mapproxy/test/unit/test_conf_loader.py +1061 -0
  381. mapproxy/test/unit/test_conf_validator.py +416 -0
  382. mapproxy/test/unit/test_config.py +117 -0
  383. mapproxy/test/unit/test_decorate_img.py +185 -0
  384. mapproxy/test/unit/test_exceptions.py +258 -0
  385. mapproxy/test/unit/test_featureinfo.py +291 -0
  386. mapproxy/test/unit/test_file_lock_load.py +49 -0
  387. mapproxy/test/unit/test_geom.py +503 -0
  388. mapproxy/test/unit/test_grid.py +1258 -0
  389. mapproxy/test/unit/test_image.py +1053 -0
  390. mapproxy/test/unit/test_image_mask.py +181 -0
  391. mapproxy/test/unit/test_image_messages.py +197 -0
  392. mapproxy/test/unit/test_image_options.py +160 -0
  393. mapproxy/test/unit/test_isodate.py +122 -0
  394. mapproxy/test/unit/test_multiapp.py +163 -0
  395. mapproxy/test/unit/test_ogr_reader.py +50 -0
  396. mapproxy/test/unit/test_request.py +745 -0
  397. mapproxy/test/unit/test_request_wmts.py +178 -0
  398. mapproxy/test/unit/test_response.py +79 -0
  399. mapproxy/test/unit/test_seed.py +365 -0
  400. mapproxy/test/unit/test_seed_cachelock.py +90 -0
  401. mapproxy/test/unit/test_srs.py +215 -0
  402. mapproxy/test/unit/test_tiled_source.py +122 -0
  403. mapproxy/test/unit/test_tilefilter.py +31 -0
  404. mapproxy/test/unit/test_times.py +25 -0
  405. mapproxy/test/unit/test_timeutils.py +50 -0
  406. mapproxy/test/unit/test_util_conf_utils.py +75 -0
  407. mapproxy/test/unit/test_utils.py +476 -0
  408. mapproxy/test/unit/test_wms_capabilities.py +44 -0
  409. mapproxy/test/unit/test_wms_layer.py +113 -0
  410. mapproxy/test/unit/test_yaml.py +69 -0
  411. mapproxy/tilefilter.py +59 -0
  412. mapproxy/util/__init__.py +0 -0
  413. mapproxy/util/async_.py +227 -0
  414. mapproxy/util/collections.py +132 -0
  415. mapproxy/util/coverage.py +329 -0
  416. mapproxy/util/escape.py +10 -0
  417. mapproxy/util/ext/__init__.py +14 -0
  418. mapproxy/util/ext/dictspec/__init__.py +1 -0
  419. mapproxy/util/ext/dictspec/spec.py +124 -0
  420. mapproxy/util/ext/dictspec/test/__init__.py +0 -0
  421. mapproxy/util/ext/dictspec/test/test_validator.py +274 -0
  422. mapproxy/util/ext/dictspec/validator.py +189 -0
  423. mapproxy/util/ext/local.py +196 -0
  424. mapproxy/util/ext/lockfile.py +138 -0
  425. mapproxy/util/ext/odict.py +330 -0
  426. mapproxy/util/ext/serving.py +508 -0
  427. mapproxy/util/ext/tempita/__init__.py +1174 -0
  428. mapproxy/util/ext/tempita/_looper.py +163 -0
  429. mapproxy/util/ext/tempita/compat3.py +46 -0
  430. mapproxy/util/ext/wmsparse/__init__.py +3 -0
  431. mapproxy/util/ext/wmsparse/duration.py +597 -0
  432. mapproxy/util/ext/wmsparse/parse.py +305 -0
  433. mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
  434. mapproxy/util/ext/wmsparse/test/test_parse.py +162 -0
  435. mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
  436. mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
  437. mapproxy/util/ext/wmsparse/test/wms-omniscale-111.xml +90 -0
  438. mapproxy/util/ext/wmsparse/test/wms-omniscale-130.xml +120 -0
  439. mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
  440. mapproxy/util/ext/wmsparse/util.py +187 -0
  441. mapproxy/util/fs.py +156 -0
  442. mapproxy/util/geom.py +295 -0
  443. mapproxy/util/lib.py +115 -0
  444. mapproxy/util/lock.py +163 -0
  445. mapproxy/util/ogr.py +231 -0
  446. mapproxy/util/py.py +81 -0
  447. mapproxy/util/times.py +75 -0
  448. mapproxy/util/yaml.py +56 -0
  449. mapproxy/version.py +31 -0
  450. mapproxy/wsgiapp.py +164 -0
  451. mapproxy-1.16.1.dist-info/METADATA +151 -0
  452. mapproxy-1.16.1.dist-info/RECORD +458 -0
  453. mapproxy-1.16.1.dist-info/WHEEL +5 -0
  454. mapproxy-1.16.1.dist-info/entry_points.txt +3 -0
  455. mapproxy-1.16.1.dist-info/licenses/AUTHORS.txt +33 -0
  456. mapproxy-1.16.1.dist-info/licenses/COPYING.txt +60 -0
  457. mapproxy-1.16.1.dist-info/licenses/LICENSE.txt +202 -0
  458. mapproxy-1.16.1.dist-info/top_level.txt +1 -0
@@ -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
+
18
+ from io import BytesIO
19
+
20
+ import pytest
21
+
22
+ from mapproxy.request.wms import WMS111MapRequest
23
+ from mapproxy.compat.image import Image
24
+ from mapproxy.test.image import is_png, tmp_image
25
+ from mapproxy.test.http import mock_httpd
26
+ from mapproxy.test.system import SysTest
27
+
28
+
29
+ @pytest.fixture(scope="module")
30
+ def config_file():
31
+ return "coverage.yaml"
32
+
33
+
34
+ class TestCoverageWMS(SysTest):
35
+
36
+ def setup(self):
37
+ self.common_map_req = WMS111MapRequest(
38
+ url="/service?",
39
+ param=dict(
40
+ service="WMS",
41
+ version="1.1.1",
42
+ bbox="-180,0,0,80",
43
+ width="200",
44
+ height="200",
45
+ layers="wms_cache",
46
+ srs="EPSG:4326",
47
+ format="image/png",
48
+ styles="",
49
+ request="GetMap",
50
+ ),
51
+ )
52
+
53
+ def test_capababilities(self, app):
54
+ resp = app.get("/service?request=GetCapabilities&service=WMS&version=1.1.1")
55
+ xml = resp.lxml
56
+ # First: combined root, second: wms_cache, third: tms_cache, last: seed_only
57
+ assert xml.xpath("//LatLonBoundingBox/@minx") == ["10", "10", "12", "14"]
58
+ assert xml.xpath("//LatLonBoundingBox/@miny") == ["10", "15", "10", "13"]
59
+ assert xml.xpath("//LatLonBoundingBox/@maxx") == ["35", "30", "35", "24"]
60
+ assert xml.xpath("//LatLonBoundingBox/@maxy") == ["31", "31", "30", "23"]
61
+
62
+ def test_get_map_outside(self, app):
63
+ self.common_map_req.params.bbox = -90, 0, 0, 90
64
+ self.common_map_req.params["bgcolor"] = "0xff0005"
65
+ resp = app.get(self.common_map_req)
66
+ assert resp.content_type == "image/png"
67
+ data = BytesIO(resp.body)
68
+ assert is_png(data)
69
+ img = Image.open(data)
70
+ assert img.mode == "RGB"
71
+ assert img.getcolors() == [(200 * 200, (255, 0, 5))]
72
+
73
+ def test_get_map_outside_transparent(self, app):
74
+ self.common_map_req.params.bbox = -90, 0, 0, 90
75
+ self.common_map_req.params.transparent = True
76
+ resp = app.get(self.common_map_req)
77
+ assert resp.content_type == "image/png"
78
+ data = BytesIO(resp.body)
79
+ assert is_png(data)
80
+ img = Image.open(data)
81
+ assert img.mode == "RGBA"
82
+ assert img.getcolors()[0][0] == 200 * 200
83
+ assert img.getcolors()[0][1][3] == 0 # transparent
84
+
85
+ def test_get_map_intersection(self, app, cache_dir):
86
+ with tmp_image((256, 256), format="jpeg") as img:
87
+ expected_req = (
88
+ {
89
+ "path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
90
+ "&REQUEST=GetMap&HEIGHT=91&SRS=EPSG%3A4326&styles="
91
+ "&VERSION=1.1.1&BBOX=10,15,30,31"
92
+ "&WIDTH=114"
93
+ },
94
+ {"body": img.read(), "headers": {"content-type": "image/jpeg"}},
95
+ )
96
+ with mock_httpd(("localhost", 42423), [expected_req]):
97
+ self.common_map_req.params.bbox = 0, 0, 40, 40
98
+ self.common_map_req.params.transparent = True
99
+ resp = app.get(self.common_map_req)
100
+ assert resp.content_type == "image/png"
101
+ data = BytesIO(resp.body)
102
+ assert is_png(data)
103
+ assert Image.open(data).mode == "RGBA"
104
+ assert cache_dir.join(
105
+ "wms_cache_EPSG4326/03/000/000/004/000/000/002.jpeg"
106
+ ).check()
107
+
108
+
109
+ class TestCoverageTMS(SysTest):
110
+
111
+ def test_get_tile_intersections(self, app, cache_dir):
112
+ with tmp_image((256, 256), format="jpeg") as img:
113
+ expected_req = (
114
+ {
115
+ "path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
116
+ "&REQUEST=GetMap&HEIGHT=25&SRS=EPSG%3A900913&styles="
117
+ "&VERSION=1.1.1&BBOX=1113194.90793,1689200.13961,3339584.7238,3632749.14338"
118
+ "&WIDTH=28"
119
+ },
120
+ {"body": img.read(), "headers": {"content-type": "image/jpeg"}},
121
+ )
122
+ with mock_httpd(
123
+ ("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
124
+ ):
125
+ resp = app.get("/tms/1.0.0/wms_cache/0/1/1.jpeg")
126
+ assert resp.content_type == "image/jpeg"
127
+ cache_dir.join("wms_cache_EPSG900913/01/000/000/001/000/000/001.jpeg").check()
128
+
129
+ def test_get_tile_intersection_tms(self, app, cache_dir):
130
+ with tmp_image((256, 256), format="jpeg") as img:
131
+ expected_req = (
132
+ {"path": r"/tms/1.0.0/foo/1/1/1.jpeg"},
133
+ {"body": img.read(), "headers": {"content-type": "image/jpeg"}},
134
+ )
135
+ with mock_httpd(
136
+ ("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
137
+ ):
138
+ resp = app.get("/tms/1.0.0/tms_cache/0/1/1.jpeg")
139
+ assert resp.content_type == "image/jpeg"
140
+ cache_dir.join("tms_cache_EPSG900913/01/000/000/001/000/000/001.jpeg").check()
@@ -0,0 +1,214 @@
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 io import BytesIO
17
+
18
+ import pytest
19
+
20
+ from mapproxy.compat.image import Image
21
+ from mapproxy.image import ImageSource
22
+ from mapproxy.request.wms import WMS111MapRequest
23
+ from mapproxy.request.wmts import WMTS100TileRequest
24
+ from mapproxy.test.image import is_png, is_jpeg
25
+ from mapproxy.test.system import SysTest
26
+
27
+
28
+ @pytest.fixture(scope="module")
29
+ def config_file():
30
+ return "layer.yaml"
31
+
32
+
33
+ def to_greyscale(image, service, layers, **kw):
34
+ img = image.as_image()
35
+ if hasattr(image.image_opts, "transparent") and image.image_opts.transparent:
36
+ img = img.convert("LA").convert("RGBA")
37
+ else:
38
+ img = img.convert("L").convert("RGB")
39
+ return ImageSource(img, image.image_opts)
40
+
41
+
42
+ @pytest.mark.usefixtures("fixture_cache_data")
43
+ class TestDecorateImg(SysTest):
44
+
45
+ def setup(self):
46
+ self.common_tile_req = WMTS100TileRequest(
47
+ url="/service?",
48
+ param=dict(
49
+ service="WMTS",
50
+ version="1.0.0",
51
+ tilerow="0",
52
+ tilecol="0",
53
+ tilematrix="01",
54
+ tilematrixset="GLOBAL_MERCATOR",
55
+ layer="wms_cache",
56
+ format="image/jpeg",
57
+ style="",
58
+ request="GetTile",
59
+ ),
60
+ )
61
+
62
+ def test_wms(self, app):
63
+ req = WMS111MapRequest(
64
+ url="/service?",
65
+ param=dict(
66
+ service="WMS",
67
+ version="1.1.1",
68
+ bbox="-180,0,0,80",
69
+ width="200",
70
+ height="200",
71
+ layers="wms_cache",
72
+ srs="EPSG:4326",
73
+ format="image/png",
74
+ styles="",
75
+ request="GetMap",
76
+ ),
77
+ )
78
+ resp = app.get(req, extra_environ={"mapproxy.decorate_img": to_greyscale})
79
+ data = BytesIO(resp.body)
80
+ assert is_png(data)
81
+ img = Image.open(data)
82
+ assert img.mode == "RGB"
83
+
84
+ def test_wms_transparent(self, app):
85
+ req = WMS111MapRequest(
86
+ url="/service?",
87
+ param=dict(
88
+ service="WMS",
89
+ version="1.1.1",
90
+ bbox="-180,0,0,80",
91
+ width="200",
92
+ height="200",
93
+ layers="wms_cache_transparent",
94
+ srs="EPSG:4326",
95
+ format="image/png",
96
+ styles="",
97
+ request="GetMap",
98
+ transparent="True",
99
+ ),
100
+ )
101
+ resp = app.get(req, extra_environ={"mapproxy.decorate_img": to_greyscale})
102
+ data = BytesIO(resp.body)
103
+ assert is_png(data)
104
+ img = Image.open(data)
105
+ assert img.mode == "RGBA"
106
+
107
+ def test_wms_bgcolor(self, app):
108
+ req = WMS111MapRequest(
109
+ url="/service?",
110
+ param=dict(
111
+ service="WMS",
112
+ version="1.1.1",
113
+ bbox="-180,0,0,80",
114
+ width="200",
115
+ height="200",
116
+ layers="wms_cache_transparent",
117
+ srs="EPSG:4326",
118
+ format="image/png",
119
+ styles="",
120
+ request="GetMap",
121
+ bgcolor="0xff00a0",
122
+ ),
123
+ )
124
+ resp = app.get(req, extra_environ={"mapproxy.decorate_img": to_greyscale})
125
+ data = BytesIO(resp.body)
126
+ assert is_png(data)
127
+ img = Image.open(data)
128
+ assert img.mode == "RGB"
129
+ assert sorted(img.getcolors())[-1][1] == (94, 94, 94)
130
+
131
+ def test_wms_args(self, app):
132
+ req = WMS111MapRequest(
133
+ url="/service?",
134
+ param=dict(
135
+ service="WMS",
136
+ version="1.1.1",
137
+ bbox="-180,0,0,80",
138
+ width="200",
139
+ height="200",
140
+ layers="wms_cache,wms_cache_transparent",
141
+ srs="EPSG:4326",
142
+ format="image/png",
143
+ styles="",
144
+ request="GetMap",
145
+ transparent="True",
146
+ ),
147
+ )
148
+
149
+ def callback(img_src, service, layers, environ, query_extent):
150
+ assert isinstance(img_src, ImageSource)
151
+ assert "wms.map" == service
152
+ assert len(layers) == 2
153
+ assert "wms_cache_transparent" in layers
154
+ assert "wms_cache" in layers
155
+ assert isinstance(environ, dict)
156
+ assert len(query_extent) == 2
157
+ assert len(query_extent[1]) == 4
158
+ assert query_extent[0] == "EPSG:4326"
159
+ return img_src
160
+
161
+ app.get(req, extra_environ={"mapproxy.decorate_img": callback})
162
+
163
+ def test_tms(self, app):
164
+ resp = app.get(
165
+ "/tms/1.0.0/wms_cache/0/0/1.jpeg",
166
+ extra_environ={"mapproxy.decorate_img": to_greyscale},
167
+ )
168
+ assert resp.content_type == "image/jpeg"
169
+ assert resp.content_length == len(resp.body)
170
+ data = BytesIO(resp.body)
171
+ assert is_jpeg(data)
172
+
173
+ def test_tms_args(self, app):
174
+
175
+ def callback(img_src, service, layers, environ, query_extent):
176
+ assert isinstance(img_src, ImageSource)
177
+ assert "tms" == service
178
+ assert "wms_cache" == layers[0]
179
+ assert isinstance(environ, dict)
180
+ assert len(query_extent) == 2
181
+ assert len(query_extent[1]) == 4
182
+ assert query_extent[0] == "EPSG:900913"
183
+ return img_src
184
+
185
+ app.get(
186
+ "/tms/1.0.0/wms_cache/0/0/1.jpeg",
187
+ extra_environ={"mapproxy.decorate_img": callback},
188
+ )
189
+
190
+ def test_wmts(self, app):
191
+ resp = app.get(
192
+ str(self.common_tile_req),
193
+ extra_environ={"mapproxy.decorate_img": to_greyscale},
194
+ )
195
+ assert resp.content_type == "image/jpeg"
196
+ assert resp.content_length == len(resp.body)
197
+ data = BytesIO(resp.body)
198
+ assert is_jpeg(data)
199
+
200
+ def test_wmts_args(self, app):
201
+
202
+ def callback(img_src, service, layers, environ, query_extent):
203
+ assert isinstance(img_src, ImageSource)
204
+ assert "wmts" == service
205
+ assert "wms_cache" == layers[0]
206
+ assert isinstance(environ, dict)
207
+ assert len(query_extent) == 2
208
+ assert len(query_extent[1]) == 4
209
+ assert query_extent[0] == "EPSG:900913"
210
+ return img_src
211
+
212
+ app.get(
213
+ str(self.common_tile_req), extra_environ={"mapproxy.decorate_img": callback}
214
+ )
@@ -0,0 +1,106 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2022 Even Rouault
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 pytest
17
+
18
+ from mapproxy.test.http import mock_httpd
19
+ from mapproxy.test.system import SysTest
20
+ from webtest import AppError
21
+
22
+
23
+ @pytest.fixture(scope="module")
24
+ def config_file():
25
+ return "demo.yaml"
26
+
27
+
28
+ class TestDemo(SysTest):
29
+
30
+ def test_basic(self, app):
31
+ resp = app.get("/demo/", status=200)
32
+ assert resp.content_type == "text/html"
33
+ assert 'href="../service?REQUEST=GetCapabilities"' in resp
34
+ assert 'href="../service?REQUEST=GetCapabilities&tiled=true"' in resp
35
+ assert 'href="../demo/?wmts_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
36
+ assert 'href="../demo/?tms_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
37
+
38
+ def test_previewmap(self, app):
39
+ resp = app.get("/demo/?srs=EPSG%3A3857&format=image%2Fpng&wms_layer=wms_cache", status=200)
40
+ assert resp.content_type == "text/html"
41
+ assert '<h2>Layer Preview - wms_cache</h2>' in resp
42
+
43
+ def test_external(self, app):
44
+ expected_req = (
45
+ {
46
+ "path": r"/path/service?REQUEST=GetCapabilities&SERVICE=WMS"
47
+ },
48
+ {"body": b"test-string", "headers": {"content-type": "text/xml"}}
49
+ )
50
+ with mock_httpd(
51
+ ("localhost", 42423), [expected_req]
52
+ ):
53
+ resp = app.get('/demo/?wms_capabilities&type=external', extra_environ={
54
+ 'HTTP_X_FORWARDED_HOST': 'localhost:42423/path'
55
+ })
56
+ content = resp.text
57
+ assert 'test-string' in content
58
+ assert 'http://localhost:42423/path/service?REQUEST=GetCapabilities&SERVICE=WMS' in content
59
+
60
+ def test_external_xss_injection(self, app):
61
+ expected_req = (
62
+ {
63
+ "path": r"/path/&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;/service?REQUEST=GetCapabilities&SERVICE=WMS"
64
+ },
65
+ {"body": b"test-string", "headers": {"content-type": "text/xml"}}
66
+ )
67
+
68
+ with mock_httpd(
69
+ ("localhost", 42423), [expected_req]
70
+ ):
71
+ resp = app.get('/demo/?wms_capabilities&type=external', extra_environ={
72
+ 'HTTP_X_FORWARDED_HOST': 'localhost:42423/path/"><script>alert(\'XSS\')</script>'
73
+ })
74
+ content = resp.text
75
+ assert 'test-string' in content
76
+ assert '"><script>alert(\'XSS\')' not in content
77
+ assert '&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;' in content
78
+
79
+ def test_external_file_protocol(self, app):
80
+ try:
81
+ app.get('/demo/?wms_capabilities&type=external', extra_environ={
82
+ 'HTTP_X_FORWARDED_PROTO': 'file'
83
+ })
84
+ except AppError as e:
85
+ assert '400 Bad Request' in e.args[0]
86
+
87
+ def test_tms_layer_xss(self, app):
88
+ expected_req = (
89
+ {
90
+ "path": r"/tms/1.0.0/osm&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;/1.0.0"
91
+ },
92
+ {"body": b"test-string", "headers": {"content-type": "text/xml"}}
93
+ )
94
+
95
+ with mock_httpd(
96
+ ("localhost", 42423), [expected_req]
97
+ ):
98
+ resp = app.get(
99
+ '/demo/?tms_capabilities&layer=osm"><script>alert(\'XSS\')</script>&type=external&srs=1.0.0',
100
+ extra_environ={
101
+ 'HTTP_X_FORWARDED_HOST': 'localhost:42423'
102
+ }
103
+ )
104
+ content = resp.text
105
+ assert '"><script>alert(\'XSS\')' not in content
106
+ assert '&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;' in content
@@ -0,0 +1,53 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2022 Even Rouault
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 pytest
17
+
18
+ from mapproxy.service.demo import extra_demo_server_handlers, extra_substitution_handlers, register_extra_demo_server_handler, register_extra_demo_substitution_handler
19
+ from mapproxy.test.system import SysTest
20
+
21
+ def demo_server_handler(demo_server, req):
22
+ if 'my_service' in req.args:
23
+ return 'my_return'
24
+ return None
25
+
26
+
27
+ def demo_substitution_handler(demo_server, req, substitutions):
28
+ substitutions['extra_services_html_beginning'] += '<h2>My extra service</h2>'
29
+
30
+ @pytest.fixture(scope="module")
31
+ def config_file():
32
+ register_extra_demo_server_handler(demo_server_handler)
33
+ register_extra_demo_substitution_handler(demo_substitution_handler)
34
+ yield "demo.yaml"
35
+ extra_demo_server_handlers.clear()
36
+ extra_substitution_handlers.clear()
37
+
38
+
39
+ class TestDemoWithExtraService(SysTest):
40
+
41
+ def test_basic(self, app):
42
+ resp = app.get("/demo/", status=200)
43
+ assert resp.content_type == "text/html"
44
+ assert 'href="../service?REQUEST=GetCapabilities"' in resp
45
+ assert 'href="../service?REQUEST=GetCapabilities&tiled=true"' in resp
46
+ assert 'href="../demo/?wmts_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
47
+ assert 'href="../demo/?tms_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
48
+ assert '<h2>My extra service</h2>' in resp
49
+
50
+ def test_my_service(self, app):
51
+ resp = app.get("/demo/?my_service=bar", status=200)
52
+ assert resp.content_type == "text/html"
53
+ assert 'my_return' in resp