Beispiel #1
0
def validate_matching_preconditions(request, meta):
    """Check that the ETag conforms with the preconditions set."""

    etag = meta['hash'] if not UPDATE_MD5 else meta['checksum']
    if not etag:
        etag = None

    if_match = request.META.get('HTTP_IF_MATCH')
    if if_match is not None:
        if etag is None:
            raise faults.PreconditionFailed('Resource does not exist')
        if (if_match != '*'
                and etag not in [x.lower() for x in parse_etags(if_match)]):
            raise faults.PreconditionFailed('Resource ETag does not match')

    if_none_match = request.META.get('HTTP_IF_NONE_MATCH')
    if if_none_match is not None:
        # TODO: If this passes, must ignore If-Modified-Since header.
        if etag is not None:
            if (if_none_match == '*' or etag in [x.lower() for x in
                                                 parse_etags(if_none_match)]):
                # TODO: Continue if an If-Modified-Since header is present.
                if request.method in ('HEAD', 'GET'):
                    raise faults.NotModified('Resource ETag matches')
                raise faults.PreconditionFailed(
                    'Resource exists or ETag matches')
Beispiel #2
0
def validate_modification_preconditions(request, meta):
    """Check the modified timestamp conforms with the preconditions set."""

    if 'modified' not in meta:
        return  # TODO: Always return?

    if_modified_since = request.META.get('HTTP_IF_MODIFIED_SINCE')
    if if_modified_since is not None:
        if_modified_since = parse_http_date_safe(if_modified_since)
    if (if_modified_since is not None
            and int(meta['modified']) <= if_modified_since):
        raise faults.NotModified('Resource has not been modified')

    if_unmodified_since = request.META.get('HTTP_IF_UNMODIFIED_SINCE')
    if if_unmodified_since is not None:
        if_unmodified_since = parse_http_date_safe(if_unmodified_since)
    if (if_unmodified_since is not None
            and int(meta['modified']) > if_unmodified_since):
        raise faults.PreconditionFailed('Resource has been modified')