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

snippet inject support like <head lang="en"> #8736

Merged
merged 12 commits into from
Aug 9, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
// this is shared by both ServletOutputStream and PrintWriter injection
public class InjectionState {
private static final int HEAD_TAG_WRITTEN_FAKE_VALUE = -1;
private static final int HEAD_TAG_LENGTH = "<head>".length();
private static final String HEAD_PREFIX = "<head";
private static final StringBuilder HEAD_PREFIX_BUILDER = new StringBuilder("");
oliver-zhang marked this conversation as resolved.
Show resolved Hide resolved
private final SnippetInjectingResponseWrapper wrapper;
private int headTagBytesSeen = 0;
private boolean isContainHead = false;

public InjectionState(SnippetInjectingResponseWrapper wrapper) {
this.wrapper = wrapper;
Expand Down Expand Up @@ -40,34 +42,30 @@ public boolean processByte(int b) {
if (isHeadTagWritten()) {
return false;
}
if (inHeadTag(b)) {
headTagBytesSeen++;
} else {
headTagBytesSeen = 0;
}
if (headTagBytesSeen == HEAD_TAG_LENGTH) {
setHeadTagWritten();
return true;
} else {
return false;
}
inHeadTag(b);
return isHeadTagWritten();
}

private boolean inHeadTag(int b) {
if (headTagBytesSeen == 0 && b == '<') {
return true;
} else if (headTagBytesSeen == 1 && b == 'h') {
return true;
} else if (headTagBytesSeen == 2 && b == 'e') {
return true;
} else if (headTagBytesSeen == 3 && b == 'a') {
return true;
} else if (headTagBytesSeen == 4 && b == 'd') {
return true;
} else if (headTagBytesSeen == 5 && b == '>') {
return true;
private void inHeadTag(int b) {
if (b == '<' && !isContainHead) {
HEAD_PREFIX_BUILDER.append("<");
} else if (b == 'h' && !isContainHead) {
HEAD_PREFIX_BUILDER.append("h");
} else if (b == 'e' && !isContainHead) {
HEAD_PREFIX_BUILDER.append("e");
} else if (b == 'a' && !isContainHead) {
HEAD_PREFIX_BUILDER.append("a");
} else if (b == 'd' && !isContainHead) {
HEAD_PREFIX_BUILDER.append("d");
if (HEAD_PREFIX_BUILDER.toString().equals(HEAD_PREFIX)) {
isContainHead = true;
}
} else if (b == '>') {
if (isContainHead) {
setHeadTagWritten();
}
HEAD_PREFIX_BUILDER.delete(0, HEAD_PREFIX_BUILDER.length());
}
return false;
}

public SnippetInjectingResponseWrapper getWrapper() {
Expand Down