Statistics
| Branch: | Tag: | Revision:

root / astakosclient / astakosclient / utils.py @ eefb7355

History | View | Annotate | Download (3 kB)

1
# Copyright (C) 2012, 2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from httplib import HTTPConnection, HTTPSConnection
35
from contextlib import closing
36

    
37
from objpool.http import PooledHTTPConnection
38
from astakosclient.errors import AstakosClientException
39

    
40

    
41
def retry(func):
42
    def decorator(self, *args, **kwargs):
43
        attemps = 0
44
        while True:
45
            try:
46
                return func(self, *args, **kwargs)
47
            except AstakosClientException as err:
48
                is_last_attempt = attemps == self.retry
49
                if is_last_attempt:
50
                    raise err
51
                if err.status == 401 or err.status == 404:
52
                    # In case of Unauthorized response
53
                    # or Not Found return immediately
54
                    raise err
55
                self.logger.info("AstakosClient request failed..retrying")
56
                attemps += 1
57
    return decorator
58

    
59

    
60
def scheme_to_class(scheme, use_pool, pool_size):
61
    """Return the appropriate conn class for given scheme"""
62
    def _objpool(netloc):
63
        return PooledHTTPConnection(
64
            netloc=netloc, scheme=scheme, size=pool_size)
65

    
66
    def _http_connection(netloc):
67
        return closing(HTTPConnection(netloc))
68

    
69
    def _https_connection(netloc):
70
        return closing(HTTPSConnection(netloc))
71

    
72
    if scheme == "http":
73
        if use_pool:
74
            return _objpool
75
        else:
76
            return _http_connection
77
    elif scheme == "https":
78
        if use_pool:
79
            return _objpool
80
        else:
81
            return _https_connection
82
    else:
83
        return None