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,479 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2010-2017 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
+
17
+ import os
18
+ import sys
19
+ import time
20
+
21
+ import pytest
22
+
23
+ from mapproxy.client.http import HTTPClient, HTTPClientError, supports_ssl_default_context
24
+ from mapproxy.client.tile import TileClient, TileURLTemplate
25
+ from mapproxy.client.wms import WMSClient, WMSInfoClient
26
+ from mapproxy.grid import tile_grid
27
+ from mapproxy.layer import MapQuery, InfoQuery
28
+ from mapproxy.request.wms import (
29
+ WMS111MapRequest,
30
+ WMS100MapRequest,
31
+ WMS130MapRequest,
32
+ WMS111FeatureInfoRequest,
33
+ )
34
+ from mapproxy.source import SourceError
35
+ from mapproxy.srs import SRS, SupportedSRS
36
+ from mapproxy.test.helper import assert_re, TempFile
37
+ from mapproxy.test.http import mock_httpd, query_eq, assert_query_eq, wms_query_eq
38
+ from mapproxy.test.unit.test_cache import MockHTTPClient
39
+
40
+
41
+ TESTSERVER_ADDRESS = ('127.0.0.1', 56413)
42
+ TESTSERVER_URL = 'http://%s:%s' % TESTSERVER_ADDRESS
43
+
44
+
45
+ class TestHTTPClient(object):
46
+ def setup(self):
47
+ self.client = HTTPClient()
48
+
49
+ def test_post(self):
50
+ with mock_httpd(TESTSERVER_ADDRESS, [({'path': '/service?foo=bar', 'method': 'POST'},
51
+ {'status': '200', 'body': b''})]):
52
+ self.client.open(TESTSERVER_URL + '/service', data=b"foo=bar")
53
+
54
+ @pytest.mark.skipif(sys.version_info < (3,), reason='HEAD request not supported by BaseHTTPRequestHandler in Py 2')
55
+ def test_head(self):
56
+ with mock_httpd(TESTSERVER_ADDRESS, [({'path': '/service', 'method': 'HEAD'},
57
+ {'status': '200'})]):
58
+ self.client.open(TESTSERVER_URL + '/service', method = 'HEAD')
59
+
60
+ def test_internal_error_response(self):
61
+ try:
62
+ with mock_httpd(TESTSERVER_ADDRESS, [({'path': '/'},
63
+ {'status': '500', 'body': b''})]):
64
+ self.client.open(TESTSERVER_URL + '/')
65
+ except HTTPClientError as e:
66
+ assert_re(e.args[0], r'HTTP Error ".*": 500')
67
+ else:
68
+ assert False, 'expected HTTPClientError'
69
+
70
+ def test_invalid_url_type(self):
71
+ try:
72
+ self.client.open('htp://example.org')
73
+ except HTTPClientError as e:
74
+ assert_re(e.args[0], r'No response .* "htp://example.*": unknown url type')
75
+ else:
76
+ assert False, 'expected HTTPClientError'
77
+
78
+ def test_invalid_url(self):
79
+ try:
80
+ self.client.open('this is not a url')
81
+ except HTTPClientError as e:
82
+ assert_re(e.args[0], r'URL not correct "this is not.*": unknown url type')
83
+ else:
84
+ assert False, 'expected HTTPClientError'
85
+
86
+ def test_unknown_host(self):
87
+ try:
88
+ self.client.open('http://thishostshouldnotexist000136really42.org')
89
+ except HTTPClientError as e:
90
+ assert_re(e.args[0], r'No response .* "http://thishost.*": .*')
91
+ else:
92
+ assert False, 'expected HTTPClientError'
93
+
94
+ def test_no_connect(self):
95
+ try:
96
+ self.client.open('http://localhost:53871')
97
+ except HTTPClientError as e:
98
+ assert_re(e.args[0], r'No response .* "http://localhost.*": Connection refused')
99
+ else:
100
+ assert False, 'expected HTTPClientError'
101
+
102
+ def test_internal_error_hide_error_details(self):
103
+ try:
104
+ with mock_httpd(TESTSERVER_ADDRESS, [({'path': '/'},
105
+ {'status': '500', 'body': b''})]):
106
+ HTTPClient(hide_error_details=True).open(TESTSERVER_URL + '/')
107
+ except HTTPClientError as e:
108
+ assert_re(e.args[0], r'HTTP Error \(see logs for URL and reason\).')
109
+ else:
110
+ assert False, 'expected HTTPClientError'
111
+
112
+ @pytest.mark.online
113
+ def test_https_untrusted_root(self):
114
+ if not supports_ssl_default_context:
115
+ raise pytest.skip("old python versions require ssl_ca_certs")
116
+ self.client = HTTPClient('https://untrusted-root.badssl.com/')
117
+ try:
118
+ self.client.open('https://untrusted-root.badssl.com/')
119
+ except HTTPClientError as e:
120
+ assert_re(e.args[0], r'Could not verify connection to URL')
121
+
122
+ @pytest.mark.online
123
+ def test_https_insecure(self):
124
+ self.client = HTTPClient(
125
+ 'https://untrusted-root.badssl.com/', insecure=True)
126
+ self.client.open('https://untrusted-root.badssl.com/')
127
+
128
+ @pytest.mark.online
129
+ def test_https_valid_ca_cert_file(self):
130
+ # verify with fixed ca_certs file
131
+ cert_file = '/etc/ssl/certs/ca-certificates.crt'
132
+ if os.path.exists(cert_file):
133
+ self.client = HTTPClient('https://www.google.com/', ssl_ca_certs=cert_file)
134
+ self.client.open('https://www.google.com/')
135
+ else:
136
+ with TempFile() as tmp:
137
+ with open(tmp, 'wb') as f:
138
+ f.write(GOOGLE_ROOT_CERT)
139
+ self.client = HTTPClient('https://www.google.com/', ssl_ca_certs=tmp)
140
+ self.client.open('https://www.google.com/')
141
+
142
+ @pytest.mark.online
143
+ def test_https_valid_default_cert(self):
144
+ # modern python should verify by default
145
+ if not supports_ssl_default_context:
146
+ raise pytest.skip("old python versions require ssl_ca_certs")
147
+ self.client = HTTPClient('https://www.google.com/')
148
+ self.client.open('https://www.google.com/')
149
+
150
+ @pytest.mark.online
151
+ def test_https_invalid_cert(self):
152
+ # load 'wrong' root cert
153
+ with TempFile() as tmp:
154
+ with open(tmp, 'wb') as f:
155
+ f.write(GOOGLE_ROOT_CERT)
156
+ self.client = HTTPClient(
157
+ 'https://untrusted-root.badssl.com/', ssl_ca_certs=tmp)
158
+ try:
159
+ self.client.open('https://untrusted-root.badssl.com/')
160
+ except HTTPClientError as e:
161
+ assert_re(e.args[0], r'Could not verify connection to URL')
162
+
163
+ def test_timeouts(self):
164
+ test_req = ({'path': '/', 'req_assert_function': lambda x: time.sleep(0.9) or True},
165
+ {'body': b'nothing'})
166
+
167
+ import mapproxy.client.http
168
+
169
+ client1 = HTTPClient(timeout=0.1)
170
+ client2 = HTTPClient(timeout=0.5)
171
+ with mock_httpd(TESTSERVER_ADDRESS, [test_req]):
172
+ try:
173
+ start = time.time()
174
+ client1.open(TESTSERVER_URL + '/')
175
+ except HTTPClientError as ex:
176
+ assert 'timed out' in ex.args[0]
177
+ else:
178
+ assert False, 'HTTPClientError expected'
179
+ duration1 = time.time() - start
180
+
181
+ with mock_httpd(TESTSERVER_ADDRESS, [test_req]):
182
+ try:
183
+ start = time.time()
184
+ client2.open(TESTSERVER_URL + '/')
185
+ except HTTPClientError as ex:
186
+ assert 'timed out' in ex.args[0]
187
+ else:
188
+ assert False, 'HTTPClientError expected'
189
+ duration2 = time.time() - start
190
+
191
+ # check individual timeouts
192
+ assert 0.1 <= duration1 < 0.5, duration1
193
+ assert 0.5 <= duration2 < 0.9, duration2
194
+
195
+ def test_manage_cookies_off(self):
196
+ """
197
+ Test the behavior when manage_cookies is off (the default). Cookies shouldn't be sent
198
+ """
199
+ self.client = HTTPClient()
200
+
201
+ def assert_no_cookie(req_handler):
202
+ return 'Cookie' not in req_handler.headers
203
+
204
+ test_requests = [
205
+ (
206
+ {'path': '/', 'req_assert_function': assert_no_cookie},
207
+ {'body': b'nothing', 'headers': {'Set-Cookie': "testcookie=42"}}
208
+ ),
209
+ (
210
+ {'path': '/', 'req_assert_function': assert_no_cookie},
211
+ {'body': b'nothing'}
212
+ )
213
+ ]
214
+ with mock_httpd(TESTSERVER_ADDRESS, test_requests):
215
+ self.client.open(TESTSERVER_URL + '/')
216
+ self.client.open(TESTSERVER_URL + '/')
217
+
218
+ def test_manage_cookies_on(self):
219
+ """
220
+ Test behavior of manage_cookies=True. Once the remote server sends a cookie back, it should
221
+ be included in future requests
222
+ """
223
+ self.client = HTTPClient(manage_cookies=True)
224
+
225
+ def assert_no_cookie(req_handler):
226
+ return 'Cookie' not in req_handler.headers
227
+
228
+ def assert_cookie(req_handler):
229
+ assert 'Cookie' in req_handler.headers
230
+ cookie_name, cookie_val = req_handler.headers['Cookie'].split(';')[0].split('=')
231
+ assert cookie_name == 'testcookie'
232
+ assert cookie_val == '42'
233
+ return True
234
+
235
+ test_requests = [
236
+ (
237
+ {'path': '/', 'req_assert_function': assert_no_cookie},
238
+ {'body': b'nothing', 'headers': {'Set-Cookie': "testcookie=42"}}
239
+ ),
240
+ (
241
+ {'path': '/', 'req_assert_function': assert_cookie},
242
+ {'body': b'nothing'}
243
+ )
244
+ ]
245
+ with mock_httpd(TESTSERVER_ADDRESS, test_requests):
246
+ self.client.open(TESTSERVER_URL + '/')
247
+ self.client.open(TESTSERVER_URL + '/')
248
+
249
+
250
+ # root certificates for google.com, if no ca-certificates.cert
251
+ # file is found
252
+ GOOGLE_ROOT_CERT = b"""
253
+ -----BEGIN CERTIFICATE-----
254
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
255
+ MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
256
+ YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
257
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
258
+ R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
259
+ 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
260
+ fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
261
+ iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
262
+ 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
263
+ bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
264
+ MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
265
+ ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
266
+ uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
267
+ Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
268
+ tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
269
+ PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
270
+ hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
271
+ 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
272
+ -----END CERTIFICATE-----
273
+ -----BEGIN CERTIFICATE-----
274
+ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
275
+ A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
276
+ Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
277
+ MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
278
+ A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
279
+ hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
280
+ v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
281
+ eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
282
+ tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
283
+ C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
284
+ zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
285
+ mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
286
+ V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
287
+ bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
288
+ 3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
289
+ J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
290
+ 291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
291
+ ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
292
+ AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
293
+ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
294
+ -----END CERTIFICATE-----
295
+ -----BEGIN CERTIFICATE-----
296
+ MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
297
+ UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
298
+ dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
299
+ MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
300
+ dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
301
+ AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
302
+ BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
303
+ cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
304
+ AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
305
+ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
306
+ aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
307
+ ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
308
+ IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
309
+ MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
310
+ A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
311
+ 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
312
+ 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
313
+ -----END CERTIFICATE-----
314
+ """
315
+
316
+ class TestTileClient(object):
317
+ def test_tc_path(self):
318
+ template = TileURLTemplate(TESTSERVER_URL + '/%(tc_path)s.png')
319
+ client = TileClient(template)
320
+ with mock_httpd(TESTSERVER_ADDRESS, [({'path': '/09/000/000/005/000/000/013.png'},
321
+ {'body': b'tile',
322
+ 'headers': {'content-type': 'image/png'}})]):
323
+ resp = client.get_tile((5, 13, 9)).source.read()
324
+ assert resp == b'tile'
325
+
326
+ def test_quadkey(self):
327
+ template = TileURLTemplate(TESTSERVER_URL + '/key=%(quadkey)s&format=%(format)s')
328
+ client = TileClient(template)
329
+ with mock_httpd(TESTSERVER_ADDRESS, [({'path': '/key=000002303&format=png'},
330
+ {'body': b'tile',
331
+ 'headers': {'content-type': 'image/png'}})]):
332
+ resp = client.get_tile((5, 13, 9)).source.read()
333
+ assert resp == b'tile'
334
+ def test_xyz(self):
335
+ template = TileURLTemplate(TESTSERVER_URL + '/x=%(x)s&y=%(y)s&z=%(z)s&format=%(format)s')
336
+ client = TileClient(template)
337
+ with mock_httpd(TESTSERVER_ADDRESS, [({'path': '/x=5&y=13&z=9&format=png'},
338
+ {'body': b'tile',
339
+ 'headers': {'content-type': 'image/png'}})]):
340
+ resp = client.get_tile((5, 13, 9)).source.read()
341
+ assert resp == b'tile'
342
+
343
+ def test_arcgiscache_path(self):
344
+ template = TileURLTemplate(TESTSERVER_URL + '/%(arcgiscache_path)s.png')
345
+ client = TileClient(template)
346
+ with mock_httpd(TESTSERVER_ADDRESS, [({'path': '/L09/R0000000d/C00000005.png'},
347
+ {'body': b'tile',
348
+ 'headers': {'content-type': 'image/png'}})]):
349
+ resp = client.get_tile((5, 13, 9)).source.read()
350
+ assert resp == b'tile'
351
+
352
+ def test_bbox(self):
353
+ grid = tile_grid(4326)
354
+ template = TileURLTemplate(TESTSERVER_URL + '/service?BBOX=%(bbox)s')
355
+ client = TileClient(template, grid=grid)
356
+ with mock_httpd(TESTSERVER_ADDRESS, [({'path': '/service?BBOX=-180.00000000,0.00000000,-90.00000000,90.00000000'},
357
+ {'body': b'tile',
358
+ 'headers': {'content-type': 'image/png'}})]):
359
+ resp = client.get_tile((0, 1, 2)).source.read()
360
+ assert resp == b'tile'
361
+
362
+
363
+ class TestWMSClient(object):
364
+ def test_no_image(self, caplog):
365
+ try:
366
+ with mock_httpd(TESTSERVER_ADDRESS, [({'path': '/service?map=foo&layers=foo&transparent=true&bbox=-200000,-200000,200000,200000&width=512&height=512&srs=EPSG%3A900913&format=image%2Fpng&request=GetMap&version=1.1.1&service=WMS&styles='},
367
+ {'status': '200', 'body': b'x' * 1000,
368
+ 'headers': {'content-type': 'application/foo'},
369
+ })]):
370
+ req = WMS111MapRequest(url=TESTSERVER_URL + '/service?map=foo',
371
+ param={'layers':'foo', 'transparent': 'true'})
372
+ query = MapQuery((-200000, -200000, 200000, 200000), (512, 512), SRS(900913), 'png')
373
+ wms = WMSClient(req).retrieve(query, 'png')
374
+ except SourceError:
375
+ assert len(caplog.record_tuples) == 1
376
+ assert ("'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' [output truncated]"
377
+ in caplog.record_tuples[0][2])
378
+ else:
379
+ assert False, 'expected no image returned error'
380
+
381
+
382
+ class TestCombinedWMSClient(object):
383
+ def setup(self):
384
+ self.http = MockHTTPClient()
385
+ def test_combine(self):
386
+ req1 = WMS111MapRequest(url=TESTSERVER_URL + '/service?map=foo',
387
+ param={'layers':'foo', 'transparent': 'true'})
388
+ wms1 = WMSClient(req1, http_client=self.http)
389
+ req2 = WMS111MapRequest(url=TESTSERVER_URL + '/service?map=foo',
390
+ param={'layers':'bar', 'transparent': 'true'})
391
+ wms2 = WMSClient(req2, http_client=self.http)
392
+
393
+ req = MapQuery((-200000, -200000, 200000, 200000), (512, 512), SRS(900913), 'png')
394
+
395
+ combined = wms1.combined_client(wms2, req)
396
+ assert combined.request_template.params.layers == ['foo', 'bar']
397
+ assert combined.request_template.url == TESTSERVER_URL + '/service?map=foo'
398
+
399
+ def test_combine_different_url(self):
400
+ req1 = WMS111MapRequest(url=TESTSERVER_URL + '/service?map=bar',
401
+ param={'layers':'foo', 'transparent': 'true'})
402
+ wms1 = WMSClient(req1, http_client=self.http)
403
+ req2 = WMS111MapRequest(url=TESTSERVER_URL + '/service?map=foo',
404
+ param={'layers':'bar', 'transparent': 'true'})
405
+ wms2 = WMSClient(req2, http_client=self.http)
406
+
407
+ req = MapQuery((-200000, -200000, 200000, 200000), (512, 512), SRS(900913), 'png')
408
+
409
+ combined = wms1.combined_client(wms2, req)
410
+ assert combined is None
411
+
412
+ class TestWMSInfoClient(object):
413
+ def test_transform_fi_request_supported_srs(self):
414
+ req = WMS111FeatureInfoRequest(url=TESTSERVER_URL + '/service?map=foo', param={'layers':'foo'})
415
+ http = MockHTTPClient()
416
+ wms = WMSInfoClient(req, http_client=http, supported_srs=SupportedSRS([SRS(25832)]))
417
+ fi_req = InfoQuery((8, 50, 9, 51), (512, 512),
418
+ SRS(4326), (128, 64), 'text/plain')
419
+
420
+ wms.get_info(fi_req)
421
+
422
+ assert wms_query_eq(http.requested[0],
423
+ TESTSERVER_URL+'/service?map=foo&LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
424
+ '&REQUEST=GetFeatureInfo&SRS=EPSG%3A25832&info_format=text/plain'
425
+ '&query_layers=foo'
426
+ '&VERSION=1.1.1&WIDTH=512&HEIGHT=797&STYLES=&x=135&y=101'
427
+ '&BBOX=428333.552496,5538630.70275,500000.0,5650300.78652'), http.requested[0]
428
+
429
+ def test_transform_fi_request(self):
430
+ req = WMS111FeatureInfoRequest(url=TESTSERVER_URL + '/service?map=foo', param={'layers':'foo', 'srs': 'EPSG:25832'})
431
+ http = MockHTTPClient()
432
+ wms = WMSInfoClient(req, http_client=http)
433
+ fi_req = InfoQuery((8, 50, 9, 51), (512, 512),
434
+ SRS(4326), (128, 64), 'text/plain')
435
+
436
+ wms.get_info(fi_req)
437
+
438
+ assert wms_query_eq(http.requested[0],
439
+ TESTSERVER_URL+'/service?map=foo&LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
440
+ '&REQUEST=GetFeatureInfo&SRS=EPSG%3A25832&info_format=text/plain'
441
+ '&query_layers=foo'
442
+ '&VERSION=1.1.1&WIDTH=512&HEIGHT=797&STYLES=&x=135&y=101'
443
+ '&BBOX=428333.552496,5538630.70275,500000.0,5650300.78652'), http.requested[0]
444
+
445
+ class TestWMSMapRequest100(object):
446
+ def setup(self):
447
+ self.r = WMS100MapRequest(param=dict(layers='foo', version='1.1.1', request='GetMap'))
448
+ self.r.params = self.r.adapt_params_to_version()
449
+ def test_version(self):
450
+ assert self.r.params['WMTVER'] == '1.0.0'
451
+ assert 'VERSION' not in self.r.params
452
+ def test_service(self):
453
+ assert 'SERVICE' not in self.r.params
454
+ def test_request(self):
455
+ assert self.r.params['request'] == 'map'
456
+ def test_str(self):
457
+ assert_query_eq(str(self.r.params), 'layers=foo&styles=&request=map&wmtver=1.0.0')
458
+
459
+ class TestWMSMapRequest130(object):
460
+ def setup(self):
461
+ self.r = WMS130MapRequest(param=dict(layers='foo', WMTVER='1.0.0'))
462
+ self.r.params = self.r.adapt_params_to_version()
463
+ def test_version(self):
464
+ assert self.r.params['version'] == '1.3.0'
465
+ assert 'WMTVER' not in self.r.params
466
+ def test_service(self):
467
+ assert self.r.params['service'] == 'WMS'
468
+ def test_request(self):
469
+ assert self.r.params['request'] == 'GetMap'
470
+ def test_str(self):
471
+ query_eq(str(self.r.params), 'layers=foo&styles=&service=WMS&request=GetMap&version=1.3.0')
472
+
473
+ class TestWMSMapRequest111(object):
474
+ def setup(self):
475
+ self.r = WMS111MapRequest(param=dict(layers='foo', WMTVER='1.0.0'))
476
+ self.r.params = self.r.adapt_params_to_version()
477
+ def test_version(self):
478
+ assert self.r.params['version'] == '1.1.1'
479
+ assert 'WMTVER' not in self.r.params
@@ -0,0 +1,73 @@
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 io import BytesIO
17
+
18
+ from mapproxy.client.arcgis import ArcGISInfoClient
19
+ from mapproxy.layer import InfoQuery
20
+ from mapproxy.request.arcgis import ArcGISIdentifyRequest
21
+ from mapproxy.srs import SRS, SupportedSRS
22
+ from mapproxy.test.http import assert_query_eq
23
+
24
+
25
+ TESTSERVER_ADDRESS = ('127.0.0.1', 56413)
26
+ TESTSERVER_URL = 'http://%s:%s' % TESTSERVER_ADDRESS
27
+
28
+
29
+ class MockHTTPClient(object):
30
+ def __init__(self):
31
+ self.requested = []
32
+
33
+ def open(self, url, data=None):
34
+ self.requested.append(url)
35
+ result = BytesIO(b'{}')
36
+ result.seek(0)
37
+ result.headers = {}
38
+ return result
39
+
40
+ class TestArcGISInfoClient(object):
41
+ def test_fi_request(self):
42
+ req = ArcGISIdentifyRequest(url=TESTSERVER_URL + '/MapServer/export?map=foo', param={'layers':'foo'})
43
+ http = MockHTTPClient()
44
+ wms = ArcGISInfoClient(req, http_client=http, supported_srs=SupportedSRS([SRS(4326)]))
45
+ fi_req = InfoQuery((8, 50, 9, 51), (512, 512),
46
+ SRS(4326), (128, 64), 'text/plain')
47
+
48
+ wms.get_info(fi_req)
49
+
50
+ assert_query_eq(http.requested[0],
51
+ TESTSERVER_URL+'/MapServer/identify?map=foo'
52
+ '&imageDisplay=512,512,96&sr=4326&f=json'
53
+ '&layers=foo&tolerance=5&returnGeometry=false'
54
+ '&geometryType=esriGeometryPoint&geometry=8.250000,50.875000'
55
+ '&mapExtent=8,50,9,51',
56
+ fuzzy_number_compare=True)
57
+
58
+ def test_transform_fi_request_supported_srs(self):
59
+ req = ArcGISIdentifyRequest(url=TESTSERVER_URL + '/MapServer/export?map=foo', param={'layers':'foo'})
60
+ http = MockHTTPClient()
61
+ wms = ArcGISInfoClient(req, http_client=http, supported_srs=SupportedSRS([SRS(25832)]))
62
+ fi_req = InfoQuery((8, 50, 9, 51), (512, 512),
63
+ SRS(4326), (128, 64), 'text/plain')
64
+
65
+ wms.get_info(fi_req)
66
+
67
+ assert_query_eq(http.requested[0],
68
+ TESTSERVER_URL+'/MapServer/identify?map=foo'
69
+ '&imageDisplay=512,797,96&sr=25832&f=json'
70
+ '&layers=foo&tolerance=5&returnGeometry=false'
71
+ '&geometryType=esriGeometryPoint&geometry=447229.979084,5636149.370634'
72
+ '&mapExtent=428333.552496,5538630.70275,500000.0,5650300.78652',
73
+ fuzzy_number_compare=True)