Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update HTTP caching #93

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 107 additions & 5 deletions src/main/java/io/vertx/httpproxy/impl/CacheControl.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,35 +10,94 @@
*/
package io.vertx.httpproxy.impl;

import java.math.BigInteger;

/**
* @author <a href="mailto:[email protected]">Julien Viet</a>
*/
public class CacheControl {

private int maxAge;
private int maxStale;
private int minFresh;
private boolean noCache;
private boolean noStore;
private boolean noTransform;
private boolean onlyIfCached;
private boolean mustRevalidate;
private boolean mustUnderstand;
private boolean _private;
private boolean proxyRevalidate;
private boolean _public;
private int sMaxage;

public CacheControl parse(String header) {
maxAge = -1;
noCache = false;
noStore = false;
noTransform = false;
onlyIfCached = false;
mustRevalidate = false;
mustUnderstand = false;
_private = false;
proxyRevalidate = false;
_public = false;
maxAge = -1;
maxStale = -1;
minFresh = -1;
sMaxage = -1;

String[] parts = header.split(","); // No regex
for (String part : parts) {
part = part.trim().toLowerCase();
switch (part) {
case "public":
_public = true;
break;
case "no-cache":
noCache = true;
break;
case "no-store":
noStore = true;
break;
case "no-transform":
noTransform = true;
break;
case "only-if-cached":
onlyIfCached = true;
break;
case "must-revalidate":
mustRevalidate = true;
break;
case "must-understand":
mustUnderstand = true;
break;
case "private":
_private = true;
break;
case "proxy-revalidate":
proxyRevalidate = true;
break;
default:
if (part.startsWith("max-age=")) {
maxAge = Integer.parseInt(part.substring(8));

}
maxAge = Math.max(maxAge, loadInt(part, "max-age="));
maxStale = Math.max(maxStale, loadInt(part, "max-stale="));
minFresh = Math.max(minFresh, loadInt(part, "min-fresh="));
sMaxage = Math.max(sMaxage, loadInt(part, "s-maxage="));
break;
}
}
return this;
}

private static int loadInt(String part, String prefix) {
if (part.startsWith(prefix)) {
BigInteger valueRaw = new BigInteger(part.substring(prefix.length()));
return valueRaw
.min(BigInteger.valueOf(Integer.MAX_VALUE))
.max(BigInteger.ZERO).intValueExact();
}
return -1;
}

public int maxAge() {
return maxAge;
}
Expand All @@ -47,4 +106,47 @@ public boolean isPublic() {
return _public;
}

public int maxStale() {
return maxStale;
}

public int minFresh() {
return minFresh;
}

public boolean isNoCache() {
return noCache;
}

public boolean isNoStore() {
return noStore;
}

public boolean isNoTransform() {
return noTransform;
}

public boolean isOnlyIfCached() {
return onlyIfCached;
}

public boolean isMustRevalidate() {
return mustRevalidate;
}

public boolean isMustUnderstand() {
return mustUnderstand;
}

public boolean isPrivate() {
return _private;
}

public boolean isProxyRevalidate() {
return proxyRevalidate;
}

public int sMaxage() {
return sMaxage;
}
}
Loading
Loading