Best Python code snippet using localstack_python
aws_responses.py
Source:aws_responses.py
...39 code = 40440 def __init__(self, message=None):41 message = message or "The given resource cannot be found"42 super(ResourceNotFoundException, self).__init__("ResourceNotFoundException", message)43def flask_error_response_json(44 msg: str, code: Optional[int] = 500, error_type: Optional[str] = "InternalFailure"45):46 result = {47 "Type": "User" if code < 500 else "Server",48 "message": msg,49 "__type": error_type,50 }51 headers = {"x-amzn-errortype": error_type}52 # Note: don't use flask's make_response(..) or jsonify(..) here as they53 # can lead to "RuntimeError: working outside of application context".54 return FlaskResponse(json.dumps(result), status=code, headers=headers)55def requests_error_response_json(message, code=500, error_type="InternalFailure"):56 response = flask_error_response_json(message, code=code, error_type=error_type)57 return flask_to_requests_response(response)58def requests_error_response_xml(59 message: str,60 code: Optional[int] = 400,61 code_string: Optional[str] = "InvalidParameter",62 service: Optional[str] = None,63 xmlns: Optional[str] = None,64):65 response = RequestsResponse()66 xmlns = xmlns or "http://%s.amazonaws.com/doc/2010-03-31/" % service67 response._content = """<ErrorResponse xmlns="{xmlns}"><Error>68 <Type>Sender</Type>69 <Code>{code_string}</Code>70 <Message>{message}</Message>71 </Error><RequestId>{req_id}</RequestId>72 </ErrorResponse>""".format(73 xmlns=xmlns, message=message, code_string=code_string, req_id=short_uid()74 )75 response.status_code = code76 return response77def to_xml(data: dict, memberize: bool = True) -> ET.Element:78 """Generate XML element hierarchy out of dict. Wraps list items in <member> tags by default"""79 if not isinstance(data, dict) or len(data.keys()) != 1:80 raise Exception("Expected data to be a dict with a single root element")81 def _to_xml(parent_el: ET.Element, data_rest) -> None:82 if isinstance(data_rest, list):83 for i in data_rest:84 member_el = ET.SubElement(parent_el, "member") if memberize else parent_el85 _to_xml(member_el, i)86 elif isinstance(data_rest, dict):87 for key in data_rest:88 value = data_rest[key]89 curr_el = ET.SubElement(parent_el, key)90 _to_xml(curr_el, value)91 elif isinstance(data_rest, str):92 parent_el.text = data_rest93 elif any(94 isinstance(data_rest, i) for i in [bool, str, int, float]95 ): # limit types for text serialization96 parent_el.text = str(data_rest)97 else:98 if data_rest is not None: # None is just ignored and omitted99 raise Exception(f"Unexpected type for value encountered: {type(data_rest)}")100 root_key = list(data.keys())[0]101 root = ET.Element(root_key)102 _to_xml(root, data[root_key])103 return root104def requests_response_xml(action, response, xmlns=None, service=None, memberize=True):105 xmlns = xmlns or "http://%s.amazonaws.com/doc/2010-03-31/" % service106 response = json_safe(response)107 response = {"{action}Result".format(action=action): response}108 response = ET.tostring(to_xml(response, memberize=memberize), short_empty_elements=True)109 response = to_str(response)110 result = (111 """112 <{action}Response xmlns="{xmlns}">113 {response}114 </{action}Response>115 """116 ).strip()117 result = result.format(action=action, xmlns=xmlns, response=response)118 result = requests_response(result)119 return result120def requests_error_response_xml_signature_calculation(121 message,122 string_to_sign=None,123 signature=None,124 expires=None,125 code=400,126 code_string="AccessDenied",127 aws_access_token="temp",128):129 response = RequestsResponse()130 response_template = """<?xml version="1.0" encoding="UTF-8"?>131 <Error>132 <Code>{code_string}</Code>133 <Message>{message}</Message>134 <RequestId>{req_id}</RequestId>135 <HostId>{host_id}</HostId>136 </Error>""".format(137 message=message,138 code_string=code_string,139 req_id=short_uid(),140 host_id=short_uid(),141 )142 parsed_response = xmltodict.parse(response_template)143 response.status_code = code144 if signature and string_to_sign or code_string == "SignatureDoesNotMatch":145 bytes_signature = binascii.hexlify(bytes(signature, encoding="utf-8"))146 parsed_response["Error"]["Code"] = code_string147 parsed_response["Error"]["AWSAccessKeyId"] = aws_access_token148 parsed_response["Error"]["StringToSign"] = string_to_sign149 parsed_response["Error"]["SignatureProvided"] = signature150 parsed_response["Error"]["StringToSignBytes"] = "{}".format(bytes_signature.decode("utf-8"))151 set_response_content(response, xmltodict.unparse(parsed_response))152 if expires and code_string == "AccessDenied":153 server_time = datetime.datetime.utcnow().isoformat()[:-4]154 expires_isoformat = datetime.datetime.fromtimestamp(int(expires)).isoformat()[:-4]155 parsed_response["Error"]["Code"] = code_string156 parsed_response["Error"]["Expires"] = "{}Z".format(expires_isoformat)157 parsed_response["Error"]["ServerTime"] = "{}Z".format(server_time)158 set_response_content(response, xmltodict.unparse(parsed_response))159 if not signature and not expires and code_string == "AccessDenied":160 set_response_content(response, xmltodict.unparse(parsed_response))161 if response._content:162 return response163def flask_error_response_xml(164 message: str,165 code: Optional[int] = 500,166 code_string: Optional[str] = "InternalFailure",167 service: Optional[str] = None,168 xmlns: Optional[str] = None,169):170 response = requests_error_response_xml(171 message, code=code, code_string=code_string, service=service, xmlns=xmlns172 )173 return requests_to_flask_response(response)174def requests_error_response(175 req_headers: Dict,176 message: Union[str, bytes],177 code: int = 500,178 error_type: str = "InternalFailure",179 service: str = None,180 xmlns: str = None,181):182 is_json = is_json_request(req_headers)183 if is_json:184 return requests_error_response_json(message=message, code=code, error_type=error_type)185 return requests_error_response_xml(186 message, code=code, code_string=error_type, service=service, xmlns=xmlns187 )188def is_json_request(req_headers: Dict) -> bool:189 ctype = req_headers.get("Content-Type", "")190 accept = req_headers.get("Accept", "")191 return "json" in ctype or "json" in accept192def is_invalid_html_response(headers, content) -> bool:193 content_type = headers.get("Content-Type", "")194 return "text/html" in content_type and not str_startswith_ignore_case(content, "<!doctype html")195def raise_exception_if_error_response(response):196 if not is_response_obj(response):197 return198 if response.status_code < 400:199 return200 content = "..."201 try:202 content = truncate(to_str(response.content or ""))203 except Exception:204 pass # ignore if content has non-printable bytes205 raise Exception("Received error response (code %s): %s" % (response.status_code, content))206def is_response_obj(result, include_lambda_response=False):207 types = (RequestsResponse, FlaskResponse)208 if include_lambda_response:209 types += (LambdaResponse,)210 return isinstance(result, types)211def get_response_payload(response, as_json=False):212 result = (213 response.content214 if isinstance(response, RequestsResponse)215 else response.data216 if isinstance(response, FlaskResponse)217 else None218 )219 result = "" if result is None else result220 if as_json:221 result = result or "{}"222 result = json.loads(to_str(result))223 return result224def requests_response(content, status_code=200, headers=None):225 if headers is None:226 headers = {}227 resp = RequestsResponse()228 headers = CaseInsensitiveDict(dict(headers or {}))229 if isinstance(content, dict):230 content = json.dumps(content)231 if not headers.get(HEADER_CONTENT_TYPE):232 headers[HEADER_CONTENT_TYPE] = APPLICATION_JSON233 resp._content = content234 resp.status_code = int(status_code)235 # Note: update headers (instead of assigning directly), to ensure we're using a case-insensitive dict236 resp.headers.update(headers)237 return resp238def request_response_stream(stream, status_code=200, headers=None):239 if headers is None:240 headers = {}241 resp = RequestsResponse()242 resp.raw = stream243 resp.status_code = int(status_code)244 # Note: update headers (instead of assigning directly), to ensure we're using a case-insensitive dict245 resp.headers.update(headers or {})246 return resp247def flask_to_requests_response(r):248 return requests_response(r.data, status_code=r.status_code, headers=r.headers)249def requests_to_flask_response(r):250 return FlaskResponse(r.content, status=r.status_code, headers=dict(r.headers))251def flask_not_found_error(msg=None):252 msg = msg or "The specified resource doesnt exist."253 return flask_error_response_json(msg, code=404, error_type="ResourceNotFoundException")254def response_regex_replace(response, search, replace):255 content = re.sub(search, replace, to_str(response._content), flags=re.DOTALL | re.MULTILINE)256 set_response_content(response, content)257def set_response_content(response, content, headers=None):258 if isinstance(content, dict):259 content = json.dumps(json_safe(content))260 elif isinstance(content, RequestsResponse):261 response.status_code = content.status_code262 content = content.content263 response._content = content or ""264 response.headers.update(headers or {})265 response.headers["Content-Length"] = str(len(response._content))266def make_requests_error(*args, **kwargs):267 return flask_to_requests_response(flask_error_response_xml(*args, **kwargs))...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!