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
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)
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)
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)