ifNoneMatch = getRequestHeaders().getIfNoneMatch();
ifNoneMatch = getRequestHeaders().getIfNoneMatch();
@Override public void handle(ServerHttpRequest request, ServerHttpResponse response) throws IOException { if (request.getMethod() != HttpMethod.GET) { sendMethodNotAllowed(response, HttpMethod.GET); return; } String content = String.format(IFRAME_CONTENT, getSockJsClientLibraryUrl()); byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8); StringBuilder builder = new StringBuilder("\"0"); DigestUtils.appendMd5DigestAsHex(contentBytes, builder); builder.append('"'); String etagValue = builder.toString(); List<String> ifNoneMatch = request.getHeaders().getIfNoneMatch(); if (!CollectionUtils.isEmpty(ifNoneMatch) && ifNoneMatch.get(0).equals(etagValue)) { response.setStatusCode(HttpStatus.NOT_MODIFIED); return; } response.getHeaders().setContentType(new MediaType("text", "html", StandardCharsets.UTF_8)); response.getHeaders().setContentLength(contentBytes.length); // No cache in order to check every time if IFrame are authorized addNoCacheHeaders(response); response.getHeaders().setETag(etagValue); response.getBody().write(contentBytes); } };
@Test public void ifNoneMatchList() { String ifNoneMatch1 = "\"v2.6\""; String ifNoneMatch2 = "\"v2.7\", \"v2.8\""; List<String> ifNoneMatchList = new ArrayList<>(2); ifNoneMatchList.add(ifNoneMatch1); ifNoneMatchList.add(ifNoneMatch2); headers.setIfNoneMatch(ifNoneMatchList); assertThat(headers.getIfNoneMatch(), Matchers.contains("\"v2.6\"", "\"v2.7\"", "\"v2.8\"")); assertEquals("Invalid If-None-Match header", "\"v2.6\", \"v2.7\", \"v2.8\"", headers.getFirst("If-None-Match")); }
@Test public void ifNoneMatchWildCard() { String ifNoneMatch = "*"; headers.setIfNoneMatch(ifNoneMatch); assertEquals("Invalid If-None-Match header", ifNoneMatch, headers.getIfNoneMatch().get(0)); assertEquals("Invalid If-None-Match header", "*", headers.getFirst("If-None-Match")); }
@Test public void ifNoneMatch() { String ifNoneMatch = "\"v2.6\""; headers.setIfNoneMatch(ifNoneMatch); assertEquals("Invalid If-None-Match header", ifNoneMatch, headers.getIfNoneMatch().get(0)); assertEquals("Invalid If-None-Match header", "\"v2.6\"", headers.getFirst("If-None-Match")); }
/** * Returns the {@link StatusAndHeaders} calculated from the given {@link HttpHeaders}, domain object and * {@link RootResourceInformation. * * @param requestHeaders must not be {@literal null}. * @param domainObject must not be {@literal null}. * @param entity must not be {@literal null}. * @return */ public StatusAndHeaders getStatusAndHeaders(HttpHeaders requestHeaders, Object domainObject, PersistentEntity<?, ?> entity) { Assert.notNull(requestHeaders, "Request headers must not be null!"); Assert.notNull(domainObject, "Domain object must not be null!"); Assert.notNull(entity, "PersistentEntity must not be null!"); Assert.isTrue(entity.getType().isInstance(domainObject), () -> String.format(INVALID_DOMAIN_OBJECT, domainObject, entity.getType())); // Check ETag for If-Non-Match List<String> ifNoneMatch = requestHeaders.getIfNoneMatch(); ETag eTag = ifNoneMatch.isEmpty() ? ETag.NO_ETAG : ETag.from(ifNoneMatch.get(0)); HttpHeaders responseHeaders = preparer.prepareHeaders(entity, domainObject); // Check last modification for If-Modified-Since return eTag.matches(entity, domainObject) || preparer.isObjectStillValid(domainObject, requestHeaders) ? StatusAndHeaders.notModified(responseHeaders) : StatusAndHeaders.modified(responseHeaders); }
@Test public void validateIfNoneMatchAsStringCollection() throws ParseException { HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper(); Map<String, Object> messageHeaders = new HashMap<String, Object>(); messageHeaders.put("If-None-Match", Arrays.asList("\"1234567\"", "\"123\"")); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getIfNoneMatch().size()); assertEquals("\"1234567\"", headers.getIfNoneMatch().get(0)); assertEquals("\"123\"", headers.getIfNoneMatch().get(1)); }
@Test public void validateIfNoneMatchAsStringArray() throws ParseException { HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper(); Map<String, Object> messageHeaders = new HashMap<String, Object>(); messageHeaders.put("If-None-Match", new String[] {"\"1234567\"", "\"123\""}); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getIfNoneMatch().size()); assertEquals("\"1234567\"", headers.getIfNoneMatch().get(0)); assertEquals("\"123\"", headers.getIfNoneMatch().get(1)); }
@Test public void validateIfNoneMatchAsDelimitedString() throws ParseException { HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper(); Map<String, Object> messageHeaders = new HashMap<String, Object>(); messageHeaders.put("If-None-Match", "\"123,4567\", \"123\""); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getIfNoneMatch().size()); assertEquals("\"123,4567\"", headers.getIfNoneMatch().get(0)); assertEquals("\"123\"", headers.getIfNoneMatch().get(1)); }
@Test public void validateIfNoneMatchAsCommaDelimitedString() throws ParseException { HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper(); Map<String, Object> messageHeaders = new HashMap<String, Object>(); messageHeaders.put("If-None-Match", "\"123.4567\", \"123\""); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getIfNoneMatch().size()); assertEquals("\"123.4567\"", headers.getIfNoneMatch().get(0)); assertEquals("\"123\"", headers.getIfNoneMatch().get(1)); }
@Test public void validateIfNoneMatch() throws ParseException { HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper(); Map<String, Object> messageHeaders = new HashMap<String, Object>(); messageHeaders.put("If-None-Match", "\"1234567\""); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(1, headers.getIfNoneMatch().size()); assertEquals("\"1234567\"", headers.getIfNoneMatch().get(0)); }
return source.getIfNoneMatch();
public static WonEtagHelper fromIfNoneMatchHeader(HttpHeaders headers){ List<String> etags = headers.getIfNoneMatch(); if (etags.size() == 0) return null; if (etags.size() > 1) { logger.info("found more than one If-None-Match header values, only using first one"); }; return fromEtagValue(etags.get(0)); }
ifNoneMatch = getRequestHeaders().getIfNoneMatch();
private boolean validateIfNoneMatch(@Nullable String etag) { if (!StringUtils.hasLength(etag)) { return false; } List<String> ifNoneMatch; try { ifNoneMatch = getRequestHeaders().getIfNoneMatch(); } catch (IllegalArgumentException ex) { return false; } if (ifNoneMatch.isEmpty()) { return false; } // We will perform this validation... etag = padEtagIfNecessary(etag); for (String clientEtag : ifNoneMatch) { // Compare weak/strong ETags as per https://tools.ietf.org/html/rfc7232#section-2.3 if (StringUtils.hasLength(clientEtag) && clientEtag.replaceFirst("^W/", "").equals(etag.replaceFirst("^W/", ""))) { this.notModified = true; break; } } return true; }
/** * Returns the {@link StatusAndHeaders} calculated from the given {@link HttpHeaders}, domain object and * {@link RootResourceInformation. * * @param requestHeaders must not be {@literal null}. * @param domainObject must not be {@literal null}. * @param entity must not be {@literal null}. * @return */ public StatusAndHeaders getStatusAndHeaders(HttpHeaders requestHeaders, Object domainObject, PersistentEntity<?, ?> entity) { Assert.notNull(requestHeaders, "Request headers must not be null!"); Assert.notNull(domainObject, "Domain object must not be null!"); Assert.notNull(entity, "PersistentEntity must not be null!"); Assert.isTrue(entity.getType().isInstance(domainObject), () -> String.format(INVALID_DOMAIN_OBJECT, domainObject, entity.getType())); // Check ETag for If-Non-Match List<String> ifNoneMatch = requestHeaders.getIfNoneMatch(); ETag eTag = ifNoneMatch.isEmpty() ? ETag.NO_ETAG : ETag.from(ifNoneMatch.get(0)); HttpHeaders responseHeaders = preparer.prepareHeaders(entity, domainObject); // Check last modification for If-Modified-Since return eTag.matches(entity, domainObject) || preparer.isObjectStillValid(domainObject, requestHeaders) ? StatusAndHeaders.notModified(responseHeaders) : StatusAndHeaders.modified(responseHeaders); }
@Override public void handle(ServerHttpRequest request, ServerHttpResponse response) throws IOException { if (request.getMethod() != HttpMethod.GET) { sendMethodNotAllowed(response, HttpMethod.GET); return; } String content = String.format(IFRAME_CONTENT, getSockJsClientLibraryUrl()); byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8); StringBuilder builder = new StringBuilder("\"0"); DigestUtils.appendMd5DigestAsHex(contentBytes, builder); builder.append('"'); String etagValue = builder.toString(); List<String> ifNoneMatch = request.getHeaders().getIfNoneMatch(); if (!CollectionUtils.isEmpty(ifNoneMatch) && ifNoneMatch.get(0).equals(etagValue)) { response.setStatusCode(HttpStatus.NOT_MODIFIED); return; } response.getHeaders().setContentType(new MediaType("text", "html", StandardCharsets.UTF_8)); response.getHeaders().setContentLength(contentBytes.length); // No cache in order to check every time if IFrame are authorized addNoCacheHeaders(response); response.getHeaders().setETag(etagValue); response.getBody().write(contentBytes); } };
@Override public void handle(ServerHttpRequest request, ServerHttpResponse response) throws IOException { if (request.getMethod() != HttpMethod.GET) { sendMethodNotAllowed(response, HttpMethod.GET); return; } String content = String.format(IFRAME_CONTENT, getSockJsClientLibraryUrl()); byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8); StringBuilder builder = new StringBuilder("\"0"); DigestUtils.appendMd5DigestAsHex(contentBytes, builder); builder.append('"'); String etagValue = builder.toString(); List<String> ifNoneMatch = request.getHeaders().getIfNoneMatch(); if (!CollectionUtils.isEmpty(ifNoneMatch) && ifNoneMatch.get(0).equals(etagValue)) { response.setStatusCode(HttpStatus.NOT_MODIFIED); return; } response.getHeaders().setContentType(new MediaType("text", "html", StandardCharsets.UTF_8)); response.getHeaders().setContentLength(contentBytes.length); // No cache in order to check every time if IFrame are authorized addNoCacheHeaders(response); response.getHeaders().setETag(etagValue); response.getBody().write(contentBytes); } };