summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarsten Loesing <karsten.loesing@gmx.net>2018-07-24 08:14:33 +0200
committerKarsten Loesing <karsten.loesing@gmx.net>2018-07-24 08:14:33 +0200
commit49cdff77c4ca95b8a8f4d48b0d8374f4c7b4ad33 (patch)
tree6a602f5cd79f72997571b468f4ca076373ca2f3c
parent52494a7f343baa1d0ae84078ad23dac52e616c1d (diff)
Support queries by comma-separated list of flags.task-23914
Implements #23914.
-rw-r--r--CHANGELOG.md6
-rw-r--r--src/main/java/org/torproject/onionoo/server/RequestHandler.java21
-rw-r--r--src/main/java/org/torproject/onionoo/server/ResourceServlet.java8
-rw-r--r--src/test/java/org/torproject/onionoo/server/ResourceServletTest.java26
4 files changed, 49 insertions, 12 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cd11502..ffdca74 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+# Changes in version 6.2-1.16.0 - 2018-07-??
+
+ * Medium changes
+ - Extend flag parameter to support comma-separated list of flags.
+
+
# Changes in version 6.1-1.15.0 - 2018-07-16
* Medium changes
diff --git a/src/main/java/org/torproject/onionoo/server/RequestHandler.java b/src/main/java/org/torproject/onionoo/server/RequestHandler.java
index b9d9b23..2c3932d 100644
--- a/src/main/java/org/torproject/onionoo/server/RequestHandler.java
+++ b/src/main/java/org/torproject/onionoo/server/RequestHandler.java
@@ -78,10 +78,10 @@ public class RequestHandler {
this.as = as;
}
- private String flag;
+ private String[] flags;
- public void setFlag(String flag) {
- this.flag = flag;
+ public void setFlag(String[] flags) {
+ this.flags = flags;
}
private String[] contact;
@@ -177,7 +177,7 @@ public class RequestHandler {
this.filterByFingerprint();
this.filterByCountryCode();
this.filterByAsNumber();
- this.filterByFlag();
+ this.filterByFlags();
this.filterNodesByFirstSeenDays();
this.filterNodesByLastSeenDays();
this.filterByContact();
@@ -424,12 +424,17 @@ public class RequestHandler {
this.filteredBridges.clear();
}
- private void filterByFlag() {
- if (this.flag == null) {
- /* Not filtering by relay flag. */
+ private void filterByFlags() {
+ if (null == this.flags || 0 == this.flags.length) {
+ /* Not filtering by relay flags. */
return;
}
- String flag = this.flag.toLowerCase();
+ for (String flag : this.flags) {
+ this.filterByFlag(flag);
+ }
+ }
+
+ private void filterByFlag(String flag) {
if (!this.nodeIndex.getRelaysByFlag().containsKey(flag)) {
this.filteredRelays.clear();
} else {
diff --git a/src/main/java/org/torproject/onionoo/server/ResourceServlet.java b/src/main/java/org/torproject/onionoo/server/ResourceServlet.java
index e119518..817611e 100644
--- a/src/main/java/org/torproject/onionoo/server/ResourceServlet.java
+++ b/src/main/java/org/torproject/onionoo/server/ResourceServlet.java
@@ -249,7 +249,7 @@ public class ResourceServlet extends HttpServlet {
rh.setAs(asNumberParameter);
}
if (parameterMap.containsKey("flag")) {
- String flagParameter = this.parseFlagParameter(
+ String[] flagParameter = this.parseFlagParameter(
parameterMap.get("flag"));
if (flagParameter == null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
@@ -511,14 +511,14 @@ public class ResourceServlet extends HttpServlet {
}
private static Pattern flagPattern =
- Pattern.compile("^[a-zA-Z0-9]{1,20}$");
+ Pattern.compile("^[a-zA-Z0-9,]*$");
- private String parseFlagParameter(String parameter) {
+ private String[] parseFlagParameter(String parameter) {
if (!flagPattern.matcher(parameter).matches()) {
/* Flag contains illegal character(s). */
return null;
}
- return parameter;
+ return parameter.toLowerCase().split(",");
}
private static Pattern daysPattern = Pattern.compile("^[0-9-]{1,10}$");
diff --git a/src/test/java/org/torproject/onionoo/server/ResourceServletTest.java b/src/test/java/org/torproject/onionoo/server/ResourceServletTest.java
index 2bc8203..2d18453 100644
--- a/src/test/java/org/torproject/onionoo/server/ResourceServletTest.java
+++ b/src/test/java/org/torproject/onionoo/server/ResourceServletTest.java
@@ -1205,6 +1205,32 @@ public class ResourceServletTest {
}
@Test(timeout = 100)
+ public void testFlagRunningAndFast() {
+ this.assertSummaryDocument(
+ "/summary?flag=Running,Fast", 2,
+ new String[] { "Ferrari458", "TimMayTribute" }, 0, null);
+ }
+
+ @Test(timeout = 100)
+ public void testFlagRunningAndFastAndRunning() {
+ this.assertSummaryDocument(
+ "/summary?flag=Running,Fast,Running", 2,
+ new String[] { "Ferrari458", "TimMayTribute" }, 0, null);
+ }
+
+ @Test(timeout = 100)
+ public void testFlagRunningAndAwesome() {
+ this.assertSummaryDocument(
+ "/summary?flag=Running,Awesome", 0, null, 0, null);
+ }
+
+ @Test(timeout = 100)
+ public void testFlagRunningAndValidUpperCase() {
+ this.assertSummaryDocument(
+ "/summary?flag=RUNNING,VALID", 3, null, 1, null);
+ }
+
+ @Test(timeout = 100)
public void testFirstSeenDaysZeroToTwo() {
this.assertSummaryDocument(
"/summary?first_seen_days=0-2", 0, null, 0, null);