Skip to content

Commit 10c0002

Browse files
Merge pull request woocommerce#9 from norbert-sebok/master
Keeps the filter[*] parameters in the original order, closes woocommerce#8
2 parents baf03ca + e4092b4 commit 10c0002

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

tests.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
""" API Tests """
22
import unittest
33
import woocommerce
4+
from woocommerce import oauth
45
from httmock import all_requests, HTTMock
56

67

@@ -116,3 +117,20 @@ def woo_test_mock(*args, **kwargs):
116117
# call requests
117118
status = self.api.delete("products").status_code
118119
self.assertEqual(status, 200)
120+
121+
def test_oauth_sorted_params(self):
122+
""" Test order of parameters for OAuth signature """
123+
def check_sorted(keys, expected):
124+
params = oauth.OrderedDict()
125+
for key in keys:
126+
params[key] = ''
127+
128+
ordered = list(oauth.OAuth.sorted_params(params).keys())
129+
self.assertEqual(ordered, expected)
130+
131+
check_sorted(['a', 'b'], ['a', 'b'])
132+
check_sorted(['b', 'a'], ['a', 'b'])
133+
check_sorted(['a', 'b[a]', 'b[b]', 'b[c]', 'c'], ['a', 'b[a]', 'b[b]', 'b[c]', 'c'])
134+
check_sorted(['a', 'b[c]', 'b[a]', 'b[b]', 'c'], ['a', 'b[c]', 'b[a]', 'b[b]', 'c'])
135+
check_sorted(['d', 'b[c]', 'b[a]', 'b[b]', 'c'], ['b[c]', 'b[a]', 'b[b]', 'c', 'd'])
136+
check_sorted(['a1', 'b[c]', 'b[a]', 'b[b]', 'a2'], ['a1', 'a2', 'b[c]', 'b[a]', 'b[b]'])

woocommerce/oauth.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def __init__(self, url, consumer_key, consumer_secret, **kwargs):
3939

4040
def get_oauth_url(self):
4141
""" Returns the URL with OAuth params """
42-
params = {}
42+
params = OrderedDict()
4343

4444
if "?" in self.url:
4545
url = self.url[:self.url.find("?")]
@@ -68,8 +68,8 @@ def generate_oauth_signature(self, params, url):
6868
del params["oauth_signature"]
6969

7070
base_request_uri = quote(url, "")
71+
params = self.sorted_params(params)
7172
params = self.normalize_parameters(params)
72-
params = OrderedDict(sorted(params.items()))
7373
query_params = ["{param_key}%3D{param_value}".format(param_key=key, param_value=value)
7474
for key, value in params.items()]
7575

@@ -88,11 +88,23 @@ def generate_oauth_signature(self, params, url):
8888

8989
return b64encode(hash_signature).decode("utf-8").replace("\n", "")
9090

91+
@staticmethod
92+
def sorted_params(params):
93+
ordered = OrderedDict()
94+
base_keys = sorted(set(k.split('[')[0] for k in params.keys()))
95+
96+
for base in base_keys:
97+
for key in params.keys():
98+
if key == base or key.startswith(base + '['):
99+
ordered[key] = params[key]
100+
101+
return ordered
102+
91103
@staticmethod
92104
def normalize_parameters(params):
93105
""" Normalize parameters """
94106
params = params or {}
95-
normalized_parameters = {}
107+
normalized_parameters = OrderedDict()
96108

97109
def get_value_like_as_php(val):
98110
""" Prepare value for quote """

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy