summaryrefslogtreecommitdiff
path: root/requests-0.14.0/requests/safe_mode.py
blob: 0fb8d7052adcb894d940db7874e633ed934dfcdb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# -*- coding: utf-8 -*-

"""
requests.safe_mode
~~~~~~~~~~~~

This module contains a decorator that implements safe_mode.

:copyright: (c) 2012 by Kenneth Reitz.
:license: ISC, see LICENSE for more details.

"""

from .models import Response
from .packages.urllib3.response import HTTPResponse
from .exceptions import RequestException, ConnectionError, HTTPError
import socket


def catch_exceptions_if_in_safe_mode(function):
    """New implementation of safe_mode. We catch all exceptions at the API level
    and then return a blank Response object with the error field filled. This decorator
    wraps request() in api.py.
    """

    def wrapped(method, url, **kwargs):
        # if save_mode, we catch exceptions and fill error field
        if (kwargs.get('config') and kwargs.get('config').get('safe_mode')) or (kwargs.get('session')
                                            and kwargs.get('session').config.get('safe_mode')):
            try:
                return function(method, url, **kwargs)
            except (RequestException, ConnectionError, HTTPError,
                    socket.timeout, socket.gaierror) as e:
                r = Response()
                r.error = e
                r.raw = HTTPResponse()  # otherwise, tests fail
                r.status_code = 0  # with this status_code, content returns None
                return r
        return function(method, url, **kwargs)
    return wrapped