catocli 2.0.5__py3-none-any.whl → 2.1.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.

Potentially problematic release.


This version of catocli might be problematic. Click here for more details.

Files changed (365) hide show
  1. catocli/Utils/clidriver.py +32 -4
  2. catocli/Utils/version_checker.py +1 -1
  3. catocli/__init__.py +1 -1
  4. catocli/parsers/custom/export_sites/export_sites.py +18 -1
  5. catocli/parsers/custom/import_rules_to_tf/import_rules_to_tf.py +13 -2
  6. catocli/parsers/custom/import_sites_to_tf/__init__.py +3 -1
  7. catocli/parsers/custom/import_sites_to_tf/import_sites_to_tf.py +79 -6
  8. catocli/parsers/custom_private/__init__.py +134 -0
  9. catocli/parsers/mutation_accountManagement/__init__.py +13 -0
  10. catocli/parsers/mutation_accountManagement_disableAccount/README.md +16 -0
  11. catocli/parsers/mutation_groups/README.md +7 -0
  12. catocli/parsers/mutation_groups/__init__.py +48 -0
  13. catocli/parsers/mutation_groups_createGroup/README.md +18 -0
  14. catocli/parsers/mutation_groups_deleteGroup/README.md +18 -0
  15. catocli/parsers/mutation_groups_updateGroup/README.md +18 -0
  16. catocli/parsers/mutation_site/__init__.py +104 -0
  17. catocli/parsers/mutation_site_assignSiteBwLicense/README.md +17 -0
  18. catocli/parsers/mutation_site_removeSecondaryAwsVSocket/README.md +17 -0
  19. catocli/parsers/mutation_site_removeSecondaryAzureVSocket/README.md +17 -0
  20. catocli/parsers/mutation_site_removeSiteBwLicense/README.md +17 -0
  21. catocli/parsers/mutation_site_replaceSiteBwLicense/README.md +17 -0
  22. catocli/parsers/mutation_site_updateSecondaryAwsVSocket/README.md +17 -0
  23. catocli/parsers/mutation_site_updateSecondaryAzureVSocket/README.md +17 -0
  24. catocli/parsers/mutation_site_updateSiteBwLicense/README.md +17 -0
  25. catocli/parsers/mutation_site_updateSiteGeneralDetails/README.md +1 -1
  26. catocli/parsers/mutation_sites/__init__.py +104 -0
  27. catocli/parsers/mutation_sites_assignSiteBwLicense/README.md +17 -0
  28. catocli/parsers/mutation_sites_removeSecondaryAwsVSocket/README.md +17 -0
  29. catocli/parsers/mutation_sites_removeSecondaryAzureVSocket/README.md +17 -0
  30. catocli/parsers/mutation_sites_removeSiteBwLicense/README.md +17 -0
  31. catocli/parsers/mutation_sites_replaceSiteBwLicense/README.md +17 -0
  32. catocli/parsers/mutation_sites_updateSecondaryAwsVSocket/README.md +17 -0
  33. catocli/parsers/mutation_sites_updateSecondaryAzureVSocket/README.md +17 -0
  34. catocli/parsers/mutation_sites_updateSiteBwLicense/README.md +17 -0
  35. catocli/parsers/mutation_sites_updateSiteGeneralDetails/README.md +1 -1
  36. catocli/parsers/parserApiClient.py +444 -9
  37. catocli/parsers/query_eventsFeed/README.md +1 -1
  38. catocli/parsers/query_groups/README.md +7 -0
  39. catocli/parsers/query_groups/__init__.py +54 -0
  40. catocli/parsers/query_groups_group/README.md +7 -0
  41. catocli/parsers/query_groups_groupList/README.md +18 -0
  42. catocli/parsers/query_groups_group_members/README.md +18 -0
  43. catocli/parsers/query_groups_whereUsed/README.md +17 -0
  44. catocli/parsers/query_popLocations/README.md +17 -0
  45. catocli/parsers/query_popLocations/__init__.py +16 -0
  46. catocli/parsers/query_site/__init__.py +26 -0
  47. catocli/parsers/query_site_secondaryAwsVSocket/README.md +17 -0
  48. catocli/parsers/query_site_secondaryAzureVSocket/README.md +17 -0
  49. catocli/parsers/query_socketPortMetrics/README.md +23 -0
  50. catocli/parsers/query_socketPortMetrics/__init__.py +16 -0
  51. catocli/parsers/query_socketPortMetricsTimeSeries/README.md +24 -0
  52. catocli/parsers/query_socketPortMetricsTimeSeries/__init__.py +16 -0
  53. {catocli-2.0.5.dist-info → catocli-2.1.1.dist-info}/METADATA +3 -2
  54. {catocli-2.0.5.dist-info → catocli-2.1.1.dist-info}/RECORD +253 -300
  55. {catocli-2.0.5.dist-info → catocli-2.1.1.dist-info}/WHEEL +1 -1
  56. {catocli-2.0.5.dist-info → catocli-2.1.1.dist-info}/top_level.txt +0 -2
  57. graphql_client/api/call_api.py +20 -2
  58. models/mutation.accountManagement.addAccount.json +97 -0
  59. models/mutation.accountManagement.disableAccount.json +545 -0
  60. models/mutation.accountManagement.removeAccount.json +102 -3
  61. models/mutation.accountManagement.updateAccount.json +97 -0
  62. models/mutation.admin.addAdmin.json +6 -9
  63. models/mutation.container.delete.json +2 -2
  64. models/mutation.container.fqdn.addValues.json +3 -3
  65. models/mutation.container.fqdn.createFromFile.json +3 -3
  66. models/mutation.container.fqdn.removeValues.json +3 -3
  67. models/mutation.container.fqdn.updateFromFile.json +3 -3
  68. models/mutation.container.ipAddressRange.addValues.json +3 -3
  69. models/mutation.container.ipAddressRange.createFromFile.json +3 -3
  70. models/mutation.container.ipAddressRange.removeValues.json +3 -3
  71. models/mutation.container.ipAddressRange.updateFromFile.json +3 -3
  72. models/mutation.groups.createGroup.json +3178 -0
  73. models/mutation.groups.deleteGroup.json +2758 -0
  74. models/mutation.groups.updateGroup.json +4429 -0
  75. models/mutation.hardware.updateHardwareShipping.json +30 -10
  76. models/mutation.policy.appTenantRestriction.addRule.json +33 -33
  77. models/mutation.policy.appTenantRestriction.addSection.json +4 -4
  78. models/mutation.policy.appTenantRestriction.createPolicyRevision.json +33 -33
  79. models/mutation.policy.appTenantRestriction.discardPolicyRevision.json +33 -33
  80. models/mutation.policy.appTenantRestriction.moveRule.json +27 -27
  81. models/mutation.policy.appTenantRestriction.moveSection.json +4 -4
  82. models/mutation.policy.appTenantRestriction.publishPolicyRevision.json +33 -33
  83. models/mutation.policy.appTenantRestriction.removeRule.json +27 -27
  84. models/mutation.policy.appTenantRestriction.removeSection.json +4 -4
  85. models/mutation.policy.appTenantRestriction.updatePolicy.json +33 -33
  86. models/mutation.policy.appTenantRestriction.updateRule.json +33 -33
  87. models/mutation.policy.appTenantRestriction.updateSection.json +4 -4
  88. models/mutation.policy.dynamicIpAllocation.addRule.json +12 -12
  89. models/mutation.policy.dynamicIpAllocation.addSection.json +4 -4
  90. models/mutation.policy.dynamicIpAllocation.createPolicyRevision.json +18 -18
  91. models/mutation.policy.dynamicIpAllocation.discardPolicyRevision.json +18 -18
  92. models/mutation.policy.dynamicIpAllocation.moveRule.json +12 -12
  93. models/mutation.policy.dynamicIpAllocation.moveSection.json +4 -4
  94. models/mutation.policy.dynamicIpAllocation.publishPolicyRevision.json +18 -18
  95. models/mutation.policy.dynamicIpAllocation.removeRule.json +12 -12
  96. models/mutation.policy.dynamicIpAllocation.removeSection.json +4 -4
  97. models/mutation.policy.dynamicIpAllocation.updatePolicy.json +18 -18
  98. models/mutation.policy.dynamicIpAllocation.updateRule.json +12 -12
  99. models/mutation.policy.dynamicIpAllocation.updateSection.json +4 -4
  100. models/mutation.policy.internetFirewall.addRule.json +141 -141
  101. models/mutation.policy.internetFirewall.addSection.json +4 -4
  102. models/mutation.policy.internetFirewall.createPolicyRevision.json +102 -102
  103. models/mutation.policy.internetFirewall.discardPolicyRevision.json +102 -102
  104. models/mutation.policy.internetFirewall.moveRule.json +96 -96
  105. models/mutation.policy.internetFirewall.moveSection.json +4 -4
  106. models/mutation.policy.internetFirewall.publishPolicyRevision.json +102 -102
  107. models/mutation.policy.internetFirewall.removeRule.json +96 -96
  108. models/mutation.policy.internetFirewall.removeSection.json +4 -4
  109. models/mutation.policy.internetFirewall.updatePolicy.json +102 -102
  110. models/mutation.policy.internetFirewall.updateRule.json +141 -141
  111. models/mutation.policy.internetFirewall.updateSection.json +4 -4
  112. models/mutation.policy.remotePortFwd.addRule.json +21 -21
  113. models/mutation.policy.remotePortFwd.addSection.json +4 -4
  114. models/mutation.policy.remotePortFwd.createPolicyRevision.json +24 -24
  115. models/mutation.policy.remotePortFwd.discardPolicyRevision.json +24 -24
  116. models/mutation.policy.remotePortFwd.moveRule.json +18 -18
  117. models/mutation.policy.remotePortFwd.moveSection.json +4 -4
  118. models/mutation.policy.remotePortFwd.publishPolicyRevision.json +24 -24
  119. models/mutation.policy.remotePortFwd.removeRule.json +18 -18
  120. models/mutation.policy.remotePortFwd.removeSection.json +4 -4
  121. models/mutation.policy.remotePortFwd.updatePolicy.json +24 -24
  122. models/mutation.policy.remotePortFwd.updateRule.json +21 -21
  123. models/mutation.policy.remotePortFwd.updateSection.json +4 -4
  124. models/mutation.policy.socketLan.addRule.json +97 -97
  125. models/mutation.policy.socketLan.addSection.json +4 -4
  126. models/mutation.policy.socketLan.createPolicyRevision.json +91 -91
  127. models/mutation.policy.socketLan.discardPolicyRevision.json +91 -91
  128. models/mutation.policy.socketLan.moveRule.json +85 -85
  129. models/mutation.policy.socketLan.moveSection.json +4 -4
  130. models/mutation.policy.socketLan.publishPolicyRevision.json +91 -91
  131. models/mutation.policy.socketLan.removeRule.json +85 -85
  132. models/mutation.policy.socketLan.removeSection.json +4 -4
  133. models/mutation.policy.socketLan.updatePolicy.json +91 -91
  134. models/mutation.policy.socketLan.updateRule.json +97 -97
  135. models/mutation.policy.socketLan.updateSection.json +4 -4
  136. models/mutation.policy.terminalServer.addRule.json +7 -7
  137. models/mutation.policy.terminalServer.addSection.json +4 -4
  138. models/mutation.policy.terminalServer.createPolicyRevision.json +13 -13
  139. models/mutation.policy.terminalServer.discardPolicyRevision.json +13 -13
  140. models/mutation.policy.terminalServer.moveRule.json +7 -7
  141. models/mutation.policy.terminalServer.moveSection.json +4 -4
  142. models/mutation.policy.terminalServer.publishPolicyRevision.json +13 -13
  143. models/mutation.policy.terminalServer.removeRule.json +7 -7
  144. models/mutation.policy.terminalServer.removeSection.json +4 -4
  145. models/mutation.policy.terminalServer.updatePolicy.json +13 -13
  146. models/mutation.policy.terminalServer.updateRule.json +7 -7
  147. models/mutation.policy.terminalServer.updateSection.json +4 -4
  148. models/mutation.policy.wanFirewall.addRule.json +157 -157
  149. models/mutation.policy.wanFirewall.addSection.json +4 -4
  150. models/mutation.policy.wanFirewall.createPolicyRevision.json +121 -121
  151. models/mutation.policy.wanFirewall.discardPolicyRevision.json +121 -121
  152. models/mutation.policy.wanFirewall.moveRule.json +115 -115
  153. models/mutation.policy.wanFirewall.moveSection.json +4 -4
  154. models/mutation.policy.wanFirewall.publishPolicyRevision.json +121 -121
  155. models/mutation.policy.wanFirewall.removeRule.json +115 -115
  156. models/mutation.policy.wanFirewall.removeSection.json +4 -4
  157. models/mutation.policy.wanFirewall.updatePolicy.json +121 -121
  158. models/mutation.policy.wanFirewall.updateRule.json +157 -157
  159. models/mutation.policy.wanFirewall.updateSection.json +4 -4
  160. models/mutation.policy.wanNetwork.addRule.json +103 -103
  161. models/mutation.policy.wanNetwork.addSection.json +4 -4
  162. models/mutation.policy.wanNetwork.createPolicyRevision.json +97 -97
  163. models/mutation.policy.wanNetwork.discardPolicyRevision.json +97 -97
  164. models/mutation.policy.wanNetwork.moveRule.json +91 -91
  165. models/mutation.policy.wanNetwork.moveSection.json +4 -4
  166. models/mutation.policy.wanNetwork.publishPolicyRevision.json +97 -97
  167. models/mutation.policy.wanNetwork.removeRule.json +91 -91
  168. models/mutation.policy.wanNetwork.removeSection.json +4 -4
  169. models/mutation.policy.wanNetwork.updatePolicy.json +97 -97
  170. models/mutation.policy.wanNetwork.updateRule.json +103 -103
  171. models/mutation.policy.wanNetwork.updateSection.json +4 -4
  172. models/mutation.site.addBgpPeer.json +10 -10
  173. models/mutation.site.addIpsecIkeV2SiteTunnels.json +2 -2
  174. models/mutation.site.addSocketAddOnCard.json +2 -2
  175. models/mutation.site.assignSiteBwLicense.json +12879 -0
  176. models/mutation.site.removeBgpPeer.json +10 -10
  177. models/mutation.site.removeIpsecIkeV2SiteTunnels.json +2 -2
  178. models/mutation.site.removeSecondaryAwsVSocket.json +375 -0
  179. models/mutation.site.removeSecondaryAzureVSocket.json +354 -0
  180. models/mutation.site.removeSiteBwLicense.json +12822 -0
  181. models/mutation.site.removeSocketAddOnCard.json +2 -2
  182. models/mutation.site.replaceSiteBwLicense.json +12939 -0
  183. models/mutation.site.startSiteUpgrade.json +36 -15
  184. models/mutation.site.updateBgpPeer.json +10 -10
  185. models/mutation.site.updateIpsecIkeV2SiteTunnels.json +2 -2
  186. models/mutation.site.updateSecondaryAwsVSocket.json +643 -0
  187. models/mutation.site.updateSecondaryAzureVSocket.json +565 -0
  188. models/mutation.site.updateSiteBwLicense.json +12882 -0
  189. models/mutation.site.updateSiteGeneralDetails.json +724 -1
  190. models/mutation.sites.addBgpPeer.json +10 -10
  191. models/mutation.sites.addIpsecIkeV2SiteTunnels.json +2 -2
  192. models/mutation.sites.addSocketAddOnCard.json +2 -2
  193. models/mutation.sites.assignSiteBwLicense.json +12879 -0
  194. models/mutation.sites.removeBgpPeer.json +10 -10
  195. models/mutation.sites.removeIpsecIkeV2SiteTunnels.json +2 -2
  196. models/mutation.sites.removeSecondaryAwsVSocket.json +375 -0
  197. models/mutation.sites.removeSecondaryAzureVSocket.json +354 -0
  198. models/mutation.sites.removeSiteBwLicense.json +12822 -0
  199. models/mutation.sites.removeSocketAddOnCard.json +2 -2
  200. models/mutation.sites.replaceSiteBwLicense.json +12939 -0
  201. models/mutation.sites.startSiteUpgrade.json +36 -15
  202. models/mutation.sites.updateBgpPeer.json +10 -10
  203. models/mutation.sites.updateIpsecIkeV2SiteTunnels.json +2 -2
  204. models/mutation.sites.updateSecondaryAwsVSocket.json +643 -0
  205. models/mutation.sites.updateSecondaryAzureVSocket.json +565 -0
  206. models/mutation.sites.updateSiteBwLicense.json +12882 -0
  207. models/mutation.sites.updateSiteGeneralDetails.json +724 -1
  208. models/mutation.xdr.addStoryComment.json +1 -1
  209. models/mutation.xdr.analystFeedback.json +84 -84
  210. models/mutation.xdr.deleteStoryComment.json +1 -1
  211. models/query.accountManagement.json +97 -0
  212. models/query.accountMetrics.json +45 -45
  213. models/query.accountSnapshot.json +30 -30
  214. models/query.admin.json +6 -6
  215. models/query.admins.json +13 -13
  216. models/query.appStats.json +915 -867
  217. models/query.appStatsTimeSeries.json +692 -656
  218. models/query.auditFeed.json +6 -6
  219. models/query.catalogs.json +52 -52
  220. models/query.container.json +16 -16
  221. models/query.devices.json +20 -93
  222. models/query.entityLookup.json +2 -2
  223. models/query.events.json +288 -384
  224. models/query.eventsFeed.json +73 -97
  225. models/query.eventsTimeSeries.json +219 -291
  226. models/query.groups.group.members.json +3058 -0
  227. models/query.groups.groupList.json +6474 -0
  228. models/query.groups.whereUsed.json +697 -0
  229. models/query.hardware.json +27 -7
  230. models/query.hardwareManagement.json +8 -8
  231. models/query.licensing.json +3487 -1324
  232. models/query.policy.appTenantRestriction.policy.json +32 -32
  233. models/query.policy.dynamicIpAllocation.policy.json +18 -18
  234. models/query.policy.internetFirewall.policy.json +93 -93
  235. models/query.policy.remotePortFwd.policy.json +23 -23
  236. models/query.policy.socketLan.policy.json +88 -88
  237. models/query.policy.terminalServer.policy.json +13 -13
  238. models/query.policy.wanFirewall.policy.json +111 -111
  239. models/query.policy.wanNetwork.policy.json +97 -97
  240. models/query.popLocations.json +2878 -0
  241. models/query.sandbox.json +5 -5
  242. models/query.site.bgpPeer.json +4 -4
  243. models/query.site.bgpPeerList.json +10 -10
  244. models/query.site.secondaryAwsVSocket.json +340 -0
  245. models/query.site.secondaryAzureVSocket.json +319 -0
  246. models/query.site.siteBgpStatus.json +2 -2
  247. models/query.socketPortMetrics.json +2410 -0
  248. models/query.socketPortMetricsTimeSeries.json +2361 -0
  249. models/query.xdr.stories.json +104 -104
  250. models/query.xdr.story.json +93 -93
  251. schema/catolib.py +43 -16
  252. build/lib/catocli/Utils/clidriver.py +0 -268
  253. build/lib/catocli/Utils/profile_manager.py +0 -188
  254. build/lib/catocli/Utils/version_checker.py +0 -192
  255. build/lib/catocli/__init__.py +0 -2
  256. build/lib/catocli/__main__.py +0 -12
  257. build/lib/catocli/parsers/configure/__init__.py +0 -115
  258. build/lib/catocli/parsers/configure/configure.py +0 -307
  259. build/lib/catocli/parsers/custom/__init__.py +0 -57
  260. build/lib/catocli/parsers/custom/customLib.py +0 -561
  261. build/lib/catocli/parsers/custom/export_rules/__init__.py +0 -42
  262. build/lib/catocli/parsers/custom/export_rules/export_rules.py +0 -234
  263. build/lib/catocli/parsers/custom/export_sites/__init__.py +0 -21
  264. build/lib/catocli/parsers/custom/export_sites/export_sites.py +0 -372
  265. build/lib/catocli/parsers/custom/import_rules_to_tf/__init__.py +0 -58
  266. build/lib/catocli/parsers/custom/import_rules_to_tf/import_rules_to_tf.py +0 -451
  267. build/lib/catocli/parsers/custom/import_sites_to_tf/__init__.py +0 -45
  268. build/lib/catocli/parsers/custom/import_sites_to_tf/import_sites_to_tf.py +0 -891
  269. build/lib/catocli/parsers/mutation_accountManagement/__init__.py +0 -48
  270. build/lib/catocli/parsers/mutation_admin/__init__.py +0 -48
  271. build/lib/catocli/parsers/mutation_container/__init__.py +0 -138
  272. build/lib/catocli/parsers/mutation_hardware/__init__.py +0 -22
  273. build/lib/catocli/parsers/mutation_policy/__init__.py +0 -1305
  274. build/lib/catocli/parsers/mutation_sandbox/__init__.py +0 -35
  275. build/lib/catocli/parsers/mutation_site/__init__.py +0 -373
  276. build/lib/catocli/parsers/mutation_sites/__init__.py +0 -373
  277. build/lib/catocli/parsers/mutation_xdr/__init__.py +0 -48
  278. build/lib/catocli/parsers/parserApiClient.py +0 -513
  279. build/lib/catocli/parsers/query_accountBySubdomain/__init__.py +0 -16
  280. build/lib/catocli/parsers/query_accountManagement/__init__.py +0 -16
  281. build/lib/catocli/parsers/query_accountMetrics/__init__.py +0 -16
  282. build/lib/catocli/parsers/query_accountRoles/__init__.py +0 -16
  283. build/lib/catocli/parsers/query_accountSnapshot/__init__.py +0 -16
  284. build/lib/catocli/parsers/query_admin/__init__.py +0 -16
  285. build/lib/catocli/parsers/query_admins/__init__.py +0 -16
  286. build/lib/catocli/parsers/query_appStats/__init__.py +0 -16
  287. build/lib/catocli/parsers/query_appStatsTimeSeries/__init__.py +0 -16
  288. build/lib/catocli/parsers/query_auditFeed/__init__.py +0 -16
  289. build/lib/catocli/parsers/query_catalogs/__init__.py +0 -16
  290. build/lib/catocli/parsers/query_container/__init__.py +0 -16
  291. build/lib/catocli/parsers/query_devices/__init__.py +0 -16
  292. build/lib/catocli/parsers/query_entityLookup/__init__.py +0 -16
  293. build/lib/catocli/parsers/query_events/__init__.py +0 -16
  294. build/lib/catocli/parsers/query_eventsFeed/__init__.py +0 -16
  295. build/lib/catocli/parsers/query_eventsTimeSeries/__init__.py +0 -16
  296. build/lib/catocli/parsers/query_hardware/__init__.py +0 -16
  297. build/lib/catocli/parsers/query_hardwareManagement/__init__.py +0 -16
  298. build/lib/catocli/parsers/query_licensing/__init__.py +0 -16
  299. build/lib/catocli/parsers/query_policy/__init__.py +0 -161
  300. build/lib/catocli/parsers/query_sandbox/__init__.py +0 -16
  301. build/lib/catocli/parsers/query_site/__init__.py +0 -100
  302. build/lib/catocli/parsers/query_siteLocation/__init__.py +0 -13
  303. build/lib/catocli/parsers/query_subDomains/__init__.py +0 -16
  304. build/lib/catocli/parsers/query_xdr/__init__.py +0 -35
  305. build/lib/catocli/parsers/raw/__init__.py +0 -12
  306. build/lib/graphql_client/__init__.py +0 -11
  307. build/lib/graphql_client/api/__init__.py +0 -3
  308. build/lib/graphql_client/api/call_api.py +0 -84
  309. build/lib/graphql_client/api_client.py +0 -192
  310. build/lib/graphql_client/api_client_types.py +0 -409
  311. build/lib/graphql_client/configuration.py +0 -232
  312. build/lib/graphql_client/models/__init__.py +0 -13
  313. build/lib/graphql_client/models/no_schema.py +0 -71
  314. build/lib/schema/catolib.py +0 -1141
  315. build/lib/schema/importSchema.py +0 -60
  316. build/lib/schema/remove_policyid.py +0 -89
  317. build/lib/schema/remove_policyid_mutations.py +0 -89
  318. build/lib/scripts/catolib.py +0 -62
  319. build/lib/scripts/export_if_rules_to_json.py +0 -188
  320. build/lib/scripts/export_wf_rules_to_json.py +0 -111
  321. build/lib/scripts/import_wf_rules_to_tfstate.py +0 -331
  322. build/lib/vendor/certifi/__init__.py +0 -4
  323. build/lib/vendor/certifi/__main__.py +0 -12
  324. build/lib/vendor/certifi/core.py +0 -114
  325. build/lib/vendor/certifi/py.typed +0 -0
  326. build/lib/vendor/six.py +0 -998
  327. build/lib/vendor/urllib3/__init__.py +0 -211
  328. build/lib/vendor/urllib3/_base_connection.py +0 -172
  329. build/lib/vendor/urllib3/_collections.py +0 -483
  330. build/lib/vendor/urllib3/_request_methods.py +0 -278
  331. build/lib/vendor/urllib3/_version.py +0 -16
  332. build/lib/vendor/urllib3/connection.py +0 -1033
  333. build/lib/vendor/urllib3/connectionpool.py +0 -1182
  334. build/lib/vendor/urllib3/contrib/__init__.py +0 -0
  335. build/lib/vendor/urllib3/contrib/emscripten/__init__.py +0 -18
  336. build/lib/vendor/urllib3/contrib/emscripten/connection.py +0 -254
  337. build/lib/vendor/urllib3/contrib/emscripten/fetch.py +0 -418
  338. build/lib/vendor/urllib3/contrib/emscripten/request.py +0 -22
  339. build/lib/vendor/urllib3/contrib/emscripten/response.py +0 -285
  340. build/lib/vendor/urllib3/contrib/pyopenssl.py +0 -552
  341. build/lib/vendor/urllib3/contrib/socks.py +0 -228
  342. build/lib/vendor/urllib3/exceptions.py +0 -321
  343. build/lib/vendor/urllib3/fields.py +0 -341
  344. build/lib/vendor/urllib3/filepost.py +0 -89
  345. build/lib/vendor/urllib3/http2/__init__.py +0 -53
  346. build/lib/vendor/urllib3/http2/connection.py +0 -356
  347. build/lib/vendor/urllib3/http2/probe.py +0 -87
  348. build/lib/vendor/urllib3/poolmanager.py +0 -637
  349. build/lib/vendor/urllib3/py.typed +0 -2
  350. build/lib/vendor/urllib3/response.py +0 -1265
  351. build/lib/vendor/urllib3/util/__init__.py +0 -42
  352. build/lib/vendor/urllib3/util/connection.py +0 -137
  353. build/lib/vendor/urllib3/util/proxy.py +0 -43
  354. build/lib/vendor/urllib3/util/request.py +0 -256
  355. build/lib/vendor/urllib3/util/response.py +0 -101
  356. build/lib/vendor/urllib3/util/retry.py +0 -533
  357. build/lib/vendor/urllib3/util/ssl_.py +0 -513
  358. build/lib/vendor/urllib3/util/ssl_match_hostname.py +0 -159
  359. build/lib/vendor/urllib3/util/ssltransport.py +0 -276
  360. build/lib/vendor/urllib3/util/timeout.py +0 -275
  361. build/lib/vendor/urllib3/util/url.py +0 -471
  362. build/lib/vendor/urllib3/util/util.py +0 -42
  363. build/lib/vendor/urllib3/util/wait.py +0 -124
  364. {catocli-2.0.5.dist-info → catocli-2.1.1.dist-info}/entry_points.txt +0 -0
  365. {catocli-2.0.5.dist-info → catocli-2.1.1.dist-info/licenses}/LICENSE +0 -0
File without changes
@@ -1,18 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import sys
4
- sys.path.insert(0, 'vendor')
5
- import urllib3.connection
6
-
7
- from ...connectionpool import HTTPConnectionPool, HTTPSConnectionPool
8
- from .connection import EmscriptenHTTPConnection, EmscriptenHTTPSConnection
9
-
10
-
11
- def inject_into_urllib3() -> None:
12
- # override connection classes to use emscripten specific classes
13
- # n.b. mypy complains about the overriding of classes below
14
- # if it isn't ignored
15
- HTTPConnectionPool.ConnectionCls = EmscriptenHTTPConnection
16
- HTTPSConnectionPool.ConnectionCls = EmscriptenHTTPSConnection
17
- urllib3.connection.HTTPConnection = EmscriptenHTTPConnection # type: ignore[misc,assignment]
18
- urllib3.connection.HTTPSConnection = EmscriptenHTTPSConnection # type: ignore[misc,assignment]
@@ -1,254 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import os
4
- import typing
5
-
6
- # use http.client.HTTPException for consistency with non-emscripten
7
- from http.client import HTTPException as HTTPException # noqa: F401
8
- from http.client import ResponseNotReady
9
-
10
- from ..._base_connection import _TYPE_BODY
11
- from ...connection import HTTPConnection, ProxyConfig, port_by_scheme
12
- from ...exceptions import TimeoutError
13
- from ...response import BaseHTTPResponse
14
- from ...util.connection import _TYPE_SOCKET_OPTIONS
15
- from ...util.timeout import _DEFAULT_TIMEOUT, _TYPE_TIMEOUT
16
- from ...util.url import Url
17
- from .fetch import _RequestError, _TimeoutError, send_request, send_streaming_request
18
- from .request import EmscriptenRequest
19
- from .response import EmscriptenHttpResponseWrapper, EmscriptenResponse
20
-
21
- if typing.TYPE_CHECKING:
22
- from ..._base_connection import BaseHTTPConnection, BaseHTTPSConnection
23
-
24
-
25
- class EmscriptenHTTPConnection:
26
- default_port: typing.ClassVar[int] = port_by_scheme["http"]
27
- default_socket_options: typing.ClassVar[_TYPE_SOCKET_OPTIONS]
28
-
29
- timeout: None | (float)
30
-
31
- host: str
32
- port: int
33
- blocksize: int
34
- source_address: tuple[str, int] | None
35
- socket_options: _TYPE_SOCKET_OPTIONS | None
36
-
37
- proxy: Url | None
38
- proxy_config: ProxyConfig | None
39
-
40
- is_verified: bool = False
41
- proxy_is_verified: bool | None = None
42
-
43
- _response: EmscriptenResponse | None
44
-
45
- def __init__(
46
- self,
47
- host: str,
48
- port: int = 0,
49
- *,
50
- timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
51
- source_address: tuple[str, int] | None = None,
52
- blocksize: int = 8192,
53
- socket_options: _TYPE_SOCKET_OPTIONS | None = None,
54
- proxy: Url | None = None,
55
- proxy_config: ProxyConfig | None = None,
56
- ) -> None:
57
- self.host = host
58
- self.port = port
59
- self.timeout = timeout if isinstance(timeout, float) else 0.0
60
- self.scheme = "http"
61
- self._closed = True
62
- self._response = None
63
- # ignore these things because we don't
64
- # have control over that stuff
65
- self.proxy = None
66
- self.proxy_config = None
67
- self.blocksize = blocksize
68
- self.source_address = None
69
- self.socket_options = None
70
- self.is_verified = False
71
-
72
- def set_tunnel(
73
- self,
74
- host: str,
75
- port: int | None = 0,
76
- headers: typing.Mapping[str, str] | None = None,
77
- scheme: str = "http",
78
- ) -> None:
79
- pass
80
-
81
- def connect(self) -> None:
82
- pass
83
-
84
- def request(
85
- self,
86
- method: str,
87
- url: str,
88
- body: _TYPE_BODY | None = None,
89
- headers: typing.Mapping[str, str] | None = None,
90
- # We know *at least* botocore is depending on the order of the
91
- # first 3 parameters so to be safe we only mark the later ones
92
- # as keyword-only to ensure we have space to extend.
93
- *,
94
- chunked: bool = False,
95
- preload_content: bool = True,
96
- decode_content: bool = True,
97
- enforce_content_length: bool = True,
98
- ) -> None:
99
- self._closed = False
100
- if url.startswith("/"):
101
- # no scheme / host / port included, make a full url
102
- url = f"{self.scheme}://{self.host}:{self.port}" + url
103
- request = EmscriptenRequest(
104
- url=url,
105
- method=method,
106
- timeout=self.timeout if self.timeout else 0,
107
- decode_content=decode_content,
108
- )
109
- request.set_body(body)
110
- if headers:
111
- for k, v in headers.items():
112
- request.set_header(k, v)
113
- self._response = None
114
- try:
115
- if not preload_content:
116
- self._response = send_streaming_request(request)
117
- if self._response is None:
118
- self._response = send_request(request)
119
- except _TimeoutError as e:
120
- raise TimeoutError(e.message) from e
121
- except _RequestError as e:
122
- raise HTTPException(e.message) from e
123
-
124
- def getresponse(self) -> BaseHTTPResponse:
125
- if self._response is not None:
126
- return EmscriptenHttpResponseWrapper(
127
- internal_response=self._response,
128
- url=self._response.request.url,
129
- connection=self,
130
- )
131
- else:
132
- raise ResponseNotReady()
133
-
134
- def close(self) -> None:
135
- self._closed = True
136
- self._response = None
137
-
138
- @property
139
- def is_closed(self) -> bool:
140
- """Whether the connection either is brand new or has been previously closed.
141
- If this property is True then both ``is_connected`` and ``has_connected_to_proxy``
142
- properties must be False.
143
- """
144
- return self._closed
145
-
146
- @property
147
- def is_connected(self) -> bool:
148
- """Whether the connection is actively connected to any origin (proxy or target)"""
149
- return True
150
-
151
- @property
152
- def has_connected_to_proxy(self) -> bool:
153
- """Whether the connection has successfully connected to its proxy.
154
- This returns False if no proxy is in use. Used to determine whether
155
- errors are coming from the proxy layer or from tunnelling to the target origin.
156
- """
157
- return False
158
-
159
-
160
- class EmscriptenHTTPSConnection(EmscriptenHTTPConnection):
161
- default_port = port_by_scheme["https"]
162
- # all this is basically ignored, as browser handles https
163
- cert_reqs: int | str | None = None
164
- ca_certs: str | None = None
165
- ca_cert_dir: str | None = None
166
- ca_cert_data: None | str | bytes = None
167
- cert_file: str | None
168
- key_file: str | None
169
- key_password: str | None
170
- ssl_context: typing.Any | None
171
- ssl_version: int | str | None = None
172
- ssl_minimum_version: int | None = None
173
- ssl_maximum_version: int | None = None
174
- assert_hostname: None | str | typing.Literal[False]
175
- assert_fingerprint: str | None = None
176
-
177
- def __init__(
178
- self,
179
- host: str,
180
- port: int = 0,
181
- *,
182
- timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
183
- source_address: tuple[str, int] | None = None,
184
- blocksize: int = 16384,
185
- socket_options: None
186
- | _TYPE_SOCKET_OPTIONS = HTTPConnection.default_socket_options,
187
- proxy: Url | None = None,
188
- proxy_config: ProxyConfig | None = None,
189
- cert_reqs: int | str | None = None,
190
- assert_hostname: None | str | typing.Literal[False] = None,
191
- assert_fingerprint: str | None = None,
192
- server_hostname: str | None = None,
193
- ssl_context: typing.Any | None = None,
194
- ca_certs: str | None = None,
195
- ca_cert_dir: str | None = None,
196
- ca_cert_data: None | str | bytes = None,
197
- ssl_minimum_version: int | None = None,
198
- ssl_maximum_version: int | None = None,
199
- ssl_version: int | str | None = None, # Deprecated
200
- cert_file: str | None = None,
201
- key_file: str | None = None,
202
- key_password: str | None = None,
203
- ) -> None:
204
- super().__init__(
205
- host,
206
- port=port,
207
- timeout=timeout,
208
- source_address=source_address,
209
- blocksize=blocksize,
210
- socket_options=socket_options,
211
- proxy=proxy,
212
- proxy_config=proxy_config,
213
- )
214
- self.scheme = "https"
215
-
216
- self.key_file = key_file
217
- self.cert_file = cert_file
218
- self.key_password = key_password
219
- self.ssl_context = ssl_context
220
- self.server_hostname = server_hostname
221
- self.assert_hostname = assert_hostname
222
- self.assert_fingerprint = assert_fingerprint
223
- self.ssl_version = ssl_version
224
- self.ssl_minimum_version = ssl_minimum_version
225
- self.ssl_maximum_version = ssl_maximum_version
226
- self.ca_certs = ca_certs and os.path.expanduser(ca_certs)
227
- self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir)
228
- self.ca_cert_data = ca_cert_data
229
-
230
- self.cert_reqs = None
231
-
232
- # The browser will automatically verify all requests.
233
- # We have no control over that setting.
234
- self.is_verified = True
235
-
236
- def set_cert(
237
- self,
238
- key_file: str | None = None,
239
- cert_file: str | None = None,
240
- cert_reqs: int | str | None = None,
241
- key_password: str | None = None,
242
- ca_certs: str | None = None,
243
- assert_hostname: None | str | typing.Literal[False] = None,
244
- assert_fingerprint: str | None = None,
245
- ca_cert_dir: str | None = None,
246
- ca_cert_data: None | str | bytes = None,
247
- ) -> None:
248
- pass
249
-
250
-
251
- # verify that this class implements BaseHTTP(s) connection correctly
252
- if typing.TYPE_CHECKING:
253
- _supports_http_protocol: BaseHTTPConnection = EmscriptenHTTPConnection("", 0)
254
- _supports_https_protocol: BaseHTTPSConnection = EmscriptenHTTPSConnection("", 0)
@@ -1,418 +0,0 @@
1
- """
2
- Support for streaming http requests in emscripten.
3
-
4
- A few caveats -
5
-
6
- Firstly, you can't do streaming http in the main UI thread, because atomics.wait isn't allowed.
7
- Streaming only works if you're running pyodide in a web worker.
8
-
9
- Secondly, this uses an extra web worker and SharedArrayBuffer to do the asynchronous fetch
10
- operation, so it requires that you have crossOriginIsolation enabled, by serving over https
11
- (or from localhost) with the two headers below set:
12
-
13
- Cross-Origin-Opener-Policy: same-origin
14
- Cross-Origin-Embedder-Policy: require-corp
15
-
16
- You can tell if cross origin isolation is successfully enabled by looking at the global crossOriginIsolated variable in
17
- javascript console. If it isn't, streaming requests will fallback to XMLHttpRequest, i.e. getting the whole
18
- request into a buffer and then returning it. it shows a warning in the javascript console in this case.
19
-
20
- Finally, the webworker which does the streaming fetch is created on initial import, but will only be started once
21
- control is returned to javascript. Call `await wait_for_streaming_ready()` to wait for streaming fetch.
22
-
23
- NB: in this code, there are a lot of javascript objects. They are named js_*
24
- to make it clear what type of object they are.
25
- """
26
- from __future__ import annotations
27
-
28
- import io
29
- import json
30
- from email.parser import Parser
31
- from importlib.resources import files
32
- from typing import TYPE_CHECKING, Any
33
-
34
- import js # type: ignore[import-not-found]
35
- from pyodide.ffi import ( # type: ignore[import-not-found]
36
- JsArray,
37
- JsException,
38
- JsProxy,
39
- to_js,
40
- )
41
-
42
- if TYPE_CHECKING:
43
- from typing_extensions import Buffer
44
-
45
- from .request import EmscriptenRequest
46
- from .response import EmscriptenResponse
47
-
48
- """
49
- There are some headers that trigger unintended CORS preflight requests.
50
- See also https://github.com/koenvo/pyodide-http/issues/22
51
- """
52
- HEADERS_TO_IGNORE = ("user-agent",)
53
-
54
- SUCCESS_HEADER = -1
55
- SUCCESS_EOF = -2
56
- ERROR_TIMEOUT = -3
57
- ERROR_EXCEPTION = -4
58
-
59
- _STREAMING_WORKER_CODE = (
60
- files(__package__)
61
- .joinpath("emscripten_fetch_worker.js")
62
- .read_text(encoding="utf-8")
63
- )
64
-
65
-
66
- class _RequestError(Exception):
67
- def __init__(
68
- self,
69
- message: str | None = None,
70
- *,
71
- request: EmscriptenRequest | None = None,
72
- response: EmscriptenResponse | None = None,
73
- ):
74
- self.request = request
75
- self.response = response
76
- self.message = message
77
- super().__init__(self.message)
78
-
79
-
80
- class _StreamingError(_RequestError):
81
- pass
82
-
83
-
84
- class _TimeoutError(_RequestError):
85
- pass
86
-
87
-
88
- def _obj_from_dict(dict_val: dict[str, Any]) -> JsProxy:
89
- return to_js(dict_val, dict_converter=js.Object.fromEntries)
90
-
91
-
92
- class _ReadStream(io.RawIOBase):
93
- def __init__(
94
- self,
95
- int_buffer: JsArray,
96
- byte_buffer: JsArray,
97
- timeout: float,
98
- worker: JsProxy,
99
- connection_id: int,
100
- request: EmscriptenRequest,
101
- ):
102
- self.int_buffer = int_buffer
103
- self.byte_buffer = byte_buffer
104
- self.read_pos = 0
105
- self.read_len = 0
106
- self.connection_id = connection_id
107
- self.worker = worker
108
- self.timeout = int(1000 * timeout) if timeout > 0 else None
109
- self.is_live = True
110
- self._is_closed = False
111
- self.request: EmscriptenRequest | None = request
112
-
113
- def __del__(self) -> None:
114
- self.close()
115
-
116
- # this is compatible with _base_connection
117
- def is_closed(self) -> bool:
118
- return self._is_closed
119
-
120
- # for compatibility with RawIOBase
121
- @property
122
- def closed(self) -> bool:
123
- return self.is_closed()
124
-
125
- def close(self) -> None:
126
- if not self.is_closed():
127
- self.read_len = 0
128
- self.read_pos = 0
129
- self.int_buffer = None
130
- self.byte_buffer = None
131
- self._is_closed = True
132
- self.request = None
133
- if self.is_live:
134
- self.worker.postMessage(_obj_from_dict({"close": self.connection_id}))
135
- self.is_live = False
136
- super().close()
137
-
138
- def readable(self) -> bool:
139
- return True
140
-
141
- def writable(self) -> bool:
142
- return False
143
-
144
- def seekable(self) -> bool:
145
- return False
146
-
147
- def readinto(self, byte_obj: Buffer) -> int:
148
- if not self.int_buffer:
149
- raise _StreamingError(
150
- "No buffer for stream in _ReadStream.readinto",
151
- request=self.request,
152
- response=None,
153
- )
154
- if self.read_len == 0:
155
- # wait for the worker to send something
156
- js.Atomics.store(self.int_buffer, 0, ERROR_TIMEOUT)
157
- self.worker.postMessage(_obj_from_dict({"getMore": self.connection_id}))
158
- if (
159
- js.Atomics.wait(self.int_buffer, 0, ERROR_TIMEOUT, self.timeout)
160
- == "timed-out"
161
- ):
162
- raise _TimeoutError
163
- data_len = self.int_buffer[0]
164
- if data_len > 0:
165
- self.read_len = data_len
166
- self.read_pos = 0
167
- elif data_len == ERROR_EXCEPTION:
168
- string_len = self.int_buffer[1]
169
- # decode the error string
170
- js_decoder = js.TextDecoder.new()
171
- json_str = js_decoder.decode(self.byte_buffer.slice(0, string_len))
172
- raise _StreamingError(
173
- f"Exception thrown in fetch: {json_str}",
174
- request=self.request,
175
- response=None,
176
- )
177
- else:
178
- # EOF, free the buffers and return zero
179
- # and free the request
180
- self.is_live = False
181
- self.close()
182
- return 0
183
- # copy from int32array to python bytes
184
- ret_length = min(self.read_len, len(memoryview(byte_obj)))
185
- subarray = self.byte_buffer.subarray(
186
- self.read_pos, self.read_pos + ret_length
187
- ).to_py()
188
- memoryview(byte_obj)[0:ret_length] = subarray
189
- self.read_len -= ret_length
190
- self.read_pos += ret_length
191
- return ret_length
192
-
193
-
194
- class _StreamingFetcher:
195
- def __init__(self) -> None:
196
- # make web-worker and data buffer on startup
197
- self.streaming_ready = False
198
-
199
- js_data_blob = js.Blob.new(
200
- [_STREAMING_WORKER_CODE], _obj_from_dict({"type": "application/javascript"})
201
- )
202
-
203
- def promise_resolver(js_resolve_fn: JsProxy, js_reject_fn: JsProxy) -> None:
204
- def onMsg(e: JsProxy) -> None:
205
- self.streaming_ready = True
206
- js_resolve_fn(e)
207
-
208
- def onErr(e: JsProxy) -> None:
209
- js_reject_fn(e) # Defensive: never happens in ci
210
-
211
- self.js_worker.onmessage = onMsg
212
- self.js_worker.onerror = onErr
213
-
214
- js_data_url = js.URL.createObjectURL(js_data_blob)
215
- self.js_worker = js.globalThis.Worker.new(js_data_url)
216
- self.js_worker_ready_promise = js.globalThis.Promise.new(promise_resolver)
217
-
218
- def send(self, request: EmscriptenRequest) -> EmscriptenResponse:
219
- headers = {
220
- k: v for k, v in request.headers.items() if k not in HEADERS_TO_IGNORE
221
- }
222
-
223
- body = request.body
224
- fetch_data = {"headers": headers, "body": to_js(body), "method": request.method}
225
- # start the request off in the worker
226
- timeout = int(1000 * request.timeout) if request.timeout > 0 else None
227
- js_shared_buffer = js.SharedArrayBuffer.new(1048576)
228
- js_int_buffer = js.Int32Array.new(js_shared_buffer)
229
- js_byte_buffer = js.Uint8Array.new(js_shared_buffer, 8)
230
-
231
- js.Atomics.store(js_int_buffer, 0, ERROR_TIMEOUT)
232
- js.Atomics.notify(js_int_buffer, 0)
233
- js_absolute_url = js.URL.new(request.url, js.location).href
234
- self.js_worker.postMessage(
235
- _obj_from_dict(
236
- {
237
- "buffer": js_shared_buffer,
238
- "url": js_absolute_url,
239
- "fetchParams": fetch_data,
240
- }
241
- )
242
- )
243
- # wait for the worker to send something
244
- js.Atomics.wait(js_int_buffer, 0, ERROR_TIMEOUT, timeout)
245
- if js_int_buffer[0] == ERROR_TIMEOUT:
246
- raise _TimeoutError(
247
- "Timeout connecting to streaming request",
248
- request=request,
249
- response=None,
250
- )
251
- elif js_int_buffer[0] == SUCCESS_HEADER:
252
- # got response
253
- # header length is in second int of intBuffer
254
- string_len = js_int_buffer[1]
255
- # decode the rest to a JSON string
256
- js_decoder = js.TextDecoder.new()
257
- # this does a copy (the slice) because decode can't work on shared array
258
- # for some silly reason
259
- json_str = js_decoder.decode(js_byte_buffer.slice(0, string_len))
260
- # get it as an object
261
- response_obj = json.loads(json_str)
262
- return EmscriptenResponse(
263
- request=request,
264
- status_code=response_obj["status"],
265
- headers=response_obj["headers"],
266
- body=_ReadStream(
267
- js_int_buffer,
268
- js_byte_buffer,
269
- request.timeout,
270
- self.js_worker,
271
- response_obj["connectionID"],
272
- request,
273
- ),
274
- )
275
- elif js_int_buffer[0] == ERROR_EXCEPTION:
276
- string_len = js_int_buffer[1]
277
- # decode the error string
278
- js_decoder = js.TextDecoder.new()
279
- json_str = js_decoder.decode(js_byte_buffer.slice(0, string_len))
280
- raise _StreamingError(
281
- f"Exception thrown in fetch: {json_str}", request=request, response=None
282
- )
283
- else:
284
- raise _StreamingError(
285
- f"Unknown status from worker in fetch: {js_int_buffer[0]}",
286
- request=request,
287
- response=None,
288
- )
289
-
290
-
291
- # check if we are in a worker or not
292
- def is_in_browser_main_thread() -> bool:
293
- return hasattr(js, "window") and hasattr(js, "self") and js.self == js.window
294
-
295
-
296
- def is_cross_origin_isolated() -> bool:
297
- return hasattr(js, "crossOriginIsolated") and js.crossOriginIsolated
298
-
299
-
300
- def is_in_node() -> bool:
301
- return (
302
- hasattr(js, "process")
303
- and hasattr(js.process, "release")
304
- and hasattr(js.process.release, "name")
305
- and js.process.release.name == "node"
306
- )
307
-
308
-
309
- def is_worker_available() -> bool:
310
- return hasattr(js, "Worker") and hasattr(js, "Blob")
311
-
312
-
313
- _fetcher: _StreamingFetcher | None = None
314
-
315
- if is_worker_available() and (
316
- (is_cross_origin_isolated() and not is_in_browser_main_thread())
317
- and (not is_in_node())
318
- ):
319
- _fetcher = _StreamingFetcher()
320
- else:
321
- _fetcher = None
322
-
323
-
324
- def send_streaming_request(request: EmscriptenRequest) -> EmscriptenResponse | None:
325
- if _fetcher and streaming_ready():
326
- return _fetcher.send(request)
327
- else:
328
- _show_streaming_warning()
329
- return None
330
-
331
-
332
- _SHOWN_TIMEOUT_WARNING = False
333
-
334
-
335
- def _show_timeout_warning() -> None:
336
- global _SHOWN_TIMEOUT_WARNING
337
- if not _SHOWN_TIMEOUT_WARNING:
338
- _SHOWN_TIMEOUT_WARNING = True
339
- message = "Warning: Timeout is not available on main browser thread"
340
- js.console.warn(message)
341
-
342
-
343
- _SHOWN_STREAMING_WARNING = False
344
-
345
-
346
- def _show_streaming_warning() -> None:
347
- global _SHOWN_STREAMING_WARNING
348
- if not _SHOWN_STREAMING_WARNING:
349
- _SHOWN_STREAMING_WARNING = True
350
- message = "Can't stream HTTP requests because: \n"
351
- if not is_cross_origin_isolated():
352
- message += " Page is not cross-origin isolated\n"
353
- if is_in_browser_main_thread():
354
- message += " Python is running in main browser thread\n"
355
- if not is_worker_available():
356
- message += " Worker or Blob classes are not available in this environment." # Defensive: this is always False in browsers that we test in
357
- if streaming_ready() is False:
358
- message += """ Streaming fetch worker isn't ready. If you want to be sure that streaming fetch
359
- is working, you need to call: 'await urllib3.contrib.emscripten.fetch.wait_for_streaming_ready()`"""
360
- from js import console
361
-
362
- console.warn(message)
363
-
364
-
365
- def send_request(request: EmscriptenRequest) -> EmscriptenResponse:
366
- try:
367
- js_xhr = js.XMLHttpRequest.new()
368
-
369
- if not is_in_browser_main_thread():
370
- js_xhr.responseType = "arraybuffer"
371
- if request.timeout:
372
- js_xhr.timeout = int(request.timeout * 1000)
373
- else:
374
- js_xhr.overrideMimeType("text/plain; charset=ISO-8859-15")
375
- if request.timeout:
376
- # timeout isn't available on the main thread - show a warning in console
377
- # if it is set
378
- _show_timeout_warning()
379
-
380
- js_xhr.open(request.method, request.url, False)
381
- for name, value in request.headers.items():
382
- if name.lower() not in HEADERS_TO_IGNORE:
383
- js_xhr.setRequestHeader(name, value)
384
-
385
- js_xhr.send(to_js(request.body))
386
-
387
- headers = dict(Parser().parsestr(js_xhr.getAllResponseHeaders()))
388
-
389
- if not is_in_browser_main_thread():
390
- body = js_xhr.response.to_py().tobytes()
391
- else:
392
- body = js_xhr.response.encode("ISO-8859-15")
393
- return EmscriptenResponse(
394
- status_code=js_xhr.status, headers=headers, body=body, request=request
395
- )
396
- except JsException as err:
397
- if err.name == "TimeoutError":
398
- raise _TimeoutError(err.message, request=request)
399
- elif err.name == "NetworkError":
400
- raise _RequestError(err.message, request=request)
401
- else:
402
- # general http error
403
- raise _RequestError(err.message, request=request)
404
-
405
-
406
- def streaming_ready() -> bool | None:
407
- if _fetcher:
408
- return _fetcher.streaming_ready
409
- else:
410
- return None # no fetcher, return None to signify that
411
-
412
-
413
- async def wait_for_streaming_ready() -> bool:
414
- if _fetcher:
415
- await _fetcher.js_worker_ready_promise
416
- return True
417
- else:
418
- return False