users@jersey.java.net

evaluatePreconditions doesn't work

From: Hisaaki Sato <hisato_at_beacon-it.co.jp>
Date: Mon, 23 Feb 2009 14:46:31 +0900 (JST)

Hi,

I found an issue at the evaluatePreconditions method(ContainerRequest).
It seems re-evaluate after If-Unmodified-Since check and precondition failed(412).
This method should be as follows, I think.

public ResponseBuilder evaluatePreconditions(Date lastModified, EntityTag eTag) {
    String ifMatchHeader = getRequestHeaders().getFirst("If-Match");
    String ifNoneMatchHeader = getRequestHeaders().getFirst("If-None-Match");
    String ifUnmodifiedSinceHeader = getRequestHeaders().getFirst("If-Unmodified-Since");
    String ifModifiedSinceHeader = getRequestHeaders().getFirst("If-Modified-Since");
    long lastModifiedTime = lastModified.getTime();
    ResponseBuilder r = null;
    if (ifMatchHeader != null) {
        r = evaluateIfMatch(eTag);
        if (r != null)
            // 412 Precondition Failed
            return r;
    }
    if (ifUnmodifiedSinceHeader != null) {
         r = evaluateIfUnmodifiedSince(lastModifiedTime);
        if (r != null)
            // 412 Precondition Failed
            return r;
    }
    if (ifNoneMatchHeader != null) {
        r = evaluateIfNoneMatch(eTag);
        String httpMethod = getMethod();
        if (r == null || !(httpMethod.equals("GET") || httpMethod.equals("HEAD")))
            // 200 OK
            // 412 Precondition Failed
            return r;
    }
    if (ifModifiedSinceHeader != null) {
        if (r == null) {
            r = evaluateIfModifiedSince(lastModifiedTime);
        } else {
            // 304 Not modified
            // ETag already set by If-None-Match
            if (evaluateIfModifiedSince(lastModifiedTime) == null)
                r == null;
        }
    }
    return r;
}

Thanks,
Hisaaki Sato