MapProxy 4.0.1__tar.gz → 4.0.2__tar.gz

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 (522) hide show
  1. {mapproxy-4.0.1 → mapproxy-4.0.2}/CHANGES.txt +9 -0
  2. {mapproxy-4.0.1 → mapproxy-4.0.2}/MapProxy.egg-info/PKG-INFO +10 -10
  3. {mapproxy-4.0.1 → mapproxy-4.0.2}/MapProxy.egg-info/SOURCES.txt +1 -0
  4. {mapproxy-4.0.1 → mapproxy-4.0.2}/PKG-INFO +10 -10
  5. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/deployment.rst +2 -0
  6. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config/loader.py +4 -1
  7. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/multiapp.py +2 -1
  8. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/demo.py +62 -54
  9. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/kml.py +2 -1
  10. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/capabilities_demo.html +1 -3
  11. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/util_grids.yaml +2 -1
  12. mapproxy-4.0.2/mapproxy/test/system/test_demo.py +123 -0
  13. mapproxy-4.0.2/mapproxy/util/escape.py +10 -0
  14. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/wsgiapp.py +2 -1
  15. {mapproxy-4.0.1 → mapproxy-4.0.2}/setup.py +1 -1
  16. mapproxy-4.0.1/mapproxy/test/system/test_demo.py +0 -56
  17. {mapproxy-4.0.1 → mapproxy-4.0.2}/AUTHORS.txt +0 -0
  18. {mapproxy-4.0.1 → mapproxy-4.0.2}/COPYING.txt +0 -0
  19. {mapproxy-4.0.1 → mapproxy-4.0.2}/LICENSE.txt +0 -0
  20. {mapproxy-4.0.1 → mapproxy-4.0.2}/MANIFEST.in +0 -0
  21. {mapproxy-4.0.1 → mapproxy-4.0.2}/MapProxy.egg-info/dependency_links.txt +0 -0
  22. {mapproxy-4.0.1 → mapproxy-4.0.2}/MapProxy.egg-info/entry_points.txt +0 -0
  23. {mapproxy-4.0.1 → mapproxy-4.0.2}/MapProxy.egg-info/not-zip-safe +0 -0
  24. {mapproxy-4.0.1 → mapproxy-4.0.2}/MapProxy.egg-info/requires.txt +0 -0
  25. {mapproxy-4.0.1 → mapproxy-4.0.2}/MapProxy.egg-info/top_level.txt +0 -0
  26. {mapproxy-4.0.1 → mapproxy-4.0.2}/README.md +0 -0
  27. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/GM.txt +0 -0
  28. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/_static/logo.png +0 -0
  29. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/_static/logo_title.png +0 -0
  30. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/_static/mapproxy.css +0 -0
  31. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/_templates/versions.html +0 -0
  32. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/auth.rst +0 -0
  33. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/caches.rst +0 -0
  34. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/caching_layer_dimensions.rst +0 -0
  35. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/conf.py +0 -0
  36. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/configuration.rst +0 -0
  37. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/configuration_examples.rst +0 -0
  38. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/coverages.rst +0 -0
  39. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/decorate_img.rst +0 -0
  40. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/development.rst +0 -0
  41. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/bicubic.png +0 -0
  42. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/bilinear.png +0 -0
  43. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/labeling-dynamic.png +0 -0
  44. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/labeling-meta-buffer.png +0 -0
  45. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/labeling-metatiling-buffer.png +0 -0
  46. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/labeling-metatiling.png +0 -0
  47. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/labeling-no-clip.png +0 -0
  48. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/labeling-no-placement.png +0 -0
  49. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/labeling-partial-false.png +0 -0
  50. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/labeling-repeated.png +0 -0
  51. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/mapnik-webmerc-hq.png +0 -0
  52. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/mapnik-webmerc.png +0 -0
  53. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/mapproxy-demo.png +0 -0
  54. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/imgs/nearest.png +0 -0
  55. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/index.rst +0 -0
  56. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/inspire.rst +0 -0
  57. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/install.rst +0 -0
  58. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/install_docker.rst +0 -0
  59. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/install_osgeo4w.rst +0 -0
  60. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/install_windows.rst +0 -0
  61. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/labeling.rst +0 -0
  62. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/mapproxy_util.rst +0 -0
  63. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/mapproxy_util_autoconfig.rst +0 -0
  64. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/ogc_api.rst +0 -0
  65. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/plugins.rst +0 -0
  66. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/seed.rst +0 -0
  67. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/services.rst +0 -0
  68. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/sources.rst +0 -0
  69. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/tutorial.rst +0 -0
  70. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/tutorial.yaml +0 -0
  71. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/yaml/cache_conf.yaml +0 -0
  72. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/yaml/grid_conf.yaml +0 -0
  73. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/yaml/merged_conf.yaml +0 -0
  74. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/yaml/meta_conf.yaml +0 -0
  75. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/yaml/seed.yaml +0 -0
  76. {mapproxy-4.0.1 → mapproxy-4.0.2}/doc/yaml/simple_conf.yaml +0 -0
  77. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/__init__.py +0 -0
  78. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/__init__.py +0 -0
  79. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/azureblob.py +0 -0
  80. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/base.py +0 -0
  81. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/compact.py +0 -0
  82. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/couchdb.py +0 -0
  83. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/dummy.py +0 -0
  84. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/file.py +0 -0
  85. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/geopackage.py +0 -0
  86. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/legend.py +0 -0
  87. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/mbtiles.py +0 -0
  88. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/meta.py +0 -0
  89. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/path.py +0 -0
  90. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/redis.py +0 -0
  91. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/renderd.py +0 -0
  92. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/s3.py +0 -0
  93. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/cache/tile.py +0 -0
  94. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/client/__init__.py +0 -0
  95. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/client/arcgis.py +0 -0
  96. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/client/cgi.py +0 -0
  97. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/client/http.py +0 -0
  98. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/client/log.py +0 -0
  99. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/client/tile.py +0 -0
  100. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/client/wms.py +0 -0
  101. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/compat/__init__.py +0 -0
  102. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/compat/image.py +0 -0
  103. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config/__init__.py +0 -0
  104. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config/config-schema.json +0 -0
  105. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config/config.py +0 -0
  106. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config/coverage.py +0 -0
  107. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config/defaults.py +0 -0
  108. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config/spec.py +0 -0
  109. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config/validator.py +0 -0
  110. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config_template/__init__.py +0 -0
  111. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config_template/base_config/config.wsgi +0 -0
  112. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config_template/base_config/full_example.yaml +0 -0
  113. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config_template/base_config/full_seed_example.yaml +0 -0
  114. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config_template/base_config/log.ini +0 -0
  115. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config_template/base_config/mapproxy.yaml +0 -0
  116. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/config_template/base_config/seed.yaml +0 -0
  117. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/exception.py +0 -0
  118. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/featureinfo.py +0 -0
  119. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/grid.py +0 -0
  120. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/__init__.py +0 -0
  121. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/fonts/DejaVuSans.ttf +0 -0
  122. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
  123. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/fonts/LICENSE +0 -0
  124. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/fonts/__init__.py +0 -0
  125. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/mask.py +0 -0
  126. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/merge.py +0 -0
  127. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/message.py +0 -0
  128. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/opts.py +0 -0
  129. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/tile.py +0 -0
  130. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/image/transform.py +0 -0
  131. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/layer.py +0 -0
  132. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/proj.py +0 -0
  133. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/request/__init__.py +0 -0
  134. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/request/arcgis.py +0 -0
  135. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/request/base.py +0 -0
  136. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/request/tile.py +0 -0
  137. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/request/wms/__init__.py +0 -0
  138. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/request/wms/exception.py +0 -0
  139. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/request/wmts.py +0 -0
  140. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/response.py +0 -0
  141. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/__init__.py +0 -0
  142. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/conf/__init__.py +0 -0
  143. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/conf/app.py +0 -0
  144. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/conf/caches.py +0 -0
  145. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/conf/geopackage.py +0 -0
  146. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/conf/layers.py +0 -0
  147. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/conf/seeds.py +0 -0
  148. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/conf/sources.py +0 -0
  149. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/conf/utils.py +0 -0
  150. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/defrag.py +0 -0
  151. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/export.py +0 -0
  152. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/grids.py +0 -0
  153. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/scales.py +0 -0
  154. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/util.py +0 -0
  155. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/script/wms_capabilities.py +0 -0
  156. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/seed/__init__.py +0 -0
  157. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/seed/cachelock.py +0 -0
  158. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/seed/cleanup.py +0 -0
  159. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/seed/config.py +0 -0
  160. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/seed/script.py +0 -0
  161. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/seed/seeder.py +0 -0
  162. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/seed/spec.py +0 -0
  163. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/seed/util.py +0 -0
  164. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/__init__.py +0 -0
  165. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/base.py +0 -0
  166. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/ows.py +0 -0
  167. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/template_helper.py +0 -0
  168. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/demo.html +0 -0
  169. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/openlayers-demo.cfg +0 -0
  170. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/img/blank.gif +0 -0
  171. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
  172. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
  173. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
  174. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
  175. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
  176. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
  177. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
  178. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/logo.png +0 -0
  179. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/ol.css +0 -0
  180. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/ol.js +0 -0
  181. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/proj4.min.js +0 -0
  182. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/proj4defs.js +0 -0
  183. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/site.css +0 -0
  184. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
  185. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/theme/default/google.css +0 -0
  186. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/theme/default/ie6-style.css +0 -0
  187. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static/theme/default/style.css +0 -0
  188. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/static.html +0 -0
  189. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/tms_demo.html +0 -0
  190. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/wms_demo.html +0 -0
  191. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/demo/wmts_demo.html +0 -0
  192. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/ows_exception.xml +0 -0
  193. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/tms_capabilities.xml +0 -0
  194. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/tms_exception.xml +0 -0
  195. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/tms_root_resource.xml +0 -0
  196. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/tms_tilemap_capabilities.xml +0 -0
  197. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/wms100capabilities.xml +0 -0
  198. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/wms100exception.xml +0 -0
  199. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/wms110capabilities.xml +0 -0
  200. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/wms110exception.xml +0 -0
  201. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/wms111capabilities.xml +0 -0
  202. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/wms111exception.xml +0 -0
  203. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/wms130capabilities.xml +0 -0
  204. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/wms130exception.xml +0 -0
  205. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/wmts100capabilities.xml +0 -0
  206. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/templates/wmts100exception.xml +0 -0
  207. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/tile.py +0 -0
  208. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/wms.py +0 -0
  209. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/service/wmts.py +0 -0
  210. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/source/__init__.py +0 -0
  211. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/source/arcgis.py +0 -0
  212. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/source/error.py +0 -0
  213. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/source/mapnik.py +0 -0
  214. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/source/tile.py +0 -0
  215. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/source/wms.py +0 -0
  216. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/srs.py +0 -0
  217. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/template.py +0 -0
  218. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/__init__.py +0 -0
  219. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/conftest.py +0 -0
  220. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/helper.py +0 -0
  221. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/http.py +0 -0
  222. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/image.py +0 -0
  223. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/mocker.py +0 -0
  224. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/common.xsd +0 -0
  225. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +0 -0
  226. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +0 -0
  227. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +0 -0
  228. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +0 -0
  229. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +0 -0
  230. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +0 -0
  231. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +0 -0
  232. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +0 -0
  233. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +0 -0
  234. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +0 -0
  235. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +0 -0
  236. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +0 -0
  237. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +0 -0
  238. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +0 -0
  239. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +0 -0
  240. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +0 -0
  241. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +0 -0
  242. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +0 -0
  243. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +0 -0
  244. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +0 -0
  245. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +0 -0
  246. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +0 -0
  247. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +0 -0
  248. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/common/1.0/network.xsd +0 -0
  249. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +0 -0
  250. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +0 -0
  251. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +0 -0
  252. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +0 -0
  253. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/kml/2.2.0/xAL.xsd +0 -0
  254. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +0 -0
  255. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +0 -0
  256. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +0 -0
  257. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +0 -0
  258. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +0 -0
  259. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +0 -0
  260. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +0 -0
  261. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +0 -0
  262. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +0 -0
  263. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +0 -0
  264. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +0 -0
  265. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +0 -0
  266. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +0 -0
  267. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +0 -0
  268. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +0 -0
  269. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +0 -0
  270. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +0 -0
  271. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +0 -0
  272. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +0 -0
  273. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +0 -0
  274. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +0 -0
  275. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +0 -0
  276. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +0 -0
  277. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +0 -0
  278. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +0 -0
  279. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +0 -0
  280. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +0 -0
  281. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +0 -0
  282. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +0 -0
  283. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +0 -0
  284. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +0 -0
  285. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +0 -0
  286. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +0 -0
  287. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +0 -0
  288. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +0 -0
  289. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +0 -0
  290. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +0 -0
  291. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +0 -0
  292. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +0 -0
  293. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +0 -0
  294. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +0 -0
  295. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +0 -0
  296. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +0 -0
  297. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +0 -0
  298. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +0 -0
  299. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmts/1.0/ReadMe.txt +0 -0
  300. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmts/1.0/wmts.xsd +0 -0
  301. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +0 -0
  302. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +0 -0
  303. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +0 -0
  304. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +0 -0
  305. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +0 -0
  306. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +0 -0
  307. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +0 -0
  308. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +0 -0
  309. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +0 -0
  310. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +0 -0
  311. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/schemas/xml.xsd +0 -0
  312. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/__init__.py +0 -0
  313. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/arcgis.yaml +0 -0
  314. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/auth.yaml +0 -0
  315. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache.mbtiles +0 -0
  316. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_azureblob.yaml +0 -0
  317. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_band_merge.yaml +0 -0
  318. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +0 -0
  319. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_coverage.yaml +0 -0
  320. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
  321. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
  322. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
  323. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_geopackage.yaml +0 -0
  324. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_grid_names.yaml +0 -0
  325. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_mbtiles.yaml +0 -0
  326. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_s3.yaml +0 -0
  327. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/cache_source.yaml +0 -0
  328. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/combined_sources.yaml +0 -0
  329. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/coverage.yaml +0 -0
  330. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/demo.yaml +0 -0
  331. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/dimension.yaml +0 -0
  332. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/disable_storage.yaml +0 -0
  333. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/empty_ogrdata.geojson +0 -0
  334. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/formats.yaml +0 -0
  335. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/inspire.yaml +0 -0
  336. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/inspire_full.yaml +0 -0
  337. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/kml_layer.yaml +0 -0
  338. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/layer.yaml +0 -0
  339. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/layergroups.yaml +0 -0
  340. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/layergroups_root.yaml +0 -0
  341. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/legendgraphic.yaml +0 -0
  342. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/mapnik_source.yaml +0 -0
  343. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/mapproxy_export.yaml +0 -0
  344. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/mapserver.yaml +0 -0
  345. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/minimal_cgi.py +0 -0
  346. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/mixed_mode.yaml +0 -0
  347. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/multi_cache_layers.yaml +0 -0
  348. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/multiapp1.yaml +0 -0
  349. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/multiapp2.yaml +0 -0
  350. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/renderd_client.yaml +0 -0
  351. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/scalehints.yaml +0 -0
  352. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/seed.yaml +0 -0
  353. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/seed_mapproxy.yaml +0 -0
  354. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/seed_timeouts.yaml +0 -0
  355. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +0 -0
  356. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/seedonly.yaml +0 -0
  357. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/sld.yaml +0 -0
  358. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/source_errors.yaml +0 -0
  359. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/source_errors_raise.yaml +0 -0
  360. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/tileservice_origin.yaml +0 -0
  361. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/tileservice_refresh.yaml +0 -0
  362. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/tilesource_minmax_res.yaml +0 -0
  363. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/util-conf-base-grids.yaml +0 -0
  364. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/util-conf-overwrite.yaml +0 -0
  365. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +0 -0
  366. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/util_wms_capabilities111.xml +0 -0
  367. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/util_wms_capabilities130.xml +0 -0
  368. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +0 -0
  369. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/watermark.yaml +0 -0
  370. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/wms_srs_extent.yaml +0 -0
  371. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/wms_versions.yaml +0 -0
  372. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/wmts.yaml +0 -0
  373. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/wmts_dimensions.yaml +0 -0
  374. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/xslt_featureinfo.yaml +0 -0
  375. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +0 -0
  376. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_arcgis.py +0 -0
  377. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_auth.py +0 -0
  378. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_behind_proxy.py +0 -0
  379. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_bulk_meta_tiles.py +0 -0
  380. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_cache_azureblob.py +0 -0
  381. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_cache_band_merge.py +0 -0
  382. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_cache_coverage.py +0 -0
  383. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_cache_geopackage.py +0 -0
  384. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_cache_grid_names.py +0 -0
  385. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_cache_mbtiles.py +0 -0
  386. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_cache_s3.py +0 -0
  387. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_cache_source.py +0 -0
  388. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_combined_sources.py +0 -0
  389. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_coverage.py +0 -0
  390. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_decorate_img.py +0 -0
  391. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_demo_with_extra_service.py +0 -0
  392. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_dimensions.py +0 -0
  393. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_disable_storage.py +0 -0
  394. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_formats.py +0 -0
  395. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_inspire_vs.py +0 -0
  396. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_kml.py +0 -0
  397. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_layergroups.py +0 -0
  398. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_legendgraphic.py +0 -0
  399. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_mapnik.py +0 -0
  400. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_mapserver.py +0 -0
  401. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_mixed_mode_format.py +0 -0
  402. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_multi_cache_layers.py +0 -0
  403. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_multiapp.py +0 -0
  404. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_refresh.py +0 -0
  405. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_renderd_client.py +0 -0
  406. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_response_headers.py +0 -0
  407. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_scalehints.py +0 -0
  408. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_seed.py +0 -0
  409. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_seed_only.py +0 -0
  410. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_sld.py +0 -0
  411. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_source_errors.py +0 -0
  412. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_tilesource_minmax_res.py +0 -0
  413. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_tms.py +0 -0
  414. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_tms_origin.py +0 -0
  415. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_util_conf.py +0 -0
  416. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_util_export.py +0 -0
  417. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_util_grids.py +0 -0
  418. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_util_wms_capabilities.py +0 -0
  419. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_watermark.py +0 -0
  420. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_wms.py +0 -0
  421. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_wms_srs_extent.py +0 -0
  422. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_wms_version.py +0 -0
  423. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_wmsc.py +0 -0
  424. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_wmts.py +0 -0
  425. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_wmts_dimensions.py +0 -0
  426. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_wmts_restful.py +0 -0
  427. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/system/test_xslt_featureinfo.py +0 -0
  428. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/test_http_helper.py +0 -0
  429. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/__init__.py +0 -0
  430. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/epsg +0 -0
  431. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/polygons/polygons.dbf +0 -0
  432. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/polygons/polygons.shp +0 -0
  433. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/polygons/polygons.shx +0 -0
  434. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_async.py +0 -0
  435. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_auth.py +0 -0
  436. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_cache.py +0 -0
  437. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_cache_azureblob.py +0 -0
  438. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_cache_compact.py +0 -0
  439. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_cache_couchdb.py +0 -0
  440. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_cache_geopackage.py +0 -0
  441. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_cache_mbtile.py +0 -0
  442. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_cache_redis.py +0 -0
  443. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_cache_s3.py +0 -0
  444. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_cache_tile.py +0 -0
  445. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_client.py +0 -0
  446. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_client_arcgis.py +0 -0
  447. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_client_cgi.py +0 -0
  448. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_collections.py +0 -0
  449. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_concat_legends.py +0 -0
  450. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_conf_loader.py +0 -0
  451. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_conf_validator.py +0 -0
  452. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_config.py +0 -0
  453. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_decorate_img.py +0 -0
  454. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_exceptions.py +0 -0
  455. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_featureinfo.py +0 -0
  456. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_file_lock_load.py +0 -0
  457. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_fs.py +0 -0
  458. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_geom.py +0 -0
  459. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_grid.py +0 -0
  460. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_image.py +0 -0
  461. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_image_mask.py +0 -0
  462. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_image_messages.py +0 -0
  463. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_image_options.py +0 -0
  464. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_isodate.py +0 -0
  465. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_multiapp.py +0 -0
  466. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_ogr_reader.py +0 -0
  467. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_request.py +0 -0
  468. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_request_wmts.py +0 -0
  469. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_response.py +0 -0
  470. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_seed.py +0 -0
  471. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_seed_cachelock.py +0 -0
  472. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_srs.py +0 -0
  473. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_tiled_source.py +0 -0
  474. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_tilefilter.py +0 -0
  475. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_times.py +0 -0
  476. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_timeutils.py +0 -0
  477. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_util_conf_utils.py +0 -0
  478. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_utils.py +0 -0
  479. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_wms_capabilities.py +0 -0
  480. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_wms_layer.py +0 -0
  481. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/test/unit/test_yaml.py +0 -0
  482. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/tilefilter.py +0 -0
  483. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/__init__.py +0 -0
  484. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/async_.py +0 -0
  485. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/collections.py +0 -0
  486. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/coverage.py +0 -0
  487. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/__init__.py +0 -0
  488. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/dictspec/__init__.py +0 -0
  489. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/dictspec/spec.py +0 -0
  490. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/dictspec/test/__init__.py +0 -0
  491. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/dictspec/test/test_validator.py +0 -0
  492. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/dictspec/validator.py +0 -0
  493. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/local.py +0 -0
  494. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/lockfile.py +0 -0
  495. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/odict.py +0 -0
  496. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/serving.py +0 -0
  497. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/tempita/__init__.py +0 -0
  498. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/tempita/_looper.py +0 -0
  499. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/tempita/string_utils.py +0 -0
  500. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/__init__.py +0 -0
  501. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/duration.py +0 -0
  502. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/parse.py +0 -0
  503. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
  504. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/test/test_parse.py +0 -0
  505. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/test/test_util.py +0 -0
  506. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/test/wms-example-111.xml +0 -0
  507. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/test/wms-example-130.xml +0 -0
  508. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/test/wms-large-111.xml +0 -0
  509. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +0 -0
  510. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ext/wmsparse/util.py +0 -0
  511. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/fs.py +0 -0
  512. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/geom.py +0 -0
  513. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/lib.py +0 -0
  514. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/lock.py +0 -0
  515. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/ogr.py +0 -0
  516. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/py.py +0 -0
  517. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/times.py +0 -0
  518. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/util/yaml.py +0 -0
  519. {mapproxy-4.0.1 → mapproxy-4.0.2}/mapproxy/version.py +0 -0
  520. {mapproxy-4.0.1 → mapproxy-4.0.2}/pyproject.toml +0 -0
  521. {mapproxy-4.0.1 → mapproxy-4.0.2}/requirements-tests.txt +0 -0
  522. {mapproxy-4.0.1 → mapproxy-4.0.2}/setup.cfg +0 -0
@@ -1,3 +1,12 @@
1
+ 4.0.2 2025-04-10
2
+ ~~~~~~~~~~~~~~~~
3
+
4
+ Fixes:
5
+
6
+ - Security fix to prevent XSS injections in demo pages
7
+ - Security fix to prevent reading file urls
8
+
9
+
1
10
  4.0.1 2025-03-25
2
11
  ~~~~~~~~~~~~~~~~
3
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MapProxy
3
- Version: 4.0.1
3
+ Version: 4.0.2
4
4
  Summary: An accelerating proxy for tile and web map services
5
5
  Home-page: https://mapproxy.org
6
6
  Author: Oliver Tonnhofer
@@ -53,6 +53,15 @@ The documentation is available at: http://mapproxy.github.io/mapproxy/latest/
53
53
 
54
54
  Changes
55
55
  -------
56
+ 4.0.2 2025-04-10
57
+ ~~~~~~~~~~~~~~~~
58
+
59
+ Fixes:
60
+
61
+ - Security fix to prevent XSS injections in demo pages
62
+ - Security fix to prevent reading file urls
63
+
64
+
56
65
  4.0.1 2025-03-25
57
66
  ~~~~~~~~~~~~~~~~
58
67
 
@@ -155,15 +164,6 @@ Fixes:
155
164
  - Fix transparency in TMS demo page.
156
165
 
157
166
 
158
- 3.0.1 2024-08-27
159
- ~~~~~~~~~~~~~~~~
160
-
161
- Fixes:
162
-
163
- - Fix capabilities links in demo page and config template
164
- - Trivy report format
165
-
166
-
167
167
 
168
168
  Older changes
169
169
  -------------
@@ -484,6 +484,7 @@ mapproxy/util/__init__.py
484
484
  mapproxy/util/async_.py
485
485
  mapproxy/util/collections.py
486
486
  mapproxy/util/coverage.py
487
+ mapproxy/util/escape.py
487
488
  mapproxy/util/fs.py
488
489
  mapproxy/util/geom.py
489
490
  mapproxy/util/lib.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MapProxy
3
- Version: 4.0.1
3
+ Version: 4.0.2
4
4
  Summary: An accelerating proxy for tile and web map services
5
5
  Home-page: https://mapproxy.org
6
6
  Author: Oliver Tonnhofer
@@ -53,6 +53,15 @@ The documentation is available at: http://mapproxy.github.io/mapproxy/latest/
53
53
 
54
54
  Changes
55
55
  -------
56
+ 4.0.2 2025-04-10
57
+ ~~~~~~~~~~~~~~~~
58
+
59
+ Fixes:
60
+
61
+ - Security fix to prevent XSS injections in demo pages
62
+ - Security fix to prevent reading file urls
63
+
64
+
56
65
  4.0.1 2025-03-25
57
66
  ~~~~~~~~~~~~~~~~
58
67
 
@@ -155,15 +164,6 @@ Fixes:
155
164
  - Fix transparency in TMS demo page.
156
165
 
157
166
 
158
- 3.0.1 2024-08-27
159
- ~~~~~~~~~~~~~~~~
160
-
161
- Fixes:
162
-
163
- - Fix capabilities links in demo page and config template
164
- - Trivy report format
165
-
166
-
167
167
 
168
168
  Older changes
169
169
  -------------
@@ -49,6 +49,8 @@ Behind an HTTP server or proxy
49
49
 
50
50
  Both approaches require a configuration that maps your MapProxy configuration with the MapProxy application. You can write a small script file for that.
51
51
 
52
+ .. note:: In production mode it is recommended to disable the demo service.
53
+
52
54
  .. _server_script:
53
55
 
54
56
  Server script
@@ -2159,7 +2159,6 @@ class ServiceConfiguration(ConfigurationBase):
2159
2159
  creator = getattr(self, service_name + '_service', None)
2160
2160
  if not creator:
2161
2161
  # If not a known service, try to use the plugin mechanism
2162
- global plugin_services
2163
2162
  creator = plugin_services.get(service_name, None)
2164
2163
  if not creator:
2165
2164
  raise ValueError('unknown service: %s' % service_name)
@@ -2409,6 +2408,10 @@ def load_configuration(mapproxy_conf, seed=False, ignore_warnings=True, renderd=
2409
2408
  for error in errors:
2410
2409
  log.warning(error)
2411
2410
 
2411
+ services = conf_dict.get('services')
2412
+ if services is not None and 'demo' in services:
2413
+ log.warning('Application has demo page enabled. It is recommended to disable this in production.')
2414
+
2412
2415
  return ProxyConfiguration(conf_dict, conf_base_dir=conf_base_dir, seed=seed,
2413
2416
  renderd=renderd)
2414
2417
 
@@ -20,6 +20,7 @@ from mapproxy.request import Request
20
20
  from mapproxy.response import Response
21
21
  from mapproxy.util.collections import LRU
22
22
  from mapproxy.wsgiapp import make_wsgi_app as make_mapproxy_wsgi_app
23
+ from mapproxy.util.escape import escape_html
23
24
 
24
25
  from threading import Lock
25
26
 
@@ -95,7 +96,7 @@ class MultiMapProxy(object):
95
96
  import mapproxy.version
96
97
  html = "<html><body><h1>Welcome to MapProxy %s</h1>" % mapproxy.version.version
97
98
 
98
- url = req.script_url
99
+ url = escape_html(req.script_url)
99
100
  if self.list_apps:
100
101
  html += "<h2>available instances:</h2><ul>"
101
102
  html += '\n'.join('<li><a href="%(url)s/%(name)s/">%(name)s</a></li>' % {'url': url, 'name': app}
@@ -18,6 +18,9 @@ Demo service handler
18
18
  """
19
19
  from __future__ import division
20
20
 
21
+ import logging
22
+ import re
23
+
21
24
  try:
22
25
  import importlib_resources
23
26
  except ImportError:
@@ -30,10 +33,12 @@ from mapproxy.config.config import base_config
30
33
  from mapproxy.util.ext.odict import odict
31
34
  from mapproxy.exception import RequestError
32
35
  from mapproxy.service.base import Server
36
+ from mapproxy.request.base import Request
33
37
  from mapproxy.response import Response
34
38
  from mapproxy.srs import SRS, get_epsg_num
35
39
  from mapproxy.layer import SRSConditional, CacheMapLayer, ResolutionConditional
36
40
  from mapproxy.source.wms import WMSSource
41
+ from mapproxy.util.escape import escape_html
37
42
 
38
43
  from urllib import request as urllib2
39
44
 
@@ -44,6 +49,8 @@ get_template = template_loader(__package__, 'templates', namespace=env)
44
49
  # Used by plugins
45
50
  extra_demo_server_handlers = set()
46
51
 
52
+ logger = logging.getLogger("demo")
53
+
47
54
 
48
55
  def register_extra_demo_server_handler(handler):
49
56
  """ Method used by plugins to register a new handler for the demo service.
@@ -106,7 +113,29 @@ class DemoServer(Server):
106
113
  self.restful_template = restful_template
107
114
  self.background = background
108
115
 
109
- def handle(self, req):
116
+ @staticmethod
117
+ def get_capabilities_url(service_path: str, req: Request) -> str:
118
+ if 'type' in req.args and req.args['type'] == 'external':
119
+ url = escape_html(req.script_url) + service_path
120
+ else:
121
+ url = req.server_script_url + service_path
122
+ return url
123
+
124
+ @staticmethod
125
+ def valid_url(url: str) -> bool:
126
+ pattern = re.compile("^https?://")
127
+ if pattern.match(url):
128
+ return True
129
+ else:
130
+ logging.warn(f"A request was blocked that was trying to access a non-http resource: {url}")
131
+ return False
132
+
133
+ @staticmethod
134
+ def read_capabilities(url: str) -> str:
135
+ resp = urllib2.urlopen(url)
136
+ return escape_html(resp.read().decode())
137
+
138
+ def handle(self, req: Request):
110
139
  if req.path.startswith('/demo/static/'):
111
140
  if '..' in req.path:
112
141
  return Response('file not found', content_type='text/plain', status=404)
@@ -138,56 +167,47 @@ class DemoServer(Server):
138
167
  elif 'wmts_layer' in req.args:
139
168
  demo = self._render_wmts_template('demo/wmts_demo.html', req)
140
169
  elif 'wms_capabilities' in req.args:
141
- internal_url = '%s/service?REQUEST=GetCapabilities&SERVICE=WMS' % (req.server_script_url)
142
- if 'type' in req.args and req.args['type'] == 'external':
143
- url = internal_url.replace(req.server_script_url, req.script_url)
144
- else:
145
- url = internal_url
146
- capabilities = urllib2.urlopen(url)
170
+ url = self.get_capabilities_url('/service?REQUEST=GetCapabilities&SERVICE=WMS', req)
171
+ if not self.valid_url(url):
172
+ return Response('bad request', content_type='text/plain', status=400)
173
+ capabilities = self.read_capabilities(url)
147
174
  demo = self._render_capabilities_template('demo/capabilities_demo.html', capabilities, 'WMS', url)
148
175
  elif 'wmsc_capabilities' in req.args:
149
- internal_url = '%s/service?REQUEST=GetCapabilities&SERVICE=WMS&tiled=true' % (req.server_script_url)
150
- if 'type' in req.args and req.args['type'] == 'external':
151
- url = internal_url.replace(req.server_script_url, req.script_url)
152
- else:
153
- url = internal_url
154
- capabilities = urllib2.urlopen(url)
176
+ url = self.get_capabilities_url('/service?REQUEST=GetCapabilities&SERVICE=WMS&tiled=true', req)
177
+ if not self.valid_url(url):
178
+ return Response('bad request', content_type='text/plain', status=400)
179
+ capabilities = self.read_capabilities(url)
155
180
  demo = self._render_capabilities_template('demo/capabilities_demo.html', capabilities, 'WMS-C', url)
156
181
  elif 'wmts_capabilities_kvp' in req.args:
157
- internal_url = '%s/service?REQUEST=GetCapabilities&SERVICE=WMTS' % (req.server_script_url)
158
- if 'type' in req.args and req.args['type'] == 'external':
159
- url = internal_url.replace(req.server_script_url, req.script_url)
160
- else:
161
- url = internal_url
162
- capabilities = urllib2.urlopen(url)
182
+ url = self.get_capabilities_url('/service?REQUEST=GetCapabilities&SERVICE=WMTS', req)
183
+ if not self.valid_url(url):
184
+ return Response('bad request', content_type='text/plain', status=400)
185
+ capabilities = self.read_capabilities(url)
163
186
  demo = self._render_capabilities_template('demo/capabilities_demo.html', capabilities, 'WMTS', url)
164
187
  elif 'wmts_capabilities' in req.args:
165
- internal_url = '%s/wmts/1.0.0/WMTSCapabilities.xml' % (req.server_script_url)
166
- if 'type' in req.args and req.args['type'] == 'external':
167
- url = internal_url.replace(req.server_script_url, req.script_url)
168
- else:
169
- url = internal_url
170
- capabilities = urllib2.urlopen(url)
188
+ url = self.get_capabilities_url('/wmts/1.0.0/WMTSCapabilities.xml', req)
189
+ if not self.valid_url(url):
190
+ return Response('bad request', content_type='text/plain', status=400)
191
+ capabilities = self.read_capabilities(url)
171
192
  demo = self._render_capabilities_template('demo/capabilities_demo.html', capabilities, 'WMTS', url)
172
193
  elif 'tms_capabilities' in req.args:
173
194
  if 'layer' in req.args and 'srs' in req.args:
174
- # prevent dir traversal (seems it's not possible with urllib2, but better safe then sorry)
175
- layer = req.args['layer'].replace('..', '')
176
- srs = req.args['srs'].replace('..', '')
177
- internal_url = '%s/tms/1.0.0/%s/%s' % (req.server_script_url, layer, srs)
178
- else:
179
- internal_url = '%s/tms/1.0.0/' % (req.server_script_url)
180
- if 'type' in req.args and req.args['type'] == 'external':
181
- url = internal_url.replace(req.server_script_url, req.script_url)
195
+ # prevent dir traversal (seems it's not possible with urllib2, but better safe than sorry)
196
+ layer = escape_html(req.args['layer'].replace('..', ''))
197
+ srs = escape_html(req.args['srs'].replace('..', ''))
198
+ service_path = f'/tms/1.0.0/{layer}/{srs}'
182
199
  else:
183
- url = internal_url
184
- capabilities = urllib2.urlopen(url)
200
+ service_path = '/tms/1.0.0/'
201
+ url = self.get_capabilities_url(service_path, req)
202
+ if not self.valid_url(url):
203
+ return Response('bad request', content_type='text/plain', status=400)
204
+ capabilities = self.read_capabilities(url)
185
205
  demo = self._render_capabilities_template('demo/capabilities_demo.html', capabilities, 'TMS', url)
186
206
  elif req.path == '/demo/':
187
207
  demo = self._render_template(req, 'demo/demo.html')
188
208
  else:
189
209
  resp = Response('', status=301)
190
- resp.headers['Location'] = req.script_url.rstrip('/') + '/demo/'
210
+ resp.headers['Location'] = escape_html(req.script_url).rstrip('/') + '/demo/'
191
211
  return resp
192
212
  return Response(demo, content_type='text/html')
193
213
 
@@ -258,7 +278,7 @@ class DemoServer(Server):
258
278
  def _render_wms_template(self, template, req):
259
279
  template = get_template(template, default_inherit="demo/static.html")
260
280
  layer = self.layers[req.args['wms_layer']]
261
- srs = escape(req.args['srs'])
281
+ srs = escape_html(req.args['srs'])
262
282
  bbox = layer.extent.bbox_for(SRS(srs))
263
283
  width = bbox[2] - bbox[0]
264
284
  height = bbox[3] - bbox[1]
@@ -268,7 +288,7 @@ class DemoServer(Server):
268
288
  background_url = self.background["url"]
269
289
  return template.substitute(layer=layer,
270
290
  image_formats=self.image_formats,
271
- format=escape(req.args['format']),
291
+ format=escape_html(req.args['format']),
272
292
  srs=srs,
273
293
  layer_srs=self.layer_srs,
274
294
  bbox=bbox,
@@ -301,8 +321,8 @@ class DemoServer(Server):
301
321
  if self.background:
302
322
  background_url = self.background["url"]
303
323
  return template.substitute(layer=tile_layer,
304
- srs=escape(req.args['srs']),
305
- format=escape(req.args['format']),
324
+ srs=escape_html(req.args['srs']),
325
+ format=escape_html(req.args['format']),
306
326
  resolutions=res,
307
327
  units=units,
308
328
  add_res_to_options=add_res_to_options,
@@ -332,8 +352,8 @@ class DemoServer(Server):
332
352
  background_url = self.background["url"]
333
353
  return template.substitute(layer=wmts_layer,
334
354
  matrix_set=wmts_layer.grid.name,
335
- format=escape(req.args['format']),
336
- srs=escape(req.args['srs']),
355
+ format=escape_html(req.args['format']),
356
+ srs=escape_html(req.args['srs']),
337
357
  resolutions=wmts_layer.grid.resolutions,
338
358
  units=units,
339
359
  all_tile_layers=self.tile_layers,
@@ -356,15 +376,3 @@ class DemoServer(Server):
356
376
  return True
357
377
  return False
358
378
  return True
359
-
360
-
361
- def escape(data):
362
- """
363
- Escape user-provided input data for safe inclusion in HTML _and_ JS to prevent XSS.
364
- """
365
- data = data.replace('&', '&amp;')
366
- data = data.replace('>', '&gt;')
367
- data = data.replace('<', '&lt;')
368
- data = data.replace("'", '')
369
- data = data.replace('"', '')
370
- return data
@@ -21,6 +21,7 @@ from mapproxy.service.base import Server
21
21
  from mapproxy.request.tile import TileRequest
22
22
  from mapproxy.srs import SRS
23
23
  from mapproxy.util.coverage import load_limited_to
24
+ from mapproxy.util.escape import escape_html
24
25
 
25
26
 
26
27
  class KMLRequest(TileRequest):
@@ -182,7 +183,7 @@ class KMLServer(Server):
182
183
 
183
184
  subtiles = self._get_subtiles(map_request, layer)
184
185
  tile_size = layer.grid.tile_size[0]
185
- url = map_request.http.script_url.rstrip('/')
186
+ url = escape_html(map_request.http.script_url.rstrip('/'))
186
187
  result = KMLRenderer().render(
187
188
  tile=tile, subtiles=subtiles, layer=layer, url=url, name=map_request.layer, format=layer.format,
188
189
  name_path=layer.md['name_path'], initial_level=initial_level, tile_size=tile_size)
@@ -11,8 +11,6 @@ jscript_functions = None
11
11
  <h2>{{service}} GetCapabilities</h2>
12
12
  <a href="{{url}}">{{url}}</a>
13
13
  <pre>
14
- {{for line in capabilities}}
15
- {{escape(wrapper.fill(line.decode('utf8')))}}
16
- {{endfor}}
14
+ {{capabilities}}
17
15
  </pre>
18
16
 
@@ -1,5 +1,6 @@
1
1
  services:
2
- demo:
2
+ wms:
3
+
3
4
  layers:
4
5
  - name: grid_layer
5
6
  title: Grid Layer
@@ -0,0 +1,123 @@
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 re
17
+ import pytest
18
+
19
+ from mapproxy.test.http import mock_httpd
20
+ from mapproxy.test.system import SysTest
21
+ from webtest import AppError
22
+
23
+
24
+ @pytest.fixture(scope="module")
25
+ def config_file():
26
+ return "demo.yaml"
27
+
28
+
29
+ class TestDemo(SysTest):
30
+
31
+ def test_basic(self, app):
32
+ resp = app.get("/demo/", status=200)
33
+ assert resp.content_type == "text/html"
34
+ assert 'href="../service?REQUEST=GetCapabilities&SERVICE=WMS"' in resp
35
+ assert 'href="../service?REQUEST=GetCapabilities&SERVICE=WMS&tiled=true"' in resp
36
+ assert 'href="../demo/?wmts_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
37
+ assert 'href="../demo/?tms_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
38
+
39
+ def test_previewmap(self, app):
40
+ resp = app.get("/demo/?srs=EPSG%3A3857&format=image%2Fpng&wms_layer=wms_cache", status=200)
41
+ assert resp.content_type == "text/html"
42
+ assert '<h2>Layer Preview - wms_cache</h2>' in resp
43
+
44
+ def test_layers_sorted_by_name(self, app):
45
+ resp = app.get("/demo/", status=200)
46
+
47
+ patternTable = re.compile(r'<table class="code">.*?</table>', re.DOTALL)
48
+ patternWMS = r'<td\s+rowspan="2">([\w\d-]+)</td>'
49
+ patternWMTS_TBS = r'<td\s+rowspan="1">([\w\d-]+)</td>'
50
+ tables = patternTable.findall(resp.text)
51
+
52
+ layersWMS = re.findall(patternWMS, resp.text, re.IGNORECASE)
53
+ layersWMTS = re.findall(patternWMTS_TBS, tables[1], re.IGNORECASE)
54
+ layersTBS = re.findall(patternWMTS_TBS, tables[2], re.IGNORECASE)
55
+
56
+ assert layersWMS == sorted(layersWMS)
57
+ assert layersWMTS == sorted(layersWMTS)
58
+ assert layersTBS == sorted(layersTBS)
59
+
60
+ def test_external(self, app):
61
+ expected_req = (
62
+ {
63
+ "path": r"/path/service?REQUEST=GetCapabilities&SERVICE=WMS"
64
+ },
65
+ {"body": b"test-string", "headers": {"content-type": "text/xml"}}
66
+ )
67
+ with mock_httpd(
68
+ ("localhost", 42423), [expected_req]
69
+ ):
70
+ resp = app.get('/demo/?wms_capabilities&type=external', extra_environ={
71
+ 'HTTP_X_FORWARDED_HOST': 'localhost:42423/path'
72
+ })
73
+ content = resp.text
74
+ assert 'test-string' in content
75
+ assert 'http://localhost:42423/path/service?REQUEST=GetCapabilities&SERVICE=WMS' in content
76
+
77
+ def test_external_xss_injection(self, app):
78
+ expected_req = (
79
+ {
80
+ "path": r"/path/&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;/service?REQUEST=GetCapabilities&SERVICE=WMS"
81
+ },
82
+ {"body": b"test-string", "headers": {"content-type": "text/xml"}}
83
+ )
84
+
85
+ with mock_httpd(
86
+ ("localhost", 42423), [expected_req]
87
+ ):
88
+ resp = app.get('/demo/?wms_capabilities&type=external', extra_environ={
89
+ 'HTTP_X_FORWARDED_HOST': 'localhost:42423/path/"><script>alert(\'XSS\')</script>'
90
+ })
91
+ content = resp.text
92
+ assert 'test-string' in content
93
+ assert '"><script>alert(\'XSS\')' not in content
94
+ assert '&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;' in content
95
+
96
+ def test_external_file_protocol(self, app):
97
+ try:
98
+ app.get('/demo/?wms_capabilities&type=external', extra_environ={
99
+ 'HTTP_X_FORWARDED_PROTO': 'file'
100
+ })
101
+ except AppError as e:
102
+ assert '400 Bad Request' in e.args[0]
103
+
104
+ def test_tms_layer_xss(self, app):
105
+ expected_req = (
106
+ {
107
+ "path": r"/tms/1.0.0/osm&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;/1.0.0"
108
+ },
109
+ {"body": b"test-string", "headers": {"content-type": "text/xml"}}
110
+ )
111
+
112
+ with mock_httpd(
113
+ ("localhost", 42423), [expected_req]
114
+ ):
115
+ resp = app.get(
116
+ '/demo/?tms_capabilities&layer=osm"><script>alert(\'XSS\')</script>&type=external&srs=1.0.0',
117
+ extra_environ={
118
+ 'HTTP_X_FORWARDED_HOST': 'localhost:42423'
119
+ }
120
+ )
121
+ content = resp.text
122
+ assert '"><script>alert(\'XSS\')' not in content
123
+ assert '&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;' in content
@@ -0,0 +1,10 @@
1
+ def escape_html(data):
2
+ """
3
+ Escape user-provided input data for safe inclusion in HTML _and_ JS to prevent XSS.
4
+ """
5
+ data = data.replace('&', '&amp;')
6
+ data = data.replace('>', '&gt;')
7
+ data = data.replace('<', '&lt;')
8
+ data = data.replace("'", '')
9
+ data = data.replace('"', '')
10
+ return data
@@ -34,6 +34,7 @@ from mapproxy.request import Request
34
34
  from mapproxy.response import Response
35
35
  from mapproxy.config import local_base_config
36
36
  from mapproxy.config.loader import load_configuration, ConfigurationError
37
+ from mapproxy.util.escape import escape_html
37
38
 
38
39
  log = logging.getLogger('mapproxy.config')
39
40
  log_wsgiapp = logging.getLogger('mapproxy.wsgiapp')
@@ -164,7 +165,7 @@ class MapProxyApp(object):
164
165
  resp = Response('internal error', status=500)
165
166
  if resp is None:
166
167
  if req.path in ('', '/'):
167
- resp = self.welcome_response(req.script_url)
168
+ resp = self.welcome_response(escape_html(req.script_url))
168
169
  else:
169
170
  resp = Response('not found', mimetype='text/plain', status=404)
170
171
  return resp(environ, start_response)
@@ -62,7 +62,7 @@ def long_description(changelog_releases=10):
62
62
 
63
63
  setup(
64
64
  name='MapProxy',
65
- version="4.0.1",
65
+ version="4.0.2",
66
66
  description='An accelerating proxy for tile and web map services',
67
67
  long_description=long_description(7),
68
68
  long_description_content_type='text/x-rst',
@@ -1,56 +0,0 @@
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 re
17
- import pytest
18
-
19
- from mapproxy.test.system import SysTest
20
-
21
-
22
- @pytest.fixture(scope="module")
23
- def config_file():
24
- return "demo.yaml"
25
-
26
-
27
- class TestDemo(SysTest):
28
-
29
- def test_basic(self, app):
30
- resp = app.get("/demo/", status=200)
31
- assert resp.content_type == "text/html"
32
- assert 'href="../service?REQUEST=GetCapabilities&SERVICE=WMS"' in resp
33
- assert 'href="../service?REQUEST=GetCapabilities&SERVICE=WMS&tiled=true"' in resp
34
- assert 'href="../demo/?wmts_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
35
- assert 'href="../demo/?tms_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
36
-
37
- def test_previewmap(self, app):
38
- resp = app.get("/demo/?srs=EPSG%3A3857&format=image%2Fpng&wms_layer=wms_cache", status=200)
39
- assert resp.content_type == "text/html"
40
- assert '<h2>Layer Preview - wms_cache</h2>' in resp
41
-
42
- def test_layers_sorted_by_name(self, app):
43
- resp = app.get("/demo/", status=200)
44
-
45
- patternTable = re.compile(r'<table class="code">.*?</table>', re.DOTALL)
46
- patternWMS = r'<td\s+rowspan="2">([\w\d-]+)</td>'
47
- patternWMTS_TBS = r'<td\s+rowspan="1">([\w\d-]+)</td>'
48
- tables = patternTable.findall(resp.text)
49
-
50
- layersWMS = re.findall(patternWMS, resp.text, re.IGNORECASE)
51
- layersWMTS = re.findall(patternWMTS_TBS, tables[1], re.IGNORECASE)
52
- layersTBS = re.findall(patternWMTS_TBS, tables[2], re.IGNORECASE)
53
-
54
- assert layersWMS == sorted(layersWMS)
55
- assert layersWMTS == sorted(layersWMTS)
56
- assert layersTBS == sorted(layersTBS)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes