Browse Source

avoid filtering stream if no rules could modify it

tags/v0.13.1
Jonathan Cobb 4 years ago
parent
commit
343393e10c
6 changed files with 46 additions and 3 deletions
  1. +2
    -0
      bubble-server/src/main/java/bubble/rule/AppRuleDriver.java
  2. +2
    -0
      bubble-server/src/main/java/bubble/rule/social/block/JsUserBlockerRuleDriver.java
  3. +2
    -0
      bubble-server/src/main/java/bubble/rule/social/block/UserBlockerRuleDriver.java
  4. +33
    -0
      bubble-server/src/main/java/bubble/service/stream/ActiveStreamState.java
  5. +4
    -0
      bubble-server/src/main/java/bubble/service/stream/StandardRuleEngineService.java
  6. +3
    -3
      bubble-server/src/main/resources/logback.xml

+ 2
- 0
bubble-server/src/main/java/bubble/rule/AppRuleDriver.java View File

@@ -154,4 +154,6 @@ public interface AppRuleDriver {
return ConnectionCheckResponse.noop;
}

default boolean couldModify(FilterHttpRequest request) { return false; }

}

+ 2
- 0
bubble-server/src/main/java/bubble/rule/social/block/JsUserBlockerRuleDriver.java View File

@@ -33,6 +33,8 @@ public class JsUserBlockerRuleDriver extends AbstractAppRuleDriver {

public static final String CTX_APPLY_BLOCKS_JS = "APPLY_BLOCKS_JS";

@Override public boolean couldModify(FilterHttpRequest request) { return true; }

@Override public InputStream doFilterResponse(FilterHttpRequest filterRequest, InputStream in) {
if (!isHtml(filterRequest.getContentType())) return in;



+ 2
- 0
bubble-server/src/main/java/bubble/rule/social/block/UserBlockerRuleDriver.java View File

@@ -30,6 +30,8 @@ import static org.cobbzilla.util.string.StringUtil.UTF8cs;
@Slf4j
public class UserBlockerRuleDriver extends AbstractAppRuleDriver {

@Override public boolean couldModify(FilterHttpRequest request) { return true; }

// This gets called after autowiring, so `configuration` object will be non-null by now
@Getter(lazy=true) private final JsonNode fullConfig = initFullConfig();



+ 33
- 0
bubble-server/src/main/java/bubble/service/stream/ActiveStreamState.java View File

@@ -5,6 +5,7 @@
package bubble.service.stream;

import bubble.resources.stream.FilterHttpRequest;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.cobbzilla.util.collection.ExpirationEvictionPolicy;
@@ -24,6 +25,7 @@ import java.util.Map;

import static java.util.concurrent.TimeUnit.DAYS;
import static org.apache.commons.lang3.ArrayUtils.EMPTY_BYTE_ARRAY;
import static org.cobbzilla.util.daemon.ZillaRuntime.empty;
import static org.cobbzilla.util.daemon.ZillaRuntime.shortError;
import static org.cobbzilla.util.io.NullInputStream.NULL_STREAM;

@@ -32,11 +34,15 @@ class ActiveStreamState {

public static final long DEFAULT_BYTE_BUFFER_SIZE = (8 * Bytes.KB);
public static final long MAX_BYTE_BUFFER_SIZE = (64 * Bytes.KB);

// do not wrap input with encoding stream until we have received at least this many bytes
// this avoids errors when creating a GZIPInputStream when only one or a few bytes are available
public static final long MIN_BYTES_BEFORE_WRAP = 256;

private final FilterHttpRequest request;
private final String requestId;
private final AppRuleHarness firstRule;
@Getter private final boolean passthru;
private HttpContentEncodingType encoding;
private MultiStream multiStream;
private InputStream output = null;
@@ -49,6 +55,31 @@ class ActiveStreamState {
this.requestId = request.getId();
this.encoding = request.getEncoding();
this.firstRule = rules.get(0);

final String prefix = "ActiveStreamState("+requestId+"): ";
if (empty(rules)) {
if (log.isDebugEnabled()) log.debug(prefix+"no rules, returning passthru");
passthru = true;

} else if (noApplicableRules(rules)) {
if (log.isDebugEnabled()) log.debug(prefix+"no applicable rules, returning passthru");
passthru = true;

} else {
passthru = false;
}
}

public boolean noApplicableRules(List<AppRuleHarness> rules) {
for (AppRuleHarness appRule : rules) {
if (appRule.getDriver().couldModify(request)) {
if (log.isTraceEnabled()) log.trace("noApplicableRules("+requestId+"): appRule "+appRule.getRule().getName()+"/"+appRule.getDriver().getClass().getName()+" could modify request, returning false");
return false;
} else {
if (log.isTraceEnabled()) log.trace("noApplicableRules("+requestId+"): appRule "+appRule.getRule().getName()+"/"+appRule.getDriver().getClass().getName()+" could NOT modify request");
}
}
return true;
}

private String prefix(String s) { return s+"("+requestId+"): "; }
@@ -74,6 +105,8 @@ class ActiveStreamState {
} else {
multiStream.addStream(chunkStream);
}
// do not wrap input with encoding stream until we have received at least MIN_BYTES_BEFORE_WRAP bytes
// this avoids errors when creating a GZIPInputStream when only one or a few bytes are available
if (output == null && totalBytesWritten > MIN_BYTES_BEFORE_WRAP) {
output = outputStream(firstRule.getDriver().filterResponse(request, inputStream(multiStream)));
}


+ 4
- 0
bubble-server/src/main/java/bubble/service/stream/StandardRuleEngineService.java View File

@@ -174,6 +174,10 @@ public class StandardRuleEngineService implements RuleEngineService {
// have we seen this request before?
final ActiveStreamState state = activeProcessors.computeIfAbsent(filterRequest.getId(),
k -> new ActiveStreamState(filterRequest, initRules(filterRequest)));
if (state.isPassthru()) {
if (log.isDebugEnabled()) log.debug(prefix+"state is passthru");
return passthru(request);
}
if (last) {
if (log.isDebugEnabled()) log.debug(prefix+"adding LAST stream with length="+chunkLength);
state.addLastChunk(request.getEntityStream(), chunkLength);


+ 3
- 3
bubble-server/src/main/resources/logback.xml View File

@@ -45,9 +45,9 @@
<!-- <logger name="bubble.filters.BubbleRateLimitFilter" level="TRACE" />-->
<!-- <logger name="org.cobbzilla.wizard.filters.RateLimitFilter" level="TRACE" />-->
<!-- <logger name="bubble.service.stream.StandardRuleEngineService" level="DEBUG" />-->
<logger name="bubble.service.stream.ActiveStreamState" level="INFO" />
<logger name="bubble.resources.stream" level="DEBUG" />
<logger name="bubble.resources.stream.FilterHttpResource" level="TRACE" />
<logger name="bubble.service.stream.ActiveStreamState" level="WARN" />
<logger name="bubble.resources.stream" level="WARN" />
<logger name="bubble.resources.stream.FilterHttpResource" level="WARN" />
<!-- <logger name="bubble.resources.stream.FilterHttpResource" level="INFO" />-->
<logger name="bubble.service.stream" level="INFO" />
<!-- <logger name="bubble.service.account.StandardAccountMessageService" level="DEBUG" />-->


Loading…
Cancel
Save