|
1 | 1 | import collections |
2 | | -import requests |
3 | 2 | import uuid |
4 | 3 | from six import iteritems |
5 | | -from six.moves.urllib.parse import urlparse |
6 | 4 |
|
7 | 5 | from contextlib import contextmanager |
8 | 6 |
|
9 | 7 |
|
10 | 8 | from kinto_client import utils |
| 9 | +from kinto_client.session import create_session, Session |
11 | 10 | from kinto_client.batch import Batch |
12 | 11 | from kinto_client.exceptions import BucketNotFound, KintoException |
13 | 12 |
|
|
27 | 26 | DO_NOT_OVERWRITE = {'If-None-Match': '*'} |
28 | 27 |
|
29 | 28 |
|
30 | | -def create_session(server_url=None, auth=None, session=None): |
31 | | - """Returns a session from the passed arguments. |
32 | | -
|
33 | | - :param server_url: |
34 | | - The URL of the server to use, with the prefix. |
35 | | - :param auth: |
36 | | - A requests authentication policy object. |
37 | | - :param session: |
38 | | - An optional session object to use, rather than creating a new one. |
39 | | - """ |
40 | | - # XXX Refactor the create_session to take place in the caller objects. |
41 | | - # E.g. test if the session exists before calling create_session. |
42 | | - if session is not None and ( |
43 | | - server_url is not None or auth is not None): |
44 | | - msg = ("You cannot specify session and server_url or auth. " |
45 | | - "Chose either session or (auth + server_url).") |
46 | | - raise AttributeError(msg) |
47 | | - if session is None and server_url is None and auth is None: |
48 | | - msg = ("You need to either set session or auth + server_url") |
49 | | - raise AttributeError(msg) |
50 | | - if session is None: |
51 | | - session = Session(server_url=server_url, auth=auth) |
52 | | - return session |
53 | | - |
54 | | - |
55 | 29 | class Endpoints(object): |
56 | 30 | endpoints = { |
57 | 31 | 'root': '{root}/', |
@@ -81,66 +55,26 @@ def get(self, endpoint, **kwargs): |
81 | 55 | field=','.join(e.args))) |
82 | 56 |
|
83 | 57 |
|
84 | | -class Session(object): |
85 | | - """Handles all the interactions with the network. |
86 | | - """ |
87 | | - def __init__(self, server_url, auth=None): |
88 | | - self.server_url = server_url |
89 | | - self.auth = auth |
90 | | - |
91 | | - def request(self, method, endpoint, data=None, permissions=None, |
92 | | - payload=None, **kwargs): |
93 | | - parsed = urlparse(endpoint) |
94 | | - if not parsed.scheme: |
95 | | - actual_url = utils.urljoin(self.server_url, endpoint) |
96 | | - else: |
97 | | - actual_url = endpoint |
98 | | - |
99 | | - if self.auth is not None: |
100 | | - kwargs.setdefault('auth', self.auth) |
101 | | - |
102 | | - payload = payload or {} |
103 | | - # if data is not None: |
104 | | - payload['data'] = data or {} |
105 | | - if permissions is not None: |
106 | | - if hasattr(permissions, 'as_dict'): |
107 | | - permissions = permissions.as_dict() |
108 | | - payload['permissions'] = permissions |
109 | | - if payload: |
110 | | - payload_kwarg = 'data' if 'files' in kwargs else 'json' |
111 | | - kwargs.setdefault(payload_kwarg, payload) |
112 | | - resp = requests.request(method, actual_url, **kwargs) |
113 | | - if not (200 <= resp.status_code < 400): |
114 | | - message = '{0} - {1}'.format(resp.status_code, resp.json()) |
115 | | - exception = KintoException(message) |
116 | | - exception.request = resp.request |
117 | | - exception.response = resp |
118 | | - raise exception |
119 | | - |
120 | | - if resp.status_code == 304: |
121 | | - body = None |
122 | | - else: |
123 | | - body = resp.json() |
124 | | - # XXX Add the status code. |
125 | | - return body, resp.headers |
126 | | - |
127 | | - |
128 | 58 | class Client(object): |
129 | 59 |
|
130 | 60 | def __init__(self, server_url=None, session=None, auth=None, |
131 | | - bucket="default", collection=None): |
| 61 | + bucket="default", collection=None, retry=0, retry_after=None): |
132 | 62 | self.endpoints = Endpoints() |
133 | | - self.session = create_session(server_url, auth, session) |
| 63 | + self.session_kwargs = dict(server_url=server_url, |
| 64 | + auth=auth, |
| 65 | + session=session, |
| 66 | + retry=retry, |
| 67 | + retry_after=retry_after) |
| 68 | + self.session = create_session(**self.session_kwargs) |
134 | 69 | self._bucket_name = bucket |
135 | 70 | self._collection_name = collection |
136 | 71 | self._server_settings = None |
137 | 72 |
|
138 | 73 | def clone(self, **kwargs): |
139 | | - return Client(**{ |
140 | | - 'session': kwargs.get('session', self.session), |
141 | | - 'bucket': kwargs.get('bucket', self._bucket_name), |
142 | | - 'collection': kwargs.get('collection', self._collection_name), |
143 | | - }) |
| 74 | + kwargs.setdefault('session', self.session) |
| 75 | + kwargs.setdefault('bucket', self._bucket_name) |
| 76 | + kwargs.setdefault('collection', self._collection_name) |
| 77 | + return Client(**kwargs) |
144 | 78 |
|
145 | 79 | @contextmanager |
146 | 80 | def batch(self, **kwargs): |
|
0 commit comments