restygwt/src/main/java/org/fusesource/restygwt/client/callback/CachingCallbackFilter.java
@Override
    public RequestCallback filter(Method method, Response response, RequestCallback callback) {
        int code = response.getStatusCode();

        final CacheKey ck = cacheKey(method.builder);
        final List<RequestCallback> removedCallbacks = cache.removeCallbacks(ck);

        if (removedCallbacks != null) {
            callback = new RequestCallback() {
                @Override
                public void onResponseReceived(Request request, Response response) {
                    if (GWT.isClient() && LogConfiguration.loggingIsEnabled()) {
                        Logger.getLogger(CachingCallbackFilter.class.getName())
                            .finer("call " + removedCallbacks.size() + " more queued callbacks for " + ck);
                    }

                    // call all callbacks found in cache
                    for (RequestCallback cb : removedCallbacks) {
                        cb.onResponseReceived(request, response);
                    }
                }

                @Override
                public void onError(Request request, Throwable exception) {
                    if (LogConfiguration.loggingIsEnabled()) {
                        Logger.getLogger(CachingCallbackFilter.class.getName()).severe(
                            "cannot call " + (removedCallbacks.size() + 1) + " callbacks for " + ck +
                                " due to error: " + exception.getMessage());
                    }

                    if (LogConfiguration.loggingIsEnabled()) {
                        Logger.getLogger(CachingCallbackFilter.class.getName())
                            .finer("call " + removedCallbacks.size() + " more queued callbacks for " + ck);
                    }

                    // and all the others, found in cache
                    for (RequestCallback cb : removedCallbacks) {
                        cb.onError(request, exception);
                    }
                }
            };
        } else {
            if (GWT.isClient() && LogConfiguration.loggingIsEnabled()) {
                Logger.getLogger(CachingCallbackFilter.class.getName())
                    .finer("removed one or no " + "callback for cachekey " + ck);
            }
        }

        if (isCachingStatusCode(code)) {
            cacheResult(method, response);
            return callback;
        }

        if (GWT.isClient() && LogConfiguration.loggingIsEnabled()) {
            Logger.getLogger(CachingCallbackFilter.class.getName())
                .info("cannot cache due to invalid response code: " + code);
        }
        return callback;
    }
@Override
    public RequestCallback filter(Method method, Response response, RequestCallback callback) {
        int code = response.getStatusCode();

        final CacheKey ck = cacheKey(method.builder);
        final List<RequestCallback> removedCallbacks = cache.removeCallbacks(ck);

        if (removedCallbacks != null) {
            callback = new RequestCallback() {
                @Override
                public void onResponseReceived(Request request, Response response) {
                    if (GWT.isClient() && LogConfiguration.loggingIsEnabled()) {
                        Logger.getLogger(CachingCallbackFilter.class.getName())
                            .finer("call " + removedCallbacks.size() + " more queued callbacks for " + ck);
                    }

                    // call all callbacks found in cache
                    for (RequestCallback cb : removedCallbacks) {
                        cb.onResponseReceived(request, response);
                    }
                }

                @Override
                public void onError(Request request, Throwable exception) {
                    if (LogConfiguration.loggingIsEnabled()) {
                        Logger.getLogger(CachingCallbackFilter.class.getName()).severe(
                            "cannot call " + (removedCallbacks.size() + 1) + " callbacks for " + ck +
                                " due to error: " + exception.getMessage());
                    }

                    if (LogConfiguration.loggingIsEnabled()) {
                        Logger.getLogger(CachingCallbackFilter.class.getName())
                            .finer("call " + removedCallbacks.size() + " more queued callbacks for " + ck);
                    }

                    // and all the others, found in cache
                    for (RequestCallback cb : removedCallbacks) {
                        cb.onError(request, exception);
                    }
                }
            };
        } else {
            if (GWT.isClient() && LogConfiguration.loggingIsEnabled()) {
                Logger.getLogger(CachingCallbackFilter.class.getName())
                    .finer("removed one or no " + "callback for cachekey " + ck);
            }
        }

        if (isCachingStatusCode(code)) {
            cacheResult(method, response);
            return callback;
        }

        if (GWT.isClient() && LogConfiguration.loggingIsEnabled()) {
            Logger.getLogger(CachingCallbackFilter.class.getName())
                .info("cannot cache due to invalid response code: " + code);
        }
        return callback;
    }
the real filter method, called independent of the response code

TODO method.getResponse() is not equal to response. unfortunately