Skip to content

Commit 4dfcd74

Browse files
authored
fix(client): EDDSA signing with POST methods (sammchardy#1506)
* fix(client): EDDSA signing with POST methods * try fix tests
1 parent 10f3986 commit 4dfcd74

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

binance/async_client.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,23 @@ async def _request(
128128
uri = f"{uri}?{kwargs['params']}"
129129
kwargs.pop("params")
130130

131+
data = kwargs.get("data")
132+
if data is not None:
133+
del kwargs["data"]
134+
135+
if signed and self.PRIVATE_KEY and data: # handle issues with signing using eddsa/rsa and POST requests
136+
dict_data = Client.convert_to_dict(data)
137+
signature = dict_data["signature"] if "signature" in dict_data else None
138+
if signature:
139+
del dict_data["signature"]
140+
url_encoded_data = urlencode(dict_data)
141+
data = f"{url_encoded_data}&signature={signature}"
142+
131143
async with getattr(self.session, method)(
132144
yarl.URL(uri, encoded=True),
133145
proxy=self.https_proxy,
134146
headers=headers,
147+
data=data,
135148
**kwargs,
136149
) as response:
137150
self.response = response

binance/base_client.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,11 @@ def _rsa_signature(self, query_string: str):
312312
def encode_uri_component(uri, safe="~()*!.'"):
313313
return _urlencode.quote(uri, safe=safe)
314314

315+
@staticmethod
316+
def convert_to_dict(list_tuples):
317+
dictionary = dict((key, value) for key, value in list_tuples)
318+
return dictionary
319+
315320
def _ed25519_signature(self, query_string: str):
316321
assert self.PRIVATE_KEY
317322
res = b64encode(

binance/client.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,19 @@ def _request(
7171

7272
kwargs = self._get_request_kwargs(method, signed, force_params, **kwargs)
7373

74-
self.response = getattr(self.session, method)(uri, headers=headers, **kwargs)
74+
data = kwargs.get("data")
75+
if data is not None:
76+
del kwargs["data"]
77+
78+
if signed and self.PRIVATE_KEY and data: # handle issues with signing using eddsa/rsa and POST requests
79+
dict_data = Client.convert_to_dict(data)
80+
signature = dict_data["signature"] if "signature" in dict_data else None
81+
if signature:
82+
del dict_data["signature"]
83+
url_encoded_data = urlencode(dict_data)
84+
data = f"{url_encoded_data}&signature={signature}"
85+
86+
self.response = getattr(self.session, method)(uri, headers=headers, data=data, **kwargs)
7587
return self._handle_response(self.response)
7688

7789
@staticmethod

0 commit comments

Comments
 (0)