public static void addDateHeaderIfRequired(HttpServerExchange exchange) { HeaderMap responseHeaders = exchange.getResponseHeaders(); if (exchange.getConnection().getUndertowOptions().get(UndertowOptions.ALWAYS_SET_DATE, true) && !responseHeaders.contains(Headers.DATE)) { long time = System.nanoTime(); if (time < nextUpdateTime) { responseHeaders.put(Headers.DATE, cachedDateString); } else { long realTime = System.currentTimeMillis(); String dateString = DateUtils.toDateString(new Date(realTime)); cachedDateString = dateString; nextUpdateTime = time + 1000000000; responseHeaders.put(Headers.DATE, dateString); } } }
/** * Get the set of names for all text headers * * @param caseInsensitive {@code true} if names should be added in a case insensitive * @return The set of names for all text headers */ public Set<AsciiString> names(boolean caseInsensitive) { final Set<AsciiString> names = caseInsensitive ? new TreeSet<AsciiString>(AsciiString.CASE_INSENSITIVE_ORDER) : new LinkedHashSet<AsciiString>(size()); headers.forEachName( new HeaderMap.NameVisitor() { @Override public boolean visit(CharSequence name) { names.add((AsciiString) name); return true; } }); return names; }
@Override public BinaryHeaders forEachEntry(final BinaryHeaders.BinaryHeaderVisitor visitor) { headers.forEachEntry( new HeaderMap.EntryVisitor() { @Override public boolean visit(Entry<CharSequence, CharSequence> entry) { try { return visitor.visit((AsciiString) entry.getKey(), (AsciiString) entry.getValue()); } catch (Exception e) { PlatformDependent.throwException(e); return false; } } }); return this; }
@Override public List<Map.Entry<AsciiString, AsciiString>> entries() { int size = size(); @SuppressWarnings("unchecked") final Map.Entry<AsciiString, AsciiString>[] all = new Map.Entry[size]; headers.forEachEntry( new HeaderMap.EntryVisitor() { int cnt; @Override public boolean visit(Entry<CharSequence, CharSequence> entry) { all[cnt++] = new AsciiStringHeaderEntry(entry); return true; } }); return Arrays.asList(all); }
@Override public boolean remove(AsciiString name) { return headers.remove(name); }
@Override public BinaryHeaders add(AsciiString name, AsciiString... values) { headers.add(name, values); return this; }
@Override public BinaryHeaders add(AsciiString name, Iterable<AsciiString> values) { headers.add(name, values); return this; }
@Override public Set<AsciiString> names() { return names(headers.isIgnoreCase()); }
public boolean contains(AsciiString name, AsciiString value, boolean ignoreCase) { return headers.contains(name, value); }
@Override public boolean isEmpty() { return headers.isEmpty(); }
@Override public int size() { return headers.size(); }
@Override public List<AsciiString> getAllAndRemove(AsciiString name) { return headers.getAllAndRemove(name, VALUE_UNMARSHALLER); }
@Override public AsciiString getAndRemove(AsciiString name) { return (AsciiString) headers.getAndRemove(name); }
@Override public AsciiString get(AsciiString name) { return (AsciiString) headers.get(name); }
@Override public BinaryHeaders clear() { headers.clear(); return this; }
@Override public BinaryHeaders set(AsciiString name, AsciiString value) { headers.set(name, value); return this; }