Skip to content

Commit 2e0cffe

Browse files
authored
feat(server): add path filter for graphspace (#2898)
1 parent 00e040b commit 2e0cffe

File tree

3 files changed

+511
-16
lines changed

3 files changed

+511
-16
lines changed

hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/PathFilter.java

Lines changed: 76 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,41 +18,101 @@
1818
package org.apache.hugegraph.api.filter;
1919

2020
import java.io.IOException;
21+
import java.net.URI;
22+
import java.util.List;
23+
import java.util.Set;
24+
25+
import org.apache.hugegraph.config.HugeConfig;
26+
import org.apache.hugegraph.config.ServerOptions;
27+
import org.apache.hugegraph.util.E;
28+
import org.apache.hugegraph.util.Log;
29+
import org.slf4j.Logger;
30+
31+
import com.google.common.collect.ImmutableSet;
2132

2233
import jakarta.inject.Singleton;
2334
import jakarta.ws.rs.container.ContainerRequestContext;
2435
import jakarta.ws.rs.container.ContainerRequestFilter;
2536
import jakarta.ws.rs.container.PreMatching;
37+
import jakarta.ws.rs.core.Context;
38+
import jakarta.ws.rs.core.PathSegment;
39+
import jakarta.ws.rs.core.UriInfo;
2640
import jakarta.ws.rs.ext.Provider;
2741

2842
@Provider
2943
@Singleton
3044
@PreMatching
3145
public class PathFilter implements ContainerRequestFilter {
3246

47+
private static final Logger LOG = Log.logger(PathFilter.class);
48+
49+
private static final String GRAPH_SPACE = "graphspaces";
50+
private static final String ARTHAS_START = "arthas";
51+
3352
public static final String REQUEST_TIME = "request_time";
3453
public static final String REQUEST_PARAMS_JSON = "request_params_json";
3554

55+
private static final String DELIMITER = "/";
56+
private static final Set<String> WHITE_API_LIST = ImmutableSet.of(
57+
"",
58+
"apis",
59+
"metrics",
60+
"versions",
61+
"health",
62+
"gremlin",
63+
"graphs/auth",
64+
"graphs/auth/users",
65+
"auth/users",
66+
"auth/managers",
67+
"auth",
68+
"hstore",
69+
"pd",
70+
"kafka",
71+
"whiteiplist",
72+
"vermeer",
73+
"store",
74+
"expiredclear",
75+
"department",
76+
"saas",
77+
"trade",
78+
"kvstore",
79+
"openapi.json"
80+
);
81+
82+
@Context
83+
private jakarta.inject.Provider<HugeConfig> configProvider;
84+
85+
public static boolean isWhiteAPI(String rootPath) {
86+
87+
return WHITE_API_LIST.contains(rootPath);
88+
}
89+
3690
@Override
37-
public void filter(ContainerRequestContext context) throws IOException {
91+
public void filter(ContainerRequestContext context)
92+
throws IOException {
3893
context.setProperty(REQUEST_TIME, System.currentTimeMillis());
3994

40-
// TODO: temporarily comment it to fix loader bug, handle it later
41-
/*// record the request json
42-
String method = context.getMethod();
43-
String requestParamsJson = "";
44-
if (method.equals(HttpMethod.POST)) {
45-
requestParamsJson = IOUtils.toString(context.getEntityStream(),
46-
Charsets.toCharset(CHARSET));
47-
// replace input stream because we have already read it
48-
InputStream in = IOUtils.toInputStream(requestParamsJson, Charsets.toCharset(CHARSET));
49-
context.setEntityStream(in);
50-
} else if (method.equals(HttpMethod.GET)) {
51-
MultivaluedMap<String, String> pathParameters = context.getUriInfo()
52-
.getPathParameters();
53-
requestParamsJson = pathParameters.toString();
95+
List<PathSegment> segments = context.getUriInfo().getPathSegments();
96+
E.checkArgument(segments.size() > 0, "Invalid request uri '%s'",
97+
context.getUriInfo().getPath());
98+
String rootPath = segments.get(0).getPath();
99+
100+
if (isWhiteAPI(rootPath) || GRAPH_SPACE.equals(rootPath) ||
101+
ARTHAS_START.equals(rootPath)) {
102+
return;
54103
}
55104

56-
context.setProperty(REQUEST_PARAMS_JSON, requestParamsJson);*/
105+
UriInfo uriInfo = context.getUriInfo();
106+
String defaultPathSpace =
107+
this.configProvider.get().get(ServerOptions.PATH_GRAPH_SPACE);
108+
String path = uriInfo.getBaseUri().getPath() +
109+
String.join(DELIMITER, GRAPH_SPACE, defaultPathSpace);
110+
for (PathSegment segment : segments) {
111+
path = String.join(DELIMITER, path, segment.getPath());
112+
}
113+
LOG.debug("Redirect request uri from {} to {}",
114+
uriInfo.getRequestUri().getPath(), path);
115+
URI requestUri = uriInfo.getRequestUriBuilder().uri(path).build();
116+
context.setRequestUri(uriInfo.getBaseUri(), requestUri);
57117
}
58118
}

hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/UnitTestSuite.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.hugegraph.unit;
1919

2020
import org.apache.hugegraph.core.RoleElectionStateMachineTest;
21+
import org.apache.hugegraph.unit.api.filter.PathFilterTest;
2122
import org.apache.hugegraph.unit.cache.CacheManagerTest;
2223
import org.apache.hugegraph.unit.cache.CacheTest;
2324
import org.apache.hugegraph.unit.cache.CachedGraphTransactionTest;
@@ -76,6 +77,9 @@
7677

7778
@RunWith(Suite.class)
7879
@Suite.SuiteClasses({
80+
/* api filter */
81+
PathFilterTest.class,
82+
7983
/* cache */
8084
CacheTest.RamCacheTest.class,
8185
CacheTest.OffheapCacheTest.class,

0 commit comments

Comments
 (0)