天择加密量化开放框架下载
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

349 lines
12 KiB

1 year ago
  1. # coding: utf-8
  2. """
  3. Gate API v4
  4. Welcome to Gate.io API APIv4 provides spot, margin and futures trading operations. There are public APIs to retrieve the real-time market statistics, and private APIs which needs authentication to trade on user's behalf. # noqa: E501
  5. Contact: support@mail.gate.io
  6. Generated by: https://openapi-generator.tech
  7. """
  8. from __future__ import absolute_import
  9. import io
  10. import json
  11. import logging
  12. import re
  13. import ssl
  14. import certifi
  15. # python 2 and python 3 compatibility library
  16. import six
  17. from six.moves.urllib.parse import urlencode
  18. import urllib3
  19. from gate_api.exceptions import ApiException, ApiValueError
  20. logger = logging.getLogger(__name__)
  21. class RESTResponse(io.IOBase):
  22. def __init__(self, resp):
  23. self.urllib3_response = resp
  24. self.status = resp.status
  25. self.reason = resp.reason
  26. self.data = resp.data
  27. def getheaders(self):
  28. """Returns a dictionary of the response headers."""
  29. return self.urllib3_response.getheaders()
  30. def getheader(self, name, default=None):
  31. """Returns a given response header."""
  32. return self.urllib3_response.getheader(name, default)
  33. class RESTClientObject(object):
  34. def __init__(self, configuration, pools_size=4, maxsize=None):
  35. # urllib3.PoolManager will pass all kw parameters to connectionpool
  36. # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501
  37. # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501
  38. # maxsize is the number of requests to host that are allowed in parallel # noqa: E501
  39. # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501
  40. # cert_reqs
  41. if configuration.verify_ssl:
  42. cert_reqs = ssl.CERT_REQUIRED
  43. else:
  44. cert_reqs = ssl.CERT_NONE
  45. # ca_certs
  46. if configuration.ssl_ca_cert:
  47. ca_certs = configuration.ssl_ca_cert
  48. else:
  49. # if not set certificate file, use Mozilla's root certificates.
  50. ca_certs = certifi.where()
  51. addition_pool_args = {}
  52. if configuration.assert_hostname is not None:
  53. addition_pool_args['assert_hostname'] = configuration.assert_hostname # noqa: E501
  54. if configuration.retries is not None:
  55. addition_pool_args['retries'] = configuration.retries
  56. if maxsize is None:
  57. if configuration.connection_pool_maxsize is not None:
  58. maxsize = configuration.connection_pool_maxsize
  59. else:
  60. maxsize = 4
  61. # https pool manager
  62. if configuration.proxy:
  63. self.pool_manager = urllib3.ProxyManager(
  64. num_pools=pools_size,
  65. maxsize=maxsize,
  66. cert_reqs=cert_reqs,
  67. ca_certs=ca_certs,
  68. cert_file=configuration.cert_file,
  69. key_file=configuration.key_file,
  70. proxy_url=configuration.proxy,
  71. proxy_headers=configuration.proxy_headers,
  72. **addition_pool_args
  73. )
  74. else:
  75. self.pool_manager = urllib3.PoolManager(
  76. num_pools=pools_size,
  77. maxsize=maxsize,
  78. cert_reqs=cert_reqs,
  79. ca_certs=ca_certs,
  80. cert_file=configuration.cert_file,
  81. key_file=configuration.key_file,
  82. **addition_pool_args
  83. )
  84. def request(
  85. self,
  86. method,
  87. url,
  88. query_params=None,
  89. headers=None,
  90. body=None,
  91. post_params=None,
  92. _preload_content=True,
  93. _request_timeout=None,
  94. ):
  95. """Perform requests.
  96. :param method: http request method
  97. :param url: http request url
  98. :param query_params: query parameters in the url
  99. :param headers: http request headers
  100. :param body: request json body, for `application/json`
  101. :param post_params: request post parameters,
  102. `application/x-www-form-urlencoded`
  103. and `multipart/form-data`
  104. :param _preload_content: if False, the urllib3.HTTPResponse object will
  105. be returned without reading/decoding response
  106. data. Default is True.
  107. :param _request_timeout: timeout setting for this request. If one
  108. number provided, it will be total request
  109. timeout. It can also be a pair (tuple) of
  110. (connection, read) timeouts.
  111. """
  112. method = method.upper()
  113. assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', 'PATCH', 'OPTIONS']
  114. if post_params and body:
  115. raise ApiValueError("body parameter cannot be used with post_params parameter.")
  116. post_params = post_params or {}
  117. headers = headers or {}
  118. timeout = None
  119. if _request_timeout:
  120. if isinstance(_request_timeout, (int,) if six.PY3 else (int, long)): # noqa: E501,F821
  121. timeout = urllib3.Timeout(total=_request_timeout)
  122. elif isinstance(_request_timeout, tuple) and len(_request_timeout) == 2:
  123. timeout = urllib3.Timeout(connect=_request_timeout[0], read=_request_timeout[1])
  124. if 'Content-Type' not in headers:
  125. headers['Content-Type'] = 'application/json'
  126. try:
  127. # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE`
  128. if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']:
  129. if query_params:
  130. url += '?' + urlencode(query_params)
  131. if re.search('json', headers['Content-Type'], re.IGNORECASE):
  132. request_body = None
  133. if body is not None:
  134. request_body = json.dumps(body)
  135. r = self.pool_manager.request(
  136. method,
  137. url,
  138. body=request_body,
  139. preload_content=_preload_content,
  140. timeout=timeout,
  141. headers=headers,
  142. )
  143. elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501
  144. r = self.pool_manager.request(
  145. method,
  146. url,
  147. fields=post_params,
  148. encode_multipart=False,
  149. preload_content=_preload_content,
  150. timeout=timeout,
  151. headers=headers,
  152. )
  153. elif headers['Content-Type'] == 'multipart/form-data':
  154. # must del headers['Content-Type'], or the correct
  155. # Content-Type which generated by urllib3 will be
  156. # overwritten.
  157. del headers['Content-Type']
  158. r = self.pool_manager.request(
  159. method,
  160. url,
  161. fields=post_params,
  162. encode_multipart=True,
  163. preload_content=_preload_content,
  164. timeout=timeout,
  165. headers=headers,
  166. )
  167. # Pass a `string` parameter directly in the body to support
  168. # other content types than Json when `body` argument is
  169. # provided in serialized form
  170. elif isinstance(body, str) or isinstance(body, bytes):
  171. request_body = body
  172. r = self.pool_manager.request(
  173. method,
  174. url,
  175. body=request_body,
  176. preload_content=_preload_content,
  177. timeout=timeout,
  178. headers=headers,
  179. )
  180. else:
  181. # Cannot generate the request from given parameters
  182. msg = """Cannot prepare a request message for provided
  183. arguments. Please check that your arguments match
  184. declared content type."""
  185. raise ApiException(status=0, reason=msg)
  186. # For `GET`, `HEAD`
  187. else:
  188. r = self.pool_manager.request(
  189. method, url, fields=query_params, preload_content=_preload_content, timeout=timeout, headers=headers
  190. )
  191. except urllib3.exceptions.SSLError as e:
  192. msg = "{0}\n{1}".format(type(e).__name__, str(e))
  193. raise ApiException(status=0, reason=msg)
  194. if _preload_content:
  195. r = RESTResponse(r)
  196. # log response body
  197. logger.debug("response body: %s", r.data)
  198. if not 200 <= r.status <= 299:
  199. raise ApiException(http_resp=r)
  200. return r
  201. def GET(self, url, headers=None, query_params=None, _preload_content=True, _request_timeout=None):
  202. return self.request(
  203. "GET",
  204. url,
  205. headers=headers,
  206. _preload_content=_preload_content,
  207. _request_timeout=_request_timeout,
  208. query_params=query_params,
  209. )
  210. def HEAD(self, url, headers=None, query_params=None, _preload_content=True, _request_timeout=None):
  211. return self.request(
  212. "HEAD",
  213. url,
  214. headers=headers,
  215. _preload_content=_preload_content,
  216. _request_timeout=_request_timeout,
  217. query_params=query_params,
  218. )
  219. def OPTIONS(
  220. self,
  221. url,
  222. headers=None,
  223. query_params=None,
  224. post_params=None,
  225. body=None,
  226. _preload_content=True,
  227. _request_timeout=None,
  228. ):
  229. return self.request(
  230. "OPTIONS",
  231. url,
  232. headers=headers,
  233. query_params=query_params,
  234. post_params=post_params,
  235. _preload_content=_preload_content,
  236. _request_timeout=_request_timeout,
  237. body=body,
  238. )
  239. def DELETE(self, url, headers=None, query_params=None, body=None, _preload_content=True, _request_timeout=None):
  240. return self.request(
  241. "DELETE",
  242. url,
  243. headers=headers,
  244. query_params=query_params,
  245. _preload_content=_preload_content,
  246. _request_timeout=_request_timeout,
  247. body=body,
  248. )
  249. def POST(
  250. self,
  251. url,
  252. headers=None,
  253. query_params=None,
  254. post_params=None,
  255. body=None,
  256. _preload_content=True,
  257. _request_timeout=None,
  258. ):
  259. return self.request(
  260. "POST",
  261. url,
  262. headers=headers,
  263. query_params=query_params,
  264. post_params=post_params,
  265. _preload_content=_preload_content,
  266. _request_timeout=_request_timeout,
  267. body=body,
  268. )
  269. def PUT(
  270. self,
  271. url,
  272. headers=None,
  273. query_params=None,
  274. post_params=None,
  275. body=None,
  276. _preload_content=True,
  277. _request_timeout=None,
  278. ):
  279. return self.request(
  280. "PUT",
  281. url,
  282. headers=headers,
  283. query_params=query_params,
  284. post_params=post_params,
  285. _preload_content=_preload_content,
  286. _request_timeout=_request_timeout,
  287. body=body,
  288. )
  289. def PATCH(
  290. self,
  291. url,
  292. headers=None,
  293. query_params=None,
  294. post_params=None,
  295. body=None,
  296. _preload_content=True,
  297. _request_timeout=None,
  298. ):
  299. return self.request(
  300. "PATCH",
  301. url,
  302. headers=headers,
  303. query_params=query_params,
  304. post_params=post_params,
  305. _preload_content=_preload_content,
  306. _request_timeout=_request_timeout,
  307. body=body,
  308. )