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
Example #2
0
def get_mockdata_url(service_name, implementation_name, url, headers):
    """
    :param service_name:
        possible "spotseeker"
    :param implementation_name:
        possible values: "file", etc.
    """

    dir_base = dirname(__file__)
    __initialize_app_resource_dirs()

    RESOURCE_ROOT = abspath(dir_base + "/../resources/" + service_name + "/" +
                            implementation_name)

    file_path = None
    success = False
    start_time = time.time()

    for resource_dir in app_resource_dirs:
        response = _load_resource_from_path(resource_dir, service_name,
                                            implementation_name, url, headers)

        if response:
            return response

    # If no response has been found in any installed app, return a 404
    logger = logging.getLogger(__name__)
    logger.info(
        "404 for url %s, path: %s" %
        (url, "resources/%s/%s/%s" %
         (service_name, implementation_name, convert_to_platform_safe(url))))
    response = MockHTTP()
    response.status = 404
    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 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 _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 _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
Example #8
0
def delete_mockdata_url(service_name, implementation_name,
                        url, headers,
                        dir_base=dirname(__file__)):
    """
    :param service_name:
        possible "sws", "pws", "book", "hfs", etc.
    :param implementation_name:
        possible values: "file", etc.
    """
    # Http response code 204 No Content:
    # The server has fulfilled the request but does not need to
    # return an entity-body
    response = MockHTTP()
    response.status = 204

    return response
Example #9
0
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
Example #10
0
def delete_mockdata_url(service_name,
                        implementation_name,
                        url,
                        headers,
                        dir_base=dirname(__file__)):
    """
    :param service_name:
        possible "sws", "pws", "book", "hfs", etc.
    :param implementation_name:
        possible values: "file", etc.
    """
    # Http response code 204 No Content:
    # The server has fulfilled the request but does not need to
    # return an entity-body
    response = MockHTTP()
    response.status = 204

    return response
Example #11
0
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 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
Example #14
0
def get_mockdata_url(service_name, implementation_name,
                     url, headers):
    """
    :param service_name:
        possible "spotseeker"
    :param implementation_name:
        possible values: "file", etc.
    """

    dir_base = dirname(__file__)
    __initialize_app_resource_dirs()

    RESOURCE_ROOT = abspath(dir_base + "/../resources/" +
                            service_name + "/" + implementation_name)

    file_path = None
    success = False
    start_time = time.time()

    for resource_dir in app_resource_dirs:
        response = _load_resource_from_path(resource_dir, service_name,
                                            implementation_name, url, headers)

        if response:
            return response

    # If no response has been found in any installed app, return a 404
    logger = logging.getLogger(__name__)
    logger.info("404 for url %s, path: %s" %
                (url, "resources/%s/%s/%s" %
                 (service_name,
                  implementation_name,
                  convert_to_platform_safe(url))))
    response = MockHTTP()
    response.status = 404
    return response
Example #15
0
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
Example #16
0
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