def processResponse(self, service, url, response): query = CacheEntryTimed.objects.filter(service=service, url=url) cache_entry = CacheEntryTimed() if len(query): cache_entry = query[0] if response.status == 304: if cache_entry is None: raise Exception("304, but no content??") response = MockHTTP() response.status = cache_entry.status response.data = cache_entry.content response.headers = cache_entry.headers return {"response": response} else: now = make_aware(datetime.now(), get_current_timezone()) cache_entry.service = service cache_entry.url = url cache_entry.status = response.status cache_entry.content = response.data cache_entry.headers = response.headers cache_entry.time_saved = now store_cache_entry(cache_entry) return
def post_mockdata_url(service_name, implementation_name, url, headers, body, dir_base=dirname(__file__)): """ :param service_name: possible "sws", "pws", "book", "hfs", etc. :param implementation_name: possible values: "file", etc. """ # Currently this post method does not return a response body response = MockHTTP() if body is not None: if "dispatch" in url: response.status = 200 else: response.status = 201 response.headers = { "X-Data-Source": service_name + " file mock data", "Content-Type": headers['Content-Type'] } else: response.status = 400 response.data = "Bad Request: no POST body" return response
def _response_from_cache(self, service, url, headers, max_age_in_seconds, max_error_age=60 * 5): # If max_age_in_seconds is 0, # make sure we don't get a hit from this same second. if not max_age_in_seconds: return None now = make_aware(datetime.now(), get_current_timezone()) time_limit = now - timedelta(seconds=max_age_in_seconds) query = CacheEntryTimed.objects.filter(service=service, url=url, time_saved__gte=time_limit) if len(query): hit = query[0] if hit.status != 200 and ( now - timedelta(seconds=max_error_age) > hit.time_saved): return None response = MockHTTP() response.status = hit.status response.data = hit.content response.headers = hit.getHeaders() return { "response": response, } return None
def _response_from_cache(self, service, url, headers, max_age_in_seconds, max_error_age=60 * 5): # If max_age_in_seconds is 0, # make sure we don't get a hit from this same second. if not max_age_in_seconds: return None now = make_aware(datetime.now(), get_current_timezone()) time_limit = now - timedelta(seconds=max_age_in_seconds) query = CacheEntryTimed.objects.filter(service=service, url=url, time_saved__gte=time_limit) if len(query): hit = query[0] if hit.status != 200 and (now - timedelta(seconds=max_error_age) > hit.time_saved): return None response = MockHTTP() response.status = hit.status response.data = hit.content response.headers = hit.getHeaders() return { "response": response, } return None
def _process_response(self, service, url, response, overwrite_success_with_error_at=60 * 60 * 8): now = make_aware(datetime.now(), get_current_timezone()) query = CacheEntryTimed.objects.filter(service=service, url=url) cache_entry = None if len(query): cache_entry = query[0] else: cache_entry = CacheEntryTimed() if response.status != 200: # Only override a successful cache entry with an error if the # Successful entry is older than 8 hours - MUWM-509 if cache_entry.id is not None and cache_entry.status == 200: save_delta = now - cache_entry.time_saved extended_cache_delta = timedelta( seconds=overwrite_success_with_error_at) if save_delta < extended_cache_delta: response = MockHTTP() response.status = cache_entry.status response.data = cache_entry.content return {"response": response} cache_entry.service = service cache_entry.url = url cache_entry.status = response.status cache_entry.content = response.data # This extra step is needed w/ Live resources because # HTTPHeaderDict isn't serializable. header_data = {} for header in response.headers: header_data[header] = response.getheader(header) cache_entry.headers = header_data cache_entry.time_saved = now try: store_cache_entry(cache_entry) except Exception as ex: # If someone beat us in to saving a cache entry, that's ok. # We just need a very recent entry. return return
def put_mockdata_url(service_name, implementation_name, url, headers, body, dir_base=dirname(__file__)): """ :param service_name: possible "sws", "pws", "book", "hfs", etc. :param implementation_name: possible values: "file", etc. """ # Currently this put method does not return a response body response = MockHTTP() if body is not None: response.status = 204 response.headers = {"X-Data-Source": service_name + " file mock data", "Content-Type": headers['Content-Type']} else: response.status = 400 response.data = "Bad Request: no POST body" return response
def getCache(self, service, url, headers): now = make_aware(datetime.now(), get_current_timezone()) time_limit = now - timedelta(seconds=60) query = CacheEntry.objects.filter(service=service, url=url) if len(query): hit = query[0] response = MockHTTP() response.status = hit.status response.data = hit.content hit_headers = hit.getHeaders() if "ETag" in hit_headers: headers["If-None-Match"] = hit_headers["ETag"] return None
def _load_resource_from_path(resource_dir, service_name, implementation_name, url, headers): RESOURCE_ROOT = os.path.join(resource_dir['path'], service_name, implementation_name) app = resource_dir['app'] if url == "///": # Just a placeholder to put everything else in an else. # If there are things that need dynamic work, they'd go here pass else: orig_file_path = RESOURCE_ROOT + url unquoted = unquote(orig_file_path) paths = [ convert_to_platform_safe(orig_file_path), "%s/index.html" % (convert_to_platform_safe(orig_file_path)), orig_file_path, "%s/index.html" % orig_file_path, convert_to_platform_safe(unquoted), "%s/index.html" % (convert_to_platform_safe(unquoted)), unquoted, "%s/index.html" % unquoted, ] file_path = None handle = None for path in paths: try: file_path = path handle = open(path) break except IOError as ex: pass if handle is None: return None logger = logging.getLogger(__name__) logger.debug("URL: %s; App: %s; File: %s" % (url, app, file_path)) response = MockHTTP() response.status = 200 response.data = handle.read() response.headers = { "X-Data-Source": service_name + " file mock data", } try: headers = open(handle.name + '.http-headers') file_values = json.loads(headers.read()) if "headers" in file_values: response.headers = dict(response.headers.items() + file_values['headers'].items()) if 'status' in file_values: response.status = file_values['status'] else: response.headers = dict(response.headers.items() + file_values.items()) except IOError: pass return response
def _load_resource_from_path(resource_dir, service_name, implementation_name, url, headers): RESOURCE_ROOT = os.path.join(resource_dir['path'], service_name, implementation_name) app = resource_dir['app'] if url == "///": # Just a placeholder to put everything else in an else. # If there are things that need dynamic work, they'd go here pass else: orig_file_path = RESOURCE_ROOT + url unquoted = unquote(orig_file_path) paths = [ convert_to_platform_safe(orig_file_path), "%s/index.html" % (convert_to_platform_safe(orig_file_path)), orig_file_path, "%s/index.html" % orig_file_path, convert_to_platform_safe(unquoted), "%s/index.html" % (convert_to_platform_safe(unquoted)), unquoted, "%s/index.html" % unquoted, ] file_path = None handle = None for path in paths: try: file_path = path handle = open(path) break except IOError as ex: pass if handle is None: return None logger = logging.getLogger(__name__) logger.debug("URL: %s; App: %s; File: %s" % (url, app, file_path)) response = MockHTTP() response.status = 200 response.data = handle.read() response.headers = {"X-Data-Source": service_name + " file mock data", } try: headers = open(handle.name + '.http-headers') file_values = json.loads(headers.read()) if "headers" in file_values: response.headers = dict(response.headers.items() + file_values['headers'].items()) if 'status' in file_values: response.status = file_values['status'] else: response.headers = dict(response.headers.items() + file_values.items()) except IOError: pass return response