def __call__(self, request):
        '''Handler method for middleware

        Args:
            request: Django's request object.

        Returns:
            Response passed by next middleware or view.

        '''

        try:
            response = self.get_response(request)

            if isinstance(response, HttpResponseNotAllowed):
                raise MethodNotAllowed

            if isinstance(response, (HttpResponse, StreamingHttpResponse)):
                return response
            else:
                return JsonResponse(response)

        except HttpError as e:
            return e.response

        except Exception as e:
            traceback.print_exc()

            # send default error response hiding sensitive exception details
            return InternalServerError().response
def http_server_error_view(request, *args, **kwargs):
    '''View handler for http 500 server error
    '''
    request_id = str(uuid4())
    request_epoch = time.time() * 1000

    request_parameters = resolve(request.path_info)
    request.url_info = {
        'kwargs': request_parameters.kwargs,
        'url_name': request_parameters.url_name,
        'app_names': request_parameters.app_names,
        'app_name': request_parameters.app_name,
        'namespaces': request_parameters.namespaces,
        'namespace': request_parameters.namespace,
        'view_name': request_parameters.view_name
    }

    log_request(request_id, request, request_epoch,
                request_parameters.view_name)

    response = InternalServerError().response

    log_response(request_id, request, request_epoch, response)

    return response
    def __call__(self, request):
        '''Handler method for middleware

        Args:
            request: Django's request object.

        Returns:
            Response passed by next middleware or view.

        '''

        try:
            response = self.get_response(request)

            if isinstance(response, HttpResponseNotAllowed):
                raise MethodNotAllowed

            if isinstance(response, (HttpResponse, StreamingHttpResponse)):
                return response
            else:
                return JsonResponse(response)

        except HttpError as e:
            return e.response

        except Exception as e:
            request_id = str(uuid4())
            setattr(request, 'request_id', request_id)
            # log unhandled exception
            error = traceback.format_exc()
            log = '{uuid} :: \n{traceback}\n\n---------------------------------------------------------'.format(
                uuid=request.request_id,
                traceback=error
            )
            error_logger.error(log)
            traceback.print_exc()

            # send default error response hiding sensitive exception details
            return InternalServerError().response
Exemple #4
0
def make_session_request(url,
                         method,
                         params=None,
                         headers=None,
                         data=None,
                         json=None,
                         timeout=20,
                         files=None,
                         request_id=None,
                         cookies=None,
                         content_type=None):
    '''Make external request to a URL using python's request module.

    Args:
        url: URL of the request.
        method: method of the request.
        params: (optional) Dictionary or bytes to be sent in the query string.
        headers: (optional) Dictionary of HTTP Headers to send.
        data: (optional) Dictionary or list of tuples, bytes, or file-like object to send in the body.
        json: (optional) A JSON serializable Python object to send in the body.
        timeout: (optional) How many seconds to wait for the server to send data.
        files: (optional) File object.
        request_id: Id of request
        cookies: Cookies for api sessiom
        content_type: content type of response

    Returns:
        A tuple containing response of the request in JSON format, binary format and HTTP code of the response and
        message of the error in making request (if any).
    '''
    request_id = request_id or str(uuid4())
    response_json = {}
    response_content = None
    response_code = None
    error = None

    req = {}

    if headers:
        req.update({'headers': headers})

    if params:
        req.update({'params': params})

    if data:
        req.update({'data': data})

    if json:
        req.update({'json': json})

    if timeout:
        req.update({'timeout': timeout})

    if cookies:
        req.update({'cookies': cookies})

    request_dict = deepcopy(req)
    if files:

        req.update({'files': files})

        files_req = {key: value.name for (key, value) in files.items()}

        request_dict.update({'files': files_req})

    app_logger.info('API_REQUEST',
                    extra={
                        'meta': {
                            'logType': 'APP',
                            'requestPath': url,
                            'requestMethod': method,
                            'requestDict': ujson.dumps(request_dict),
                            'requestId': request_id
                        }
                    })

    try:
        request_epoch = time.time() * 1000

        response = requests.request(method, url, **req)
        response_epoch = time.time() * 1000
        response_content = response.content
        response_text = response.text
        response_code = response.status_code

        app_logger.info(
            'API_RESPONSE',
            extra={
                'meta': {
                    'logType':
                    'APP',
                    'responseCode':
                    response_code,
                    'responseTime':
                    str(response_epoch - request_epoch),
                    'responseContent':
                    (response_content if
                     (int(response_code / 100) != 2
                      or settings.DEBUG) else b'{}').decode('utf-8'),
                    'requestId':
                    request_id
                }
            })
        if content_type == 'application/json':
            response_json = response.json()

    except ValueError:
        app_logger.exception('API_ERROR')
        raise InternalServerError()

    except requests.exceptions.ReadTimeout:
        app_logger.exception('API_TIMEOUT_ERROR')
        raise GatewayTimeout()

    except Exception as e:
        app_logger.exception('API_ERROR')
        raise InternalServerError()

    return (response_json, response_content, response_code, response.cookies,
            error)
Exemple #5
0
def make_auth_request(url,
                      method,
                      params=None,
                      headers=None,
                      data=None,
                      json=None,
                      timeout=20,
                      files=None,
                      request_mask_map=None,
                      request_id=None):
    '''Make external auth request to a URL using python's request module without logging the request data.

    Args:
        url: URL of the request.
        method: method of the request.
        params: (optional) Dictionary or bytes to be sent in the query string.
        headers: (optional) Dictionary of HTTP Headers to send.
        data: (optional) Dictionary or list of tuples, bytes, or file-like object to send in the body.
        json: (optional) A JSON serializable Python object to send in the body.
        timeout: (optional) How many seconds to wait for the server to send data.
        request_mask_map: Dictionary of request objects which needs to be hidden. (Level 1 hiding only)
        eg - {
            'params' : ['key1', 'key2']
        }

    Returns:
        A tuple containing response of the request in JSON format, binary format and HTTP code of the response and
        message of the error in making request (if any).
    '''

    request_id = request_id or str(uuid4())
    response_json = {}
    response_content = None
    response_code = None
    error = None

    req = {}

    if headers:
        req.update({'headers': headers})

    if timeout:
        req.update({'timeout': timeout})

    if params:
        req.update({'params': params})

    if data:
        req.update({'data': data})

    if json:
        req.update({'json': json})

    request_data = deepcopy(req)

    try:
        if request_mask_map:
            for request_attr, hidden_key_list in request_mask_map.items():
                for hidden_key in hidden_key_list:
                    if request_data.get(request_attr,
                                        {}).get(hidden_key, None):
                        request_data[request_attr][hidden_key] = '## HIDDEN ##'
    except Exception:
        app_logger.exception('API_ERROR_WHILE_MASKING')

    app_logger.info('API_REQUEST',
                    extra={
                        'meta': {
                            'requestPath': url,
                            'requestMethod': method,
                            'requestDict': ujson.dumps(request_data),
                            'requestId': request_id
                        }
                    })

    try:
        request_epoch = time.time() * 1000
        response = requests.request(method, url, **req)
        response_epoch = time.time() * 1000
        if not response.content:
            response_json = {}
            response_content = b'{}'

            if int(response.status_code) == 500:
                response_json = {
                    "statusCode": 500,
                    "error": {
                        "message":
                        "Looks like something went wrong! Please try again.\nIf the issue persists please contact support."
                    }
                }
                response_content = b'{"statusCode": 500,"error": {"message": "Looks like something went wrong! Please try again.\nIf the issue persists please contact }'
        else:
            response_json = response.json()
            response_content = response.content

        response_code = response.status_code

        app_logger.info(
            'API_RESPONSE',
            extra={
                'meta': {
                    'responseCode':
                    response_code,
                    'responseTime':
                    str(response_epoch - request_epoch),
                    'responseContent':
                    (response_content if
                     (int(response_code / 100) != 2
                      or settings.DEBUG) else b'{}').decode('utf-8'),
                    'requestId':
                    request_id
                }
            })

    except ValueError:
        app_logger.exception('API_ERROR')
        raise InternalServerError()

    except requests.exceptions.ReadTimeout:
        app_logger.exception('API_TIMEOUT_ERROR')
        raise GatewayTimeout()

    except Exception as e:
        app_logger.exception('API_ERROR')
        raise InternalServerError()

    return (response_json, response_content, response_code, error)
Exemple #6
0
def make_basic_authorization_request(url,
                                     method,
                                     params=None,
                                     headers=None,
                                     data=None,
                                     json=None,
                                     timeout=20,
                                     files=None):
    '''Make external basic authorized request to a URL using python's request module without logging the request data.

    Args:
        url: URL of the request.
        method: method of the request.
        params: (optional) Dictionary or bytes to be sent in the query string.
        headers: (optional) Dictionary of HTTP Headers to send.
        data: (optional) Dictionary or list of tuples, bytes, or file-like object to send in the body.
        json: (optional) A JSON serializable Python object to send in the body.
        timeout: (optional) How many seconds to wait for the server to send data.
        files: (optional) File object.

    Returns:
        A tuple containing response of the request in JSON format, binary format and HTTP code of the response and
        message of the error in making request (if any).
    '''

    request_id = str(uuid4())
    response_json = {}
    response_content = None
    response_code = None
    error = None

    req = {}

    if headers:
        req.update({'headers': headers})

    if timeout:
        req.update({'timeout': timeout})

    if params:
        req.update({'params': params})

    if data:
        req.update({'data': data})

    if json:
        req.update({'json': json})

    request_data = dict(req)

    if request_data.get('headers', {}).get('Authorization'):
        request_data.update({'headers': {'Authorization': '## HIDDEN ##'}})

    if files:
        req.update({'files': files})

        if isinstance(files, list):
            files_req = {}
            for file in files:
                if isinstance(file[1], tuple):
                    files_req.setdefault(file[1][0], []).append(file[1][1])
                else:
                    files_req.setdefault(file[0], []).append(file[1].name)
        else:
            files_req = {key: value.name for (key, value) in files.items()}

        request_data.update({'files': ''})

    app_logger.info('API_REQUEST',
                    extra={
                        'meta': {
                            'logType': 'APP',
                            'requestPath': url,
                            'requestMethod': method,
                            'requestDict': ujson.dumps(request_data),
                            'requestId': request_id
                        }
                    })

    try:
        request_epoch = time.time() * 1000
        response = requests.request(method, url, **req)
        response_epoch = time.time() * 1000
        if not response.content:
            response_json = {}
            response_content = b'{}'

            if int(response.status_code) == 500:
                response_json = {
                    "statusCode": 500,
                    "error": {
                        "message":
                        "Looks like something went wrong! Please try again.\nIf the issue persists please contact support."
                    }
                }
                response_content = b'{"statusCode": 500,"error": {"message": "Looks like something went wrong! Please try again.\nIf the issue persists please contact }'
        else:
            response_json = response.json()
            response_content = response.content

        response_code = response.status_code

        app_logger.info(
            'API_RESPONSE',
            extra={
                'meta': {
                    'logType':
                    'APP',
                    'responseCode':
                    response_code,
                    'responseTime':
                    str(response_epoch - request_epoch),
                    'responseContent':
                    (response_content if
                     (int(response_code / 100) != 2
                      or settings.DEBUG) else b'{}').decode('utf-8'),
                    'requestId':
                    request_id
                }
            })

    except ValueError:
        app_logger.exception('API_ERROR')
        raise InternalServerError()

    except requests.exceptions.ReadTimeout:
        app_logger.exception('API_TIMEOUT_ERROR')
        raise GatewayTimeout()

    except Exception as e:
        app_logger.exception('API_ERROR')
        raise InternalServerError()

    return (response_json, response_content, response_code, error)