Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8b9ad3b

Browse files
committed
compose urls in a cleaner way
1 parent 0a38299 commit 8b9ad3b

File tree

4 files changed

+49
-38
lines changed

4 files changed

+49
-38
lines changed

stream/client.py

+41-29
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
from stream.utils import validate_feed_slug, validate_user_id
1313
from requests import Request
1414

15+
try:
16+
from urllib.parse import urlparse
17+
except ImportError:
18+
from urlparse import urlparse
1519

1620
logger = logging.getLogger(__name__)
1721

@@ -51,13 +55,24 @@ def __init__(self, api_key, api_secret, app_id, version='v1.0', timeout=6.0, bas
5155
self.timeout = timeout
5256
self.location = location
5357

58+
self.base_domain_name = 'stream-io-api.com'
59+
self.api_location = location
60+
self.custom_api_port = None
61+
self.protocol = 'https'
62+
5463
if os.environ.get('LOCAL'):
55-
self.base_url = 'http://localhost:8000/api/'
64+
self.base_domain_name = 'localhost'
65+
self.protocol = 'http'
66+
self.custom_api_port = 8000
5667
self.timeout = 20
5768
elif base_url is not None:
58-
self.base_url = base_url
69+
parsed_url = urlparse(base_url)
70+
self.base_domain_name = parsed_url.hostname
71+
self.protocol = parsed_url.scheme
72+
self.custom_api_port = parsed_url.port
73+
self.api_location = ""
5974
elif location is not None:
60-
self.base_url = 'https://%s-api.stream-io-api.com/api/' % location
75+
self.location = location
6176

6277
self.base_analytics_url = 'https://analytics.stream-io-api.com/analytics/'
6378

@@ -107,23 +122,23 @@ def get_default_header(self):
107122
}
108123
return base_headers
109124

110-
def get_full_url(self, relative_url):
111-
url = self.base_url + self.version + '/' + relative_url
112-
return url
113-
114-
def get_full_personal_url(self, relative_url):
115-
base_url = self.base_url.split('.') # company.getstream.io
116-
if len(base_url) > 1:
117-
DNS_change = base_url[0] + '-personalization'
118-
base_url[0] = DNS_change
119-
base_url = '.'.join(base_url)
125+
def get_full_url(self, service_name, relative_url):
126+
if self.api_location:
127+
hostname = '%s-%s.%s' % (self.api_location, service_name, self.base_domain_name)
128+
elif service_name:
129+
hostname = '%s.%s' % (service_name, self.base_domain_name)
120130
else:
121-
base_url = self.base_url # if running on localhost
122-
url = base_url + 'personalization/' + relative_url + '/'
123-
return url
131+
hostname = self.base_domain_name
132+
133+
if self.base_domain_name == 'localhost':
134+
hostname = 'localhost'
135+
136+
base_url = "%s://%s" % (self.protocol, hostname)
124137

125-
def get_full_meta_url(self):
126-
url = self.base_url + 'personalization/' + self.version + '/meta/'
138+
if self.custom_api_port:
139+
base_url = "%s:%s" % (base_url, self.custom_api_port)
140+
141+
url = base_url + '/' + service_name + '/' + self.version + '/' + relative_url
127142
return url
128143

129144
def get_user_agent(self):
@@ -150,7 +165,7 @@ def _make_signed_request(self, method_name, relative_url, params=None, data=None
150165
headers['Date'] = date_header
151166
default_params = self.get_default_params()
152167
default_params.update(params)
153-
url = self.get_full_url(relative_url)
168+
url = self.get_full_url('api', relative_url)
154169
serialized = serializer.dumps(data)
155170
method = getattr(self.session, method_name)
156171
if method_name in ['post', 'put']:
@@ -176,7 +191,7 @@ def create_jwt_token(self, resource, action, feed_id=None, user_id=None):
176191
payload['user_id'] = user_id
177192
return jwt.encode(payload, self.api_secret).decode("utf-8")
178193

179-
def _make_request(self, method, relative_url, signature, personal=None, params=None, data=None):
194+
def _make_request(self, method, relative_url, signature, service_name='api', params=None, data=None):
180195
params = params or {}
181196
data = data or {}
182197
serialized = None
@@ -185,15 +200,12 @@ def _make_request(self, method, relative_url, signature, personal=None, params=N
185200
headers = self.get_default_header()
186201
headers['Authorization'] = signature
187202
headers['stream-auth-type'] = 'jwt'
188-
if personal is not None:
189-
if personal == 'personal':
190-
url = self.get_full_personal_url(relative_url)
191-
elif personal == 'meta':
192-
url = self.get_full_meta_url()
193-
else:
194-
raise Exception("keyword 'personal' must be None, personal, or meta")
195-
else:
196-
url = self.get_full_url(relative_url)
203+
204+
if not relative_url.endswith('/'):
205+
relative_url += '/'
206+
207+
url = self.get_full_url(service_name, relative_url)
208+
197209
if method.__name__ in ['post', 'put', 'delete']:
198210
serialized = serializer.dumps(data)
199211
response = method(url, data=serialized, headers=headers,

stream/collections.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
class Collections(object):
2+
23
def __init__(self, client, token):
34
"""
45
Used to manipulate data at the 'meta' endpoint
@@ -26,7 +27,7 @@ def upsert(self, collection_name, data):
2627

2728
data_json = {collection_name: data}
2829

29-
response = self.client.post('meta', personal='meta',
30+
response = self.client.post('meta/', service_name='personalization',
3031
signature=self.token, data={'data': data_json})
3132
return response
3233

@@ -52,7 +53,7 @@ def select(self, collection_name, ids):
5253
foreign_ids.append('%s:%s' % (collection_name, ids[i]))
5354
foreign_ids = ','.join(foreign_ids)
5455

55-
response = self.client.get('meta', personal='meta', params={'foreign_ids': foreign_ids},
56+
response = self.client.get('meta/', service_name='personalization', params={'foreign_ids': foreign_ids},
5657
signature=self.token)
5758

5859
return response
@@ -75,7 +76,7 @@ def delete(self, collection_name, ids):
7576

7677
data = {'collection_name': collection_name, 'ids': ids}
7778

78-
response = self.client.delete('meta', personal='meta', data=data,
79+
response = self.client.delete('meta/', service_name='personalization', data=data,
7980
signature=self.token)
8081

8182
return response

stream/personalization.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def get(self, resource, **params):
2020
personalization.get('follow_recommendations', user_id=123, limit=10, offset=10)
2121
"""
2222

23-
response = self.client.get(resource, personal='personal', params=params,
23+
response = self.client.get(resource, service_name='personalization', params=params,
2424
signature=self.token)
2525
return response
2626

@@ -39,7 +39,7 @@ def post(self, resource, **params):
3939

4040
data = params['data'] or None
4141

42-
response = self.client.post(resource, personal='personal', params=params,
42+
response = self.client.post(resource, service_name='personalization', params=params,
4343
signature=self.token, data=data)
4444
return response
4545

@@ -51,7 +51,7 @@ def delete(self, resource, **params):
5151
:return: data that was deleted if if successful or not.
5252
"""
5353

54-
response = self.client.delete(resource, personal='personal', params=params,
54+
response = self.client.delete(resource, service_name='personalization', params=params,
5555
signature=self.token)
5656

5757
return response

stream/tests.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,8 @@ def connect_debug():
4242
return stream.connect(
4343
key,
4444
secret,
45-
location='us-east',
45+
location='qa',
4646
timeout=30,
47-
base_url='https://qa.stream-io-api.com/api/',
48-
# base_url='http://localhost-api.getstream.io:8000/api/',
4947
)
5048

5149
client = connect_debug()

0 commit comments

Comments
 (0)