webull-openapi-python-sdk 1.0.0__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 (295) hide show
  1. samples/__init__.py +1 -0
  2. samples/data/__init__.py +1 -0
  3. samples/data/data_client.py +57 -0
  4. samples/data/data_streaming_client.py +86 -0
  5. samples/data/data_streaming_client_async.py +101 -0
  6. samples/trade/__init__.py +0 -0
  7. samples/trade/trade_client.py +163 -0
  8. samples/trade/trade_client_v2.py +181 -0
  9. samples/trade/trade_event_client.py +47 -0
  10. webull/__init__.py +1 -0
  11. webull/core/__init__.py +12 -0
  12. webull/core/auth/__init__.py +0 -0
  13. webull/core/auth/algorithm/__init__.py +0 -0
  14. webull/core/auth/algorithm/sha_hmac1.py +65 -0
  15. webull/core/auth/algorithm/sha_hmac256.py +75 -0
  16. webull/core/auth/composer/__init__.py +0 -0
  17. webull/core/auth/composer/default_signature_composer.py +125 -0
  18. webull/core/auth/credentials.py +46 -0
  19. webull/core/auth/signers/__init__.py +0 -0
  20. webull/core/auth/signers/app_key_signer.py +72 -0
  21. webull/core/auth/signers/signer.py +48 -0
  22. webull/core/auth/signers/signer_factory.py +58 -0
  23. webull/core/cache/__init__.py +225 -0
  24. webull/core/client.py +410 -0
  25. webull/core/common/__init__.py +0 -0
  26. webull/core/common/api_type.py +19 -0
  27. webull/core/common/easy_enum.py +35 -0
  28. webull/core/common/region.py +7 -0
  29. webull/core/compat.py +85 -0
  30. webull/core/context/__init__.py +0 -0
  31. webull/core/context/request_context_holder.py +33 -0
  32. webull/core/data/endpoints.json +22 -0
  33. webull/core/data/retry_config.json +15 -0
  34. webull/core/endpoint/__init__.py +8 -0
  35. webull/core/endpoint/chained_endpoint_resolver.py +57 -0
  36. webull/core/endpoint/default_endpoint_resolver.py +60 -0
  37. webull/core/endpoint/local_config_regional_endpoint_resolver.py +77 -0
  38. webull/core/endpoint/resolver_endpoint_request.py +46 -0
  39. webull/core/endpoint/user_customized_endpoint_resolver.py +55 -0
  40. webull/core/exception/__init__.py +0 -0
  41. webull/core/exception/error_code.py +23 -0
  42. webull/core/exception/error_msg.py +21 -0
  43. webull/core/exception/exceptions.py +53 -0
  44. webull/core/headers.py +57 -0
  45. webull/core/http/__init__.py +0 -0
  46. webull/core/http/initializer/__init__.py +0 -0
  47. webull/core/http/initializer/client_initializer.py +79 -0
  48. webull/core/http/initializer/token/__init__.py +0 -0
  49. webull/core/http/initializer/token/bean/__init__.py +0 -0
  50. webull/core/http/initializer/token/bean/access_token.py +40 -0
  51. webull/core/http/initializer/token/bean/check_token_request.py +44 -0
  52. webull/core/http/initializer/token/bean/create_token_request.py +45 -0
  53. webull/core/http/initializer/token/bean/refresh_token_request.py +44 -0
  54. webull/core/http/initializer/token/token_manager.py +208 -0
  55. webull/core/http/initializer/token/token_operation.py +72 -0
  56. webull/core/http/method_type.py +43 -0
  57. webull/core/http/protocol_type.py +43 -0
  58. webull/core/http/request.py +121 -0
  59. webull/core/http/response.py +166 -0
  60. webull/core/request.py +278 -0
  61. webull/core/retry/__init__.py +0 -0
  62. webull/core/retry/backoff_strategy.py +102 -0
  63. webull/core/retry/retry_condition.py +214 -0
  64. webull/core/retry/retry_policy.py +63 -0
  65. webull/core/retry/retry_policy_context.py +51 -0
  66. webull/core/utils/__init__.py +0 -0
  67. webull/core/utils/common.py +62 -0
  68. webull/core/utils/data.py +25 -0
  69. webull/core/utils/desensitize.py +33 -0
  70. webull/core/utils/validation.py +49 -0
  71. webull/core/vendored/__init__.py +0 -0
  72. webull/core/vendored/requests/__init__.py +94 -0
  73. webull/core/vendored/requests/__version__.py +28 -0
  74. webull/core/vendored/requests/_internal_utils.py +56 -0
  75. webull/core/vendored/requests/adapters.py +539 -0
  76. webull/core/vendored/requests/api.py +166 -0
  77. webull/core/vendored/requests/auth.py +307 -0
  78. webull/core/vendored/requests/certs.py +34 -0
  79. webull/core/vendored/requests/compat.py +85 -0
  80. webull/core/vendored/requests/cookies.py +555 -0
  81. webull/core/vendored/requests/exceptions.py +136 -0
  82. webull/core/vendored/requests/help.py +134 -0
  83. webull/core/vendored/requests/hooks.py +48 -0
  84. webull/core/vendored/requests/models.py +960 -0
  85. webull/core/vendored/requests/packages/__init__.py +17 -0
  86. webull/core/vendored/requests/packages/certifi/__init__.py +17 -0
  87. webull/core/vendored/requests/packages/certifi/__main__.py +16 -0
  88. webull/core/vendored/requests/packages/certifi/cacert.pem +4433 -0
  89. webull/core/vendored/requests/packages/certifi/core.py +51 -0
  90. webull/core/vendored/requests/packages/chardet/__init__.py +53 -0
  91. webull/core/vendored/requests/packages/chardet/big5freq.py +400 -0
  92. webull/core/vendored/requests/packages/chardet/big5prober.py +61 -0
  93. webull/core/vendored/requests/packages/chardet/chardistribution.py +247 -0
  94. webull/core/vendored/requests/packages/chardet/charsetgroupprober.py +120 -0
  95. webull/core/vendored/requests/packages/chardet/charsetprober.py +159 -0
  96. webull/core/vendored/requests/packages/chardet/cli/__init__.py +1 -0
  97. webull/core/vendored/requests/packages/chardet/cli/chardetect.py +99 -0
  98. webull/core/vendored/requests/packages/chardet/codingstatemachine.py +102 -0
  99. webull/core/vendored/requests/packages/chardet/compat.py +48 -0
  100. webull/core/vendored/requests/packages/chardet/cp949prober.py +63 -0
  101. webull/core/vendored/requests/packages/chardet/enums.py +90 -0
  102. webull/core/vendored/requests/packages/chardet/escprober.py +115 -0
  103. webull/core/vendored/requests/packages/chardet/escsm.py +260 -0
  104. webull/core/vendored/requests/packages/chardet/eucjpprober.py +106 -0
  105. webull/core/vendored/requests/packages/chardet/euckrfreq.py +209 -0
  106. webull/core/vendored/requests/packages/chardet/euckrprober.py +61 -0
  107. webull/core/vendored/requests/packages/chardet/euctwfreq.py +401 -0
  108. webull/core/vendored/requests/packages/chardet/euctwprober.py +60 -0
  109. webull/core/vendored/requests/packages/chardet/gb2312freq.py +297 -0
  110. webull/core/vendored/requests/packages/chardet/gb2312prober.py +60 -0
  111. webull/core/vendored/requests/packages/chardet/hebrewprober.py +306 -0
  112. webull/core/vendored/requests/packages/chardet/jisfreq.py +339 -0
  113. webull/core/vendored/requests/packages/chardet/jpcntx.py +247 -0
  114. webull/core/vendored/requests/packages/chardet/langbulgarianmodel.py +242 -0
  115. webull/core/vendored/requests/packages/chardet/langcyrillicmodel.py +347 -0
  116. webull/core/vendored/requests/packages/chardet/langgreekmodel.py +239 -0
  117. webull/core/vendored/requests/packages/chardet/langhebrewmodel.py +214 -0
  118. webull/core/vendored/requests/packages/chardet/langhungarianmodel.py +239 -0
  119. webull/core/vendored/requests/packages/chardet/langthaimodel.py +213 -0
  120. webull/core/vendored/requests/packages/chardet/langturkishmodel.py +207 -0
  121. webull/core/vendored/requests/packages/chardet/latin1prober.py +159 -0
  122. webull/core/vendored/requests/packages/chardet/mbcharsetprober.py +105 -0
  123. webull/core/vendored/requests/packages/chardet/mbcsgroupprober.py +68 -0
  124. webull/core/vendored/requests/packages/chardet/mbcssm.py +586 -0
  125. webull/core/vendored/requests/packages/chardet/sbcharsetprober.py +146 -0
  126. webull/core/vendored/requests/packages/chardet/sbcsgroupprober.py +87 -0
  127. webull/core/vendored/requests/packages/chardet/sjisprober.py +106 -0
  128. webull/core/vendored/requests/packages/chardet/universaldetector.py +300 -0
  129. webull/core/vendored/requests/packages/chardet/utf8prober.py +96 -0
  130. webull/core/vendored/requests/packages/chardet/version.py +23 -0
  131. webull/core/vendored/requests/packages/urllib3/__init__.py +114 -0
  132. webull/core/vendored/requests/packages/urllib3/_collections.py +346 -0
  133. webull/core/vendored/requests/packages/urllib3/connection.py +405 -0
  134. webull/core/vendored/requests/packages/urllib3/connectionpool.py +910 -0
  135. webull/core/vendored/requests/packages/urllib3/contrib/__init__.py +0 -0
  136. webull/core/vendored/requests/packages/urllib3/contrib/_appengine_environ.py +44 -0
  137. webull/core/vendored/requests/packages/urllib3/contrib/_securetransport/__init__.py +0 -0
  138. webull/core/vendored/requests/packages/urllib3/contrib/_securetransport/bindings.py +607 -0
  139. webull/core/vendored/requests/packages/urllib3/contrib/_securetransport/low_level.py +360 -0
  140. webull/core/vendored/requests/packages/urllib3/contrib/appengine.py +303 -0
  141. webull/core/vendored/requests/packages/urllib3/contrib/ntlmpool.py +125 -0
  142. webull/core/vendored/requests/packages/urllib3/contrib/pyopenssl.py +484 -0
  143. webull/core/vendored/requests/packages/urllib3/contrib/securetransport.py +818 -0
  144. webull/core/vendored/requests/packages/urllib3/contrib/socks.py +206 -0
  145. webull/core/vendored/requests/packages/urllib3/exceptions.py +260 -0
  146. webull/core/vendored/requests/packages/urllib3/fields.py +192 -0
  147. webull/core/vendored/requests/packages/urllib3/filepost.py +112 -0
  148. webull/core/vendored/requests/packages/urllib3/packages/__init__.py +19 -0
  149. webull/core/vendored/requests/packages/urllib3/packages/backports/__init__.py +0 -0
  150. webull/core/vendored/requests/packages/urllib3/packages/backports/makefile.py +67 -0
  151. webull/core/vendored/requests/packages/urllib3/packages/ordered_dict.py +273 -0
  152. webull/core/vendored/requests/packages/urllib3/packages/six.py +882 -0
  153. webull/core/vendored/requests/packages/urllib3/packages/socks.py +887 -0
  154. webull/core/vendored/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +19 -0
  155. webull/core/vendored/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py +170 -0
  156. webull/core/vendored/requests/packages/urllib3/poolmanager.py +467 -0
  157. webull/core/vendored/requests/packages/urllib3/request.py +164 -0
  158. webull/core/vendored/requests/packages/urllib3/response.py +721 -0
  159. webull/core/vendored/requests/packages/urllib3/util/__init__.py +68 -0
  160. webull/core/vendored/requests/packages/urllib3/util/connection.py +148 -0
  161. webull/core/vendored/requests/packages/urllib3/util/queue.py +35 -0
  162. webull/core/vendored/requests/packages/urllib3/util/request.py +132 -0
  163. webull/core/vendored/requests/packages/urllib3/util/response.py +101 -0
  164. webull/core/vendored/requests/packages/urllib3/util/retry.py +426 -0
  165. webull/core/vendored/requests/packages/urllib3/util/selectors.py +601 -0
  166. webull/core/vendored/requests/packages/urllib3/util/ssl_.py +396 -0
  167. webull/core/vendored/requests/packages/urllib3/util/timeout.py +256 -0
  168. webull/core/vendored/requests/packages/urllib3/util/url.py +252 -0
  169. webull/core/vendored/requests/packages/urllib3/util/wait.py +164 -0
  170. webull/core/vendored/requests/packages.py +28 -0
  171. webull/core/vendored/requests/sessions.py +750 -0
  172. webull/core/vendored/requests/status_codes.py +105 -0
  173. webull/core/vendored/requests/structures.py +119 -0
  174. webull/core/vendored/requests/utils.py +916 -0
  175. webull/core/vendored/six.py +905 -0
  176. webull/data/__init__.py +3 -0
  177. webull/data/common/__init__.py +0 -0
  178. webull/data/common/category.py +26 -0
  179. webull/data/common/connect_ack.py +29 -0
  180. webull/data/common/direction.py +25 -0
  181. webull/data/common/exchange_code.py +33 -0
  182. webull/data/common/exercise_style.py +22 -0
  183. webull/data/common/expiration_cycle.py +26 -0
  184. webull/data/common/instrument_status.py +23 -0
  185. webull/data/common/option_type.py +20 -0
  186. webull/data/common/subscribe_type.py +22 -0
  187. webull/data/common/timespan.py +29 -0
  188. webull/data/data_client.py +35 -0
  189. webull/data/data_streaming_client.py +89 -0
  190. webull/data/internal/__init__.py +0 -0
  191. webull/data/internal/default_retry_policy.py +84 -0
  192. webull/data/internal/exceptions.py +60 -0
  193. webull/data/internal/quotes_client.py +314 -0
  194. webull/data/internal/quotes_decoder.py +40 -0
  195. webull/data/internal/quotes_payload_decoder.py +35 -0
  196. webull/data/internal/quotes_topic.py +36 -0
  197. webull/data/quotes/__init__.py +0 -0
  198. webull/data/quotes/instrument.py +33 -0
  199. webull/data/quotes/market_data.py +187 -0
  200. webull/data/quotes/market_streaming_data.py +66 -0
  201. webull/data/quotes/subscribe/__init__.py +0 -0
  202. webull/data/quotes/subscribe/ask_bid_result.py +49 -0
  203. webull/data/quotes/subscribe/basic_result.py +45 -0
  204. webull/data/quotes/subscribe/broker_result.py +33 -0
  205. webull/data/quotes/subscribe/message_pb2.py +37 -0
  206. webull/data/quotes/subscribe/order_result.py +30 -0
  207. webull/data/quotes/subscribe/payload_type.py +19 -0
  208. webull/data/quotes/subscribe/quote_decoder.py +28 -0
  209. webull/data/quotes/subscribe/quote_result.py +47 -0
  210. webull/data/quotes/subscribe/snapshot_decoder.py +30 -0
  211. webull/data/quotes/subscribe/snapshot_result.py +69 -0
  212. webull/data/quotes/subscribe/tick_decoder.py +29 -0
  213. webull/data/quotes/subscribe/tick_result.py +47 -0
  214. webull/data/request/__init__.py +0 -0
  215. webull/data/request/get_batch_historical_bars_request.py +43 -0
  216. webull/data/request/get_corp_action_request.py +47 -0
  217. webull/data/request/get_eod_bars_request.py +32 -0
  218. webull/data/request/get_historical_bars_request.py +43 -0
  219. webull/data/request/get_instruments_request.py +30 -0
  220. webull/data/request/get_quotes_request.py +35 -0
  221. webull/data/request/get_snapshot_request.py +38 -0
  222. webull/data/request/get_tick_request.py +37 -0
  223. webull/data/request/subscribe_request.py +43 -0
  224. webull/data/request/unsubscribe_request.py +42 -0
  225. webull/trade/__init__.py +2 -0
  226. webull/trade/common/__init__.py +0 -0
  227. webull/trade/common/account_type.py +22 -0
  228. webull/trade/common/category.py +29 -0
  229. webull/trade/common/combo_ticker_type.py +23 -0
  230. webull/trade/common/combo_type.py +31 -0
  231. webull/trade/common/currency.py +24 -0
  232. webull/trade/common/forbid_reason.py +27 -0
  233. webull/trade/common/instrument_type.py +27 -0
  234. webull/trade/common/markets.py +27 -0
  235. webull/trade/common/order_entrust_type.py +21 -0
  236. webull/trade/common/order_side.py +23 -0
  237. webull/trade/common/order_status.py +25 -0
  238. webull/trade/common/order_tif.py +24 -0
  239. webull/trade/common/order_type.py +30 -0
  240. webull/trade/common/trade_policy.py +22 -0
  241. webull/trade/common/trading_date_type.py +24 -0
  242. webull/trade/common/trailing_type.py +23 -0
  243. webull/trade/events/__init__.py +0 -0
  244. webull/trade/events/default_retry_policy.py +64 -0
  245. webull/trade/events/events_pb2.py +43 -0
  246. webull/trade/events/events_pb2_grpc.py +66 -0
  247. webull/trade/events/signature_composer.py +61 -0
  248. webull/trade/events/types.py +21 -0
  249. webull/trade/request/__init__.py +0 -0
  250. webull/trade/request/cancel_order_request.py +28 -0
  251. webull/trade/request/get_account_balance_request.py +28 -0
  252. webull/trade/request/get_account_positions_request.py +30 -0
  253. webull/trade/request/get_account_profile_request.py +26 -0
  254. webull/trade/request/get_app_subscriptions.py +28 -0
  255. webull/trade/request/get_open_orders_request.py +30 -0
  256. webull/trade/request/get_order_detail_request.py +27 -0
  257. webull/trade/request/get_today_orders_request.py +31 -0
  258. webull/trade/request/get_trade_calendar_request.py +30 -0
  259. webull/trade/request/get_trade_instrument_detail_request.py +24 -0
  260. webull/trade/request/get_trade_security_detail_request.py +42 -0
  261. webull/trade/request/get_tradeable_instruments_request.py +27 -0
  262. webull/trade/request/palce_order_request.py +91 -0
  263. webull/trade/request/place_order_request_v2.py +58 -0
  264. webull/trade/request/replace_order_request.py +73 -0
  265. webull/trade/request/replace_order_request_v2.py +38 -0
  266. webull/trade/request/v2/__init__.py +0 -0
  267. webull/trade/request/v2/cancel_option_request.py +28 -0
  268. webull/trade/request/v2/cancel_order_request.py +28 -0
  269. webull/trade/request/v2/get_account_balance_request.py +28 -0
  270. webull/trade/request/v2/get_account_list.py +23 -0
  271. webull/trade/request/v2/get_account_positions_request.py +24 -0
  272. webull/trade/request/v2/get_order_detail_request.py +26 -0
  273. webull/trade/request/v2/get_order_history_request.py +35 -0
  274. webull/trade/request/v2/palce_order_request.py +87 -0
  275. webull/trade/request/v2/place_option_request.py +64 -0
  276. webull/trade/request/v2/preview_option_request.py +28 -0
  277. webull/trade/request/v2/preview_order_request.py +59 -0
  278. webull/trade/request/v2/replace_option_request.py +28 -0
  279. webull/trade/request/v2/replace_order_request.py +57 -0
  280. webull/trade/trade/__init__.py +0 -0
  281. webull/trade/trade/account_info.py +83 -0
  282. webull/trade/trade/order_operation.py +246 -0
  283. webull/trade/trade/trade_calendar.py +37 -0
  284. webull/trade/trade/trade_instrument.py +72 -0
  285. webull/trade/trade/v2/__init__.py +0 -0
  286. webull/trade/trade/v2/account_info_v2.py +55 -0
  287. webull/trade/trade/v2/order_operation_v2.py +206 -0
  288. webull/trade/trade_client.py +43 -0
  289. webull/trade/trade_events_client.py +233 -0
  290. webull_openapi_python_sdk-1.0.0.dist-info/METADATA +28 -0
  291. webull_openapi_python_sdk-1.0.0.dist-info/RECORD +295 -0
  292. webull_openapi_python_sdk-1.0.0.dist-info/WHEEL +5 -0
  293. webull_openapi_python_sdk-1.0.0.dist-info/licenses/LICENSE +202 -0
  294. webull_openapi_python_sdk-1.0.0.dist-info/licenses/NOTICE +56 -0
  295. webull_openapi_python_sdk-1.0.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,96 @@
1
+ # Copyright 2022 Webull
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ ######################## BEGIN LICENSE BLOCK ########################
16
+ # The Original Code is mozilla.org code.
17
+ #
18
+ # The Initial Developer of the Original Code is
19
+ # Netscape Communications Corporation.
20
+ # Portions created by the Initial Developer are Copyright (C) 1998
21
+ # the Initial Developer. All Rights Reserved.
22
+ #
23
+ # Contributor(s):
24
+ # Mark Pilgrim - port to Python
25
+ #
26
+ # This library is free software; you can redistribute it and/or
27
+ # modify it under the terms of the GNU Lesser General Public
28
+ # License as published by the Free Software Foundation; either
29
+ # version 2.1 of the License, or (at your option) any later version.
30
+ #
31
+ # This library is distributed in the hope that it will be useful,
32
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
33
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
34
+ # Lesser General Public License for more details.
35
+ #
36
+ # You should have received a copy of the GNU Lesser General Public
37
+ # License along with this library; if not, write to the Free Software
38
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
39
+ # 02110-1301 USA
40
+ ######################### END LICENSE BLOCK #########################
41
+
42
+ from .charsetprober import CharSetProber
43
+ from .enums import ProbingState, MachineState
44
+ from .codingstatemachine import CodingStateMachine
45
+ from .mbcssm import UTF8_SM_MODEL
46
+
47
+
48
+
49
+ class UTF8Prober(CharSetProber):
50
+ ONE_CHAR_PROB = 0.5
51
+
52
+ def __init__(self):
53
+ super(UTF8Prober, self).__init__()
54
+ self.coding_sm = CodingStateMachine(UTF8_SM_MODEL)
55
+ self._num_mb_chars = None
56
+ self.reset()
57
+
58
+ def reset(self):
59
+ super(UTF8Prober, self).reset()
60
+ self.coding_sm.reset()
61
+ self._num_mb_chars = 0
62
+
63
+ @property
64
+ def charset_name(self):
65
+ return "utf-8"
66
+
67
+ @property
68
+ def language(self):
69
+ return ""
70
+
71
+ def feed(self, byte_str):
72
+ for c in byte_str:
73
+ coding_state = self.coding_sm.next_state(c)
74
+ if coding_state == MachineState.ERROR:
75
+ self._state = ProbingState.NOT_ME
76
+ break
77
+ elif coding_state == MachineState.ITS_ME:
78
+ self._state = ProbingState.FOUND_IT
79
+ break
80
+ elif coding_state == MachineState.START:
81
+ if self.coding_sm.get_current_charlen() >= 2:
82
+ self._num_mb_chars += 1
83
+
84
+ if self.state == ProbingState.DETECTING:
85
+ if self.get_confidence() > self.SHORTCUT_THRESHOLD:
86
+ self._state = ProbingState.FOUND_IT
87
+
88
+ return self.state
89
+
90
+ def get_confidence(self):
91
+ unlike = 0.99
92
+ if self._num_mb_chars < 6:
93
+ unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars
94
+ return 1.0 - unlike
95
+ else:
96
+ return unlike
@@ -0,0 +1,23 @@
1
+ # Copyright 2022 Webull
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """
16
+ This module exists only to simplify retrieving the version number of chardet
17
+ from within setup.py and from chardet subpackages.
18
+
19
+ :author: Dan Blanchard (dan.blanchard@gmail.com)
20
+ """
21
+
22
+ __version__ = "3.0.4"
23
+ VERSION = __version__.split('.')
@@ -0,0 +1,114 @@
1
+ # Copyright 2022 Webull
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """
16
+ urllib3 - Thread-safe connection pooling and re-using.
17
+ """
18
+
19
+ from __future__ import absolute_import
20
+ import warnings
21
+
22
+ from .connectionpool import (
23
+ HTTPConnectionPool,
24
+ HTTPSConnectionPool,
25
+ connection_from_url
26
+ )
27
+
28
+ from . import exceptions
29
+ from .filepost import encode_multipart_formdata
30
+ from .poolmanager import PoolManager, ProxyManager, proxy_from_url
31
+ from .response import HTTPResponse
32
+ from .util.request import make_headers
33
+ from .util.url import get_host
34
+ from .util.timeout import Timeout
35
+ from .util.retry import Retry
36
+
37
+
38
+ # Set default logging handler to avoid "No handler found" warnings.
39
+ import logging
40
+ try: # Python 2.7+
41
+ from logging import NullHandler
42
+ except ImportError:
43
+ class NullHandler(logging.Handler):
44
+ def emit(self, record):
45
+ """
46
+ null handler
47
+ """
48
+ pass
49
+
50
+ __author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
51
+ __license__ = 'MIT'
52
+ __version__ = '1.24.3'
53
+
54
+ __all__ = (
55
+ 'HTTPConnectionPool',
56
+ 'HTTPSConnectionPool',
57
+ 'PoolManager',
58
+ 'ProxyManager',
59
+ 'HTTPResponse',
60
+ 'Retry',
61
+ 'Timeout',
62
+ 'add_stderr_logger',
63
+ 'connection_from_url',
64
+ 'disable_warnings',
65
+ 'encode_multipart_formdata',
66
+ 'get_host',
67
+ 'make_headers',
68
+ 'proxy_from_url',
69
+ )
70
+
71
+ logging.getLogger(__name__).addHandler(NullHandler())
72
+
73
+
74
+ def add_stderr_logger(level=logging.DEBUG):
75
+ """
76
+ Helper for quickly adding a StreamHandler to the logger. Useful for
77
+ debugging.
78
+
79
+ Returns the handler after adding it.
80
+ """
81
+ # This method needs to be in this __init__.py to get the __name__ correct
82
+ # even if urllib3 is vendored within another package.
83
+ logger = logging.getLogger(__name__)
84
+ handler = logging.StreamHandler()
85
+ handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
86
+ logger.addHandler(handler)
87
+ logger.setLevel(level)
88
+ logger.debug('Added a stderr logging handler to logger: %s', __name__)
89
+ return handler
90
+
91
+
92
+ # ... Clean up.
93
+ del NullHandler
94
+
95
+
96
+ # All warning filters *must* be appended unless you're really certain that they
97
+ # shouldn't be: otherwise, it's very hard for users to use most Python
98
+ # mechanisms to silence them.
99
+ # SecurityWarning's always go off by default.
100
+ warnings.simplefilter('always', exceptions.SecurityWarning, append=True)
101
+ # SubjectAltNameWarning's should go off once per host
102
+ warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True)
103
+ # InsecurePlatformWarning's don't vary between requests, so we keep it default.
104
+ warnings.simplefilter('default', exceptions.InsecurePlatformWarning,
105
+ append=True)
106
+ # SNIMissingWarnings should go off only once.
107
+ warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True)
108
+
109
+
110
+ def disable_warnings(category=exceptions.HTTPWarning):
111
+ """
112
+ Helper for quickly disabling all urllib3 warnings.
113
+ """
114
+ warnings.simplefilter('ignore', category)
@@ -0,0 +1,346 @@
1
+ # Copyright 2022 Webull
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import absolute_import
16
+ try:
17
+ from collections.abc import Mapping, MutableMapping
18
+ except ImportError:
19
+ from collections import Mapping, MutableMapping
20
+ try:
21
+ from threading import RLock
22
+ except ImportError: # Platform-specific: No threads available
23
+ class RLock:
24
+ def __enter__(self):
25
+ pass
26
+
27
+ def __exit__(self, exc_type, exc_value, traceback):
28
+ pass
29
+
30
+
31
+ try: # Python 2.7+
32
+ from collections import OrderedDict
33
+ except ImportError:
34
+ from .packages.ordered_dict import OrderedDict
35
+ from .exceptions import InvalidHeader
36
+ from .packages.six import iterkeys, itervalues, PY3
37
+
38
+
39
+ __all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict']
40
+
41
+
42
+ _Null = object()
43
+
44
+
45
+ class RecentlyUsedContainer(MutableMapping):
46
+ """
47
+ Provides a thread-safe dict-like container which maintains up to
48
+ ``maxsize`` keys while throwing away the least-recently-used keys beyond
49
+ ``maxsize``.
50
+
51
+ :param maxsize:
52
+ Maximum number of recent elements to retain.
53
+
54
+ :param dispose_func:
55
+ Every time an item is evicted from the container,
56
+ ``dispose_func(value)`` is called. Callback which will get called
57
+ """
58
+
59
+ ContainerCls = OrderedDict
60
+
61
+ def __init__(self, maxsize=10, dispose_func=None):
62
+ self._maxsize = maxsize
63
+ self.dispose_func = dispose_func
64
+
65
+ self._container = self.ContainerCls()
66
+ self.lock = RLock()
67
+
68
+ def __getitem__(self, key):
69
+ # Re-insert the item, moving it to the end of the eviction line.
70
+ with self.lock:
71
+ item = self._container.pop(key)
72
+ self._container[key] = item
73
+ return item
74
+
75
+ def __setitem__(self, key, value):
76
+ evicted_value = _Null
77
+ with self.lock:
78
+ # Possibly evict the existing value of 'key'
79
+ evicted_value = self._container.get(key, _Null)
80
+ self._container[key] = value
81
+
82
+ # If we didn't evict an existing value, we might have to evict the
83
+ # least recently used item from the beginning of the container.
84
+ if len(self._container) > self._maxsize:
85
+ _key, evicted_value = self._container.popitem(last=False)
86
+
87
+ if self.dispose_func and evicted_value is not _Null:
88
+ self.dispose_func(evicted_value)
89
+
90
+ def __delitem__(self, key):
91
+ with self.lock:
92
+ value = self._container.pop(key)
93
+
94
+ if self.dispose_func:
95
+ self.dispose_func(value)
96
+
97
+ def __len__(self):
98
+ with self.lock:
99
+ return len(self._container)
100
+
101
+ def __iter__(self):
102
+ raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.')
103
+
104
+ def clear(self):
105
+ with self.lock:
106
+ # Copy pointers to all values, then wipe the mapping
107
+ values = list(itervalues(self._container))
108
+ self._container.clear()
109
+
110
+ if self.dispose_func:
111
+ for value in values:
112
+ self.dispose_func(value)
113
+
114
+ def keys(self):
115
+ with self.lock:
116
+ return list(iterkeys(self._container))
117
+
118
+
119
+ class HTTPHeaderDict(MutableMapping):
120
+ """
121
+ :param headers:
122
+ An iterable of field-value pairs. Must not contain multiple field names
123
+ when compared case-insensitively.
124
+
125
+ :param kwargs:
126
+ Additional field-value pairs to pass in to ``dict.update``.
127
+
128
+ A ``dict`` like container for storing HTTP Headers.
129
+
130
+ Field names are stored and compared case-insensitively in compliance with
131
+ RFC 7230. Iteration provides the first case-sensitive key seen for each
132
+ case-insensitive pair.
133
+
134
+ Using ``__setitem__`` syntax overwrites fields that compare equal
135
+ case-insensitively in order to maintain ``dict``'s api. For fields that
136
+ compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add``
137
+ in a loop.
138
+
139
+ If multiple fields that are equal case-insensitively are passed to the
140
+ constructor or ``.update``, the behavior is undefined and some will be
141
+ lost.
142
+
143
+ >>> headers = HTTPHeaderDict()
144
+ >>> headers.add('Set-Cookie', 'foo=bar')
145
+ >>> headers.add('set-cookie', 'baz=quxx')
146
+ >>> headers['content-length'] = '7'
147
+ >>> headers['SET-cookie']
148
+ 'foo=bar, baz=quxx'
149
+ >>> headers['Content-Length']
150
+ '7'
151
+ """
152
+
153
+ def __init__(self, headers=None, **kwargs):
154
+ super(HTTPHeaderDict, self).__init__()
155
+ self._container = OrderedDict()
156
+ if headers is not None:
157
+ if isinstance(headers, HTTPHeaderDict):
158
+ self._copy_from(headers)
159
+ else:
160
+ self.extend(headers)
161
+ if kwargs:
162
+ self.extend(kwargs)
163
+
164
+ def __setitem__(self, key, val):
165
+ self._container[key.lower()] = [key, val]
166
+ return self._container[key.lower()]
167
+
168
+ def __getitem__(self, key):
169
+ val = self._container[key.lower()]
170
+ return ', '.join(val[1:])
171
+
172
+ def __delitem__(self, key):
173
+ del self._container[key.lower()]
174
+
175
+ def __contains__(self, key):
176
+ return key.lower() in self._container
177
+
178
+ def __eq__(self, other):
179
+ if not isinstance(other, Mapping) and not hasattr(other, 'keys'):
180
+ return False
181
+ if not isinstance(other, type(self)):
182
+ other = type(self)(other)
183
+ return (dict((k.lower(), v) for k, v in self.itermerged()) ==
184
+ dict((k.lower(), v) for k, v in other.itermerged()))
185
+
186
+ def __ne__(self, other):
187
+ return not self.__eq__(other)
188
+
189
+ if not PY3: # Python 2
190
+ iterkeys = MutableMapping.iterkeys
191
+ itervalues = MutableMapping.itervalues
192
+
193
+ __marker = object()
194
+
195
+ def __len__(self):
196
+ return len(self._container)
197
+
198
+ def __iter__(self):
199
+ # Only provide the originally cased names
200
+ for vals in self._container.values():
201
+ yield vals[0]
202
+
203
+ def pop(self, key, default=__marker):
204
+ '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
205
+ If key is not found, d is returned if given, otherwise KeyError is raised.
206
+ '''
207
+ # Using the MutableMapping function directly fails due to the private marker.
208
+ # Using ordinary dict.pop would expose the internal structures.
209
+ # So let's reinvent the wheel.
210
+ try:
211
+ value = self[key]
212
+ except KeyError:
213
+ if default is self.__marker:
214
+ raise
215
+ return default
216
+ else:
217
+ del self[key]
218
+ return value
219
+
220
+ def discard(self, key):
221
+ try:
222
+ del self[key]
223
+ except KeyError:
224
+ pass
225
+
226
+ def add(self, key, val):
227
+ """Adds a (name, value) pair, doesn't overwrite the value if it already
228
+ exists.
229
+
230
+ >>> headers = HTTPHeaderDict(foo='bar')
231
+ >>> headers.add('Foo', 'baz')
232
+ >>> headers['foo']
233
+ 'bar, baz'
234
+ """
235
+ key_lower = key.lower()
236
+ new_vals = [key, val]
237
+ # Keep the common case aka no item present as fast as possible
238
+ vals = self._container.setdefault(key_lower, new_vals)
239
+ if new_vals is not vals:
240
+ vals.append(val)
241
+
242
+ def extend(self, *args, **kwargs):
243
+ """Generic import function for any type of header-like object.
244
+ Adapted version of MutableMapping.update in order to insert items
245
+ with self.add instead of self.__setitem__
246
+ """
247
+ if len(args) > 1:
248
+ raise TypeError("extend() takes at most 1 positional "
249
+ "arguments ({0} given)".format(len(args)))
250
+ other = args[0] if len(args) >= 1 else ()
251
+
252
+ if isinstance(other, HTTPHeaderDict):
253
+ for key, val in other.iteritems():
254
+ self.add(key, val)
255
+ elif isinstance(other, Mapping):
256
+ for key in other:
257
+ self.add(key, other[key])
258
+ elif hasattr(other, "keys"):
259
+ for key in other.keys():
260
+ self.add(key, other[key])
261
+ else:
262
+ for key, value in other:
263
+ self.add(key, value)
264
+
265
+ for key, value in kwargs.items():
266
+ self.add(key, value)
267
+
268
+ def getlist(self, key, default=__marker):
269
+ """Returns a list of all the values for the named field. Returns an
270
+ empty list if the key doesn't exist."""
271
+ try:
272
+ vals = self._container[key.lower()]
273
+ except KeyError:
274
+ if default is self.__marker:
275
+ return []
276
+ return default
277
+ else:
278
+ return vals[1:]
279
+
280
+ # Backwards compatibility for httplib
281
+ getheaders = getlist
282
+ getallmatchingheaders = getlist
283
+ iget = getlist
284
+
285
+ # Backwards compatibility for http.cookiejar
286
+ get_all = getlist
287
+
288
+ def __repr__(self):
289
+ return "%s(%s)" % (type(self).__name__, dict(self.itermerged()))
290
+
291
+ def _copy_from(self, other):
292
+ for key in other:
293
+ val = other.getlist(key)
294
+ if isinstance(val, list):
295
+ # Don't need to convert tuples
296
+ val = list(val)
297
+ self._container[key.lower()] = [key] + val
298
+
299
+ def copy(self):
300
+ clone = type(self)()
301
+ clone._copy_from(self)
302
+ return clone
303
+
304
+ def iteritems(self):
305
+ """Iterate over all header lines, including duplicate ones."""
306
+ for key in self:
307
+ vals = self._container[key.lower()]
308
+ for val in vals[1:]:
309
+ yield vals[0], val
310
+
311
+ def itermerged(self):
312
+ """Iterate over all headers, merging duplicate ones together."""
313
+ for key in self:
314
+ val = self._container[key.lower()]
315
+ yield val[0], ', '.join(val[1:])
316
+
317
+ def items(self):
318
+ return list(self.iteritems())
319
+
320
+ @classmethod
321
+ def from_httplib(cls, message): # Python 2
322
+ """Read headers from a Python 2 httplib message object."""
323
+ # python2.7 does not expose a proper API for exporting multiheaders
324
+ # efficiently. This function re-reads raw lines from the message
325
+ # object and extracts the multiheaders properly.
326
+ obs_fold_continued_leaders = (' ', '\t')
327
+ headers = []
328
+
329
+ for line in message.headers:
330
+ if line.startswith(obs_fold_continued_leaders):
331
+ if not headers:
332
+ # We received a header line that starts with OWS as described
333
+ # in RFC-7230 S3.2.4. This indicates a multiline header, but
334
+ # there exists no previous header to which we can attach it.
335
+ raise InvalidHeader(
336
+ 'Header continuation with no previous header: %s' % line
337
+ )
338
+ else:
339
+ key, value = headers[-1]
340
+ headers[-1] = (key, value + ' ' + line.strip())
341
+ continue
342
+
343
+ key, value = line.split(':', 1)
344
+ headers.append((key, value.strip()))
345
+
346
+ return cls(headers)