Revision f0eacc2c pithos/lib/client.py

b/pithos/lib/client.py
33 33

  
34 34
from httplib import HTTPConnection, HTTP
35 35
from sys import stdin
36
from xml.dom import minidom
36 37

  
37 38
import json
38 39
import types
......
93 94
        kwargs['headers']['X-Auth-Token'] = self.token
94 95
        if body:
95 96
            kwargs['body'] = body
96
        else:
97
        elif 'content-type' not in kwargs['headers']:
97 98
            kwargs['headers']['content-type'] = ''
98 99
        kwargs['headers'].setdefault('content-length', len(body) if body else 0)
99 100
        kwargs['headers'].setdefault('content-type', 'application/octet-stream')
......
141 142
    def put(self, path, body=None, format='text', headers=None):
142 143
        return self._req('PUT', path, body, headers=headers, format=format)
143 144
    
144
    def _list(self, path, detail=False, params={}, **headers):
145
        format = 'json' if detail else 'text'
145
    def _list(self, path, format='text', params={}, **headers):
146 146
        status, headers, data = self.get(path, format=format, headers=headers,
147 147
                                         params=params)
148
        if detail:
148
        if format == 'json':
149 149
            data = json.loads(data) if data else ''
150
        elif format == 'xml':
151
            print '#', data
152
            data = minidom.parseString(data)
150 153
        else:
151 154
            data = data.strip().split('\n') if data else ''
152 155
        return data
......
178 181
        return ll
179 182
    
180 183
class OOS_Client(Client):
181
    """Openstack Objest Storage Client"""
184
    """Openstack Object Storage Client"""
182 185
    
183 186
    def _update_metadata(self, path, entity, **meta):
184 187
        """adds new and updates the values of previously set metadata"""
......
203 206
    
204 207
    # Storage Account Services
205 208
    
206
    def list_containers(self, detail=False, limit=10000, marker=None, params={},
209
    def list_containers(self, format='text', limit=10000, marker=None, params={},
207 210
                        **headers):
208 211
        """lists containers"""
209 212
        if not params:
210 213
            params = {}
211 214
        params.update({'limit':limit, 'marker':marker})
212
        return self._list('', detail, params, **headers)
215
        return self._list('', format, params, **headers)
213 216
    
214 217
    def retrieve_account_metadata(self, restricted=False, **params):
215 218
        """returns the account metadata"""
......
229 232
    def _filter_trashed(self, l):
230 233
        return self._filter(l, {'trash':'true'})
231 234
    
232
    def list_objects(self, container, detail=False, limit=10000, marker=None,
235
    def list_objects(self, container, format='text', limit=10000, marker=None,
233 236
                     prefix=None, delimiter=None, path=None,
234 237
                     include_trashed=False, params={}, **headers):
235 238
        """returns a list with the container objects"""
236 239
        params.update({'limit':limit, 'marker':marker, 'prefix':prefix,
237 240
                       'delimiter':delimiter, 'path':path})
238
        l = self._list('/' + container, detail, params, **headers)
239
        if not include_trashed:
241
        l = self._list('/' + container, format, params, **headers)
242
        #TODO support filter trashed with xml also
243
        if format != 'xml' and not include_trashed:
240 244
            l = self._filter_trashed(l)
241 245
        return l
242 246
    
......
272 276
    
273 277
    # Storage Object Services
274 278
    
275
    def request_object(self, container, object, detail=False, params={},
279
    def request_object(self, container, object, format='text', params={},
276 280
                        **headers):
277 281
        """returns tuple containing the status, headers and data response for an object request"""
278 282
        path = '/%s/%s' % (container, object)
279
        format = 'json' if detail else 'text' 
280 283
        status, headers, data = self.get(path, format, headers, params)
281 284
        return status, headers, data
282 285
    
283
    def retrieve_object(self, container, object, detail=False, params={},
286
    def retrieve_object(self, container, object, format='text', params={},
284 287
                             **headers):
285 288
        """returns an object's data"""
286
        t = self.request_object(container, object, detail, params, **headers)
289
        t = self.request_object(container, object, format, params, **headers)
287 290
        return t[2]
288 291
    
289 292
    def create_directory_marker(self, container, object):
......
469 472
        headers = {}
470 473
        prefix = 'x-%s-meta-' % entity
471 474
        for m in meta:
472
            headers['%s%s' % (prefix, m)] = None
475
            headers['%s%s' % (prefix, m)] = ''
473 476
        return self.post(path, headers=headers, params=params)
474 477
    
475 478
    # Storage Account Services
476 479
    
477
    def list_containers(self, detail=False, if_modified_since=None,
480
    def list_containers(self, format='text', if_modified_since=None,
478 481
                        if_unmodified_since=None, limit=1000, marker=None,
479 482
                        until=None):
480 483
        """returns a list with the account containers"""
481 484
        params = {'until':until} if until else None
482 485
        headers = {'if-modified-since':if_modified_since,
483 486
                   'if-unmodified-since':if_unmodified_since}
484
        return OOS_Client.list_containers(self, detail=detail, limit=limit,
487
        return OOS_Client.list_containers(self, format=format, limit=limit,
485 488
                                          marker=marker, params=params,
486 489
                                          **headers)
487 490
    
......
509 512
    
510 513
    # Storage Container Services
511 514
    
512
    def list_objects(self, container, detail=False, limit=10000, marker=None,
515
    def list_objects(self, container, format='text', limit=10000, marker=None,
513 516
                     prefix=None, delimiter=None, path=None,
514 517
                     include_trashed=False, params={}, if_modified_since=None,
515 518
                     if_unmodified_since=None, meta={}, until=None):
......
545 548
    
546 549
    # Storage Object Services
547 550
    
548
    def retrieve_object(self, container, object, params={}, detail=False, range=None,
551
    def retrieve_object(self, container, object, params={}, format='text', range=None,
549 552
                        if_range=None, if_match=None, if_none_match=None,
550 553
                        if_modified_since=None, if_unmodified_since=None,
551 554
                        **headers):
......
556 559
        l = [elem for elem in l if eval(elem)]
557 560
        for elem in l:
558 561
            headers.update({elem:eval(elem)})
559
        return OOS_Client.retrieve_object(self, container, object, detail=detail,
562
        return OOS_Client.retrieve_object(self, container, object, format=format,
560 563
                                          params=params, **headers)
561 564
    
562 565
    def retrieve_object_version(self, container, object, version, detail=False,

Also available in: Unified diff