Преглед изворни кода

Add replacement filter with a stop regex

pull/3/head
Kristijan Mitrovic пре 4 година
родитељ
комит
2e28429424
2 измењених фајлова са 97 додато и 0 уклоњено
  1. +58
    -0
      src/main/java/org/cobbzilla/util/io/regex/RegexLimitedReplacementFilter.java
  2. +39
    -0
      src/test/java/org/cobbzilla/util/io/regex/RegexFilterReaderTest.java

+ 58
- 0
src/main/java/org/cobbzilla/util/io/regex/RegexLimitedReplacementFilter.java Прегледај датотеку

@@ -0,0 +1,58 @@
package org.cobbzilla.util.io.regex;

import com.fasterxml.jackson.databind.JsonNode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.cobbzilla.util.daemon.ZillaRuntime.empty;

@NoArgsConstructor
public class RegexLimitedReplacementFilter extends RegexReplacementFilter {

@Getter @Setter private Pattern stopRegex; // the replacement will be done only up to this point if it is found
private boolean stopRegexAlreadyFound = false;

public RegexLimitedReplacementFilter(String regex, int group, String replacement, String stopRegex,
int stopRegexMatchingFlags) {
super(regex, group,replacement);
this.stopRegex = Pattern.compile(stopRegex, stopRegexMatchingFlags);
}

@Override public void configure(JsonNode config) {
super.configure(config);

final JsonNode matchingFlags = config.get("matchingFlags");
int flags = matchingFlags == null ? 0 : matchingFlags.intValue();

this.stopRegex = Pattern.compile(config.get("stopRegex").textValue(), flags);
}

public RegexFilterResult apply(StringBuilder buffer, boolean eof) {
if (empty(stopRegex)) return super.apply(buffer, eof);

if (stopRegexAlreadyFound) return new RegexFilterResult(buffer, buffer.length(), 0);

// look for stop regex in the buffer
final Matcher stopRegexMatcher = stopRegex.matcher(buffer.toString());
if (!stopRegexMatcher.find()) return super.apply(buffer, eof);

final CharSequence partialInput = buffer.subSequence(0, stopRegexMatcher.start());
final RegexFilterResult result = super.apply(new StringBuilder().append(partialInput), eof);

// put unprocessed remainder into result
if (result.remainder > 0) {
result.buffer.append(partialInput.subSequence(partialInput.length() - result.remainder,
partialInput.length()));
result.remainder = 0;
}

// put everything else after found stopRegex including it:
result.buffer.append(buffer.subSequence(stopRegexMatcher.start(), buffer.length()));
return result;
}

}

+ 39
- 0
src/test/java/org/cobbzilla/util/io/regex/RegexFilterReaderTest.java Прегледај датотеку

@@ -9,6 +9,7 @@ import org.junit.Test;

import java.io.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern;

import static org.cobbzilla.util.daemon.ZillaRuntime.background;
import static org.cobbzilla.util.daemon.ZillaRuntime.die;
@@ -54,6 +55,44 @@ public class RegexFilterReaderTest {
assertEquals("multi reader failed to get expected output", EXPECTED_STRING_INCLUDE_MATCH, result.toString());
}

public static final String TEST_STRING_INCLUDE_MATCH_LIMITED = "HTTP/2 200 OK\r\n"
+ "server: nginx/1.18.0 (Ubuntu)\r\n"
+ "date: Tue, 15 Sep 2020 11:40:14 GMT\r\n"
+ "content-type: application/json\r\n"
+ "content-encoding: UTF-8\r\n"
+ "set-cookie: a=b; Domain=*.wrong.domain\r\n"
+ "zz-type: java.util.LinkedHashMap\r\n"
+ "X-Firefox-Spdy: h2\r\n"
+ "\r\n"
+ "<!DOCTYPE html>\n"
+ "<html><meta charset=\"utf-8\">\n"
+ "set-cookie: a=b; Domain=*.wrong.domain\r\n"
+ "</html>\n";
public static final String EXPECTED_STRING_INCLUDE_MATCH_LIMITED = "HTTP/2 200 OK\r\n"
+ "server: nginx/1.18.0 (Ubuntu)\r\n"
+ "date: Tue, 15 Sep 2020 11:40:14 GMT\r\n"
+ "content-type: application/json\r\n"
+ "content-encoding: UTF-8\r\n"
+ "zz-type: java.util.LinkedHashMap\r\n"
+ "X-Firefox-Spdy: h2\r\n"
+ "\r\n"
+ "<!DOCTYPE html>\n"
+ "<html><meta charset=\"utf-8\">\n"
+ "set-cookie: a=b; Domain=*.wrong.domain\r\n"
+ "</html>\n";

@Test public void testRegexReaderIncludeMatchLimited() throws Exception {
final Reader reader = new StringReader(TEST_STRING_INCLUDE_MATCH_LIMITED);
final RegexStreamFilter regexStreamFilter =
new RegexLimitedReplacementFilter("Set-Cookie:.*; Domain=\\*.*\r?\n", 0, "",
"\r?\n\r?\n", Pattern.MULTILINE);
final RegexFilterReader regexFilterReader = new RegexFilterReader(reader, 1024, regexStreamFilter);
final StringWriter result = new StringWriter();
IOUtils.copyLarge(regexFilterReader, result);
assertEquals("multi reader failed to get expected output",
EXPECTED_STRING_INCLUDE_MATCH_LIMITED, result.toString());
}

public static final String TEST_STRING_INCLUDE_MATCH_MIDDLE = "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<meta charset=\"utf-8\">something</html>\n";
public static final String EXPECTED_STRING_INCLUDE_MATCH_MIDDLE = "<!DOCTYPE html>\nINSERTED_<html dir=\"ltr\" lang=\"en\">DATA\n<meta charset=\"utf-8\">something</html>\n";



Loading…
Откажи
Сачувај