From 64b3236fe49fd67f02da1fc0e77abee4c2beb0ed Mon Sep 17 00:00:00 2001 From: Jonas Groening Date: Wed, 13 Aug 2025 14:53:52 -0400 Subject: [PATCH] Cleanup legacy proxy --- .../DynamicHttpFiltersSourceAdapter.java | 11 --- .../proxy/filters/LegacyRequestFilter.java | 86 ------------------- .../filters/helpers/OnPremisesProxy.java | 73 ---------------- .../glean/proxy/filters/helpers/BUILD.bazel | 10 --- .../filters/helpers/OnPremisesProxyTest.java | 38 -------- 5 files changed, 218 deletions(-) delete mode 100644 src/main/java/com/glean/proxy/filters/LegacyRequestFilter.java delete mode 100644 src/main/java/com/glean/proxy/filters/helpers/OnPremisesProxy.java delete mode 100644 src/test/java/com/glean/proxy/filters/helpers/OnPremisesProxyTest.java diff --git a/src/main/java/com/glean/proxy/DynamicHttpFiltersSourceAdapter.java b/src/main/java/com/glean/proxy/DynamicHttpFiltersSourceAdapter.java index 0ed9cc2..6e8d288 100644 --- a/src/main/java/com/glean/proxy/DynamicHttpFiltersSourceAdapter.java +++ b/src/main/java/com/glean/proxy/DynamicHttpFiltersSourceAdapter.java @@ -1,11 +1,8 @@ package com.glean.proxy; import com.glean.proxy.filters.CompositeFilter; -import com.glean.proxy.filters.HttpNotFoundFilter; import com.glean.proxy.filters.InvalidCloudPlatformFilter; -import com.glean.proxy.filters.LegacyRequestFilter; import com.glean.proxy.filters.LivenessCheckRequestFilter; -import com.glean.proxy.filters.helpers.OnPremisesProxy; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.HttpRequest; import java.util.ArrayList; @@ -21,7 +18,6 @@ public class DynamicHttpFiltersSourceAdapter extends HttpFiltersSourceAdapter { private static final Logger logger = Logger.getLogger(DynamicHttpFiltersSourceAdapter.class.getName()); - private final OnPremisesProxy legacyProxy = OnPremisesProxy.fromEnvironment(); private final String cloudPlatform = System.getenv("CLOUD_PLATFORM"); private final List> awsFilters; @@ -59,13 +55,6 @@ public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerCont .map(filterConstructor -> filterConstructor.apply(originalRequest, ctx)) .collect(Collectors.toCollection(ArrayList::new)); return new CompositeFilter(originalRequest, filters); - } else if (originalRequest.uri().startsWith("/proxy")) { - if (legacyProxy != null) { - return new LegacyRequestFilter(originalRequest, legacyProxy); - } else { - logger.fine("Using HttpNotFoundFilter as legacy proxy is null"); - return new HttpNotFoundFilter(originalRequest); - } } return switch (cloudPlatform) { diff --git a/src/main/java/com/glean/proxy/filters/LegacyRequestFilter.java b/src/main/java/com/glean/proxy/filters/LegacyRequestFilter.java deleted file mode 100644 index 6745061..0000000 --- a/src/main/java/com/glean/proxy/filters/LegacyRequestFilter.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.glean.proxy.filters; - -import com.glean.proxy.filters.helpers.OnPremisesProxy; -import com.glean.proxy.filters.helpers.UpgradeRequestHandler; -import io.netty.buffer.Unpooled; -import io.netty.handler.codec.http.DefaultFullHttpResponse; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; -import io.netty.handler.codec.http.HttpResponseStatus; -import io.netty.handler.codec.http.HttpVersion; -import io.netty.util.CharsetUtil; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.logging.Logger; -import org.littleshoot.proxy.HttpFiltersAdapter; - -/** - * Filters requests to /proxy endpoints in on-premises proxy configurations, rewriting webhook URIs - * to a configured target and handling optional HTTP-to-HTTPS upgrades via manual forwarding. - */ -public class LegacyRequestFilter extends HttpFiltersAdapter { - private static final Logger LOGGER = Logger.getLogger(LegacyRequestFilter.class.getName()); - private final OnPremisesProxy legacyProxy; - private static final String PROXY_HEADER = "OnPrem-Proxy"; - - public LegacyRequestFilter(HttpRequest originalRequest, OnPremisesProxy legacyProxy) { - super(originalRequest); - this.legacyProxy = legacyProxy; - } - - @Override - public HttpResponse clientToProxyRequest(HttpObject httpObject) { - if (httpObject instanceof HttpRequest) { - final HttpRequest httpRequest = (HttpRequest) httpObject; - final String[] splitPath = httpRequest.uri().split("/", 4); - if (splitPath.length < 3) { - LOGGER.severe(String.format("Unexpected legacy request format: %s", httpRequest.uri())); - } - if (!"webhook".equals(splitPath[2])) { - LOGGER.severe(String.format("Unknown intent: %s", splitPath[2])); - return null; - } - final String path = httpRequest.uri(); - - final String target = legacyProxy.getTargetURL(path); - - final URI uri; - try { - uri = new URI(target); - } catch (URISyntaxException e) { - LOGGER.severe(e.getMessage()); - return createBadRequestResponse("Bad URI: " + target); - } - httpRequest.setUri(target); - httpRequest.headers().remove("Host"); - httpRequest.headers().add("Host", uri.getHost()); - return null; - } - return createBadRequestResponse("Invalid Request"); - } - - @Override - public HttpResponse proxyToServerRequest(HttpObject httpObject) { - if (!(httpObject instanceof HttpRequest)) { - return createBadRequestResponse("Invalid Request"); - } - final HttpRequest originalRequest = (HttpRequest) httpObject; - // Protocol upgrade is not needed. LittleProxy can take care of pure HTTP requests. - if (!legacyProxy.shouldUpgradeProtocol()) { - return null; - } - String upgradedUri = legacyProxy.getTargetURLForUpgradedProtocol(originalRequest.uri()); - return UpgradeRequestHandler.sendUpgradedRequest(originalRequest, upgradedUri, PROXY_HEADER); - } - - private HttpResponse createBadRequestResponse(String message) { - DefaultFullHttpResponse response = - new DefaultFullHttpResponse( - HttpVersion.HTTP_1_1, - HttpResponseStatus.BAD_REQUEST, - Unpooled.copiedBuffer(message, CharsetUtil.UTF_8)); - response.headers().set("Content-Type", "text/plain; charset=UTF-8"); - return response; - } -} diff --git a/src/main/java/com/glean/proxy/filters/helpers/OnPremisesProxy.java b/src/main/java/com/glean/proxy/filters/helpers/OnPremisesProxy.java deleted file mode 100644 index 80aca0a..0000000 --- a/src/main/java/com/glean/proxy/filters/helpers/OnPremisesProxy.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.glean.proxy.filters.helpers; - -import com.google.common.annotations.VisibleForTesting; -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class OnPremisesProxy { - private static final Pattern WEBHOOK_TARGET_PATH_PATTERN = - Pattern.compile("^/proxy/webhook/(.*)"); - private static final Pattern API_PROXY_TARGET_PATH_PATTERN = - Pattern.compile("^/proxy/(api|rest/api)/(.*)"); - private static final Pattern CRAWL_TARGET_PATH_PATTERN = - Pattern.compile("^/proxy/crawl/([^/]+)/(.*)"); - - public enum Intent { - WEBHOOK, - } - - // This target must be HTTP. If https endpoint is provided, we set protocolUpgrade and upgrade - // protocol before request is made to server. - private final String webhookTarget; - private final boolean allowApiIngress; - - private final boolean protocolUpgrade; - private static final Logger logger = Logger.getLogger(OnPremisesProxy.class.getName()); - - public static OnPremisesProxy fromEnvironment() { - final String webhookTarget = System.getenv("WEBHOOK_TARGET"); - if (webhookTarget == null || webhookTarget.isEmpty()) { - logger.severe("WEBHOOK_TARGET not specified"); - return null; - } - boolean shouldAllowIngress = "true".equalsIgnoreCase(System.getenv("ALLOW_API_INGRESS")); - return new OnPremisesProxy(webhookTarget, shouldAllowIngress); - } - - @VisibleForTesting - OnPremisesProxy(String webhookTarget, boolean allowApiIngress) { - this.allowApiIngress = allowApiIngress; - this.protocolUpgrade = webhookTarget.startsWith("https://"); - this.webhookTarget = webhookTarget.replaceFirst("^https://", "http://"); - } - - public boolean shouldUpgradeProtocol() { - return protocolUpgrade; - } - - public String getTargetURLForUpgradedProtocol(String pathWithPrefix) { - return String.format( - "%s%s", webhookTarget.replaceFirst("^http://", "https://"), pathWithPrefix); - } - - public String getTargetURL(String requestURI) { - // /proxy/webhook/github/events - Matcher webhookPathMatcher = WEBHOOK_TARGET_PATH_PATTERN.matcher(requestURI); - if (webhookPathMatcher.matches()) { - String targetPath = webhookPathMatcher.group(1); - return String.format("%s/%s", webhookTarget, targetPath); - } - if (allowApiIngress) { - Matcher apiPathMatcher = API_PROXY_TARGET_PATH_PATTERN.matcher(requestURI); - if (apiPathMatcher.find()) { - String apiType = apiPathMatcher.group(1); // This will be either 'api' or 'rest/api' - String path = - apiPathMatcher.group(2); // This is the rest of the path after 'api' or 'rest/api' - return String.format("%s/%s/%s", webhookTarget, apiType, path); - } - } - throw new IllegalArgumentException( - String.format("Unexpected request URI format for webhook intent: %s", requestURI)); - } -} diff --git a/src/test/java/com/glean/proxy/filters/helpers/BUILD.bazel b/src/test/java/com/glean/proxy/filters/helpers/BUILD.bazel index ead6efb..50c0574 100644 --- a/src/test/java/com/glean/proxy/filters/helpers/BUILD.bazel +++ b/src/test/java/com/glean/proxy/filters/helpers/BUILD.bazel @@ -24,13 +24,3 @@ java_test( "@maven//:org_mockito_mockito_core", ], ) - -java_test( - name = "OnPremisesProxyTest", - srcs = ["OnPremisesProxyTest.java"], - test_class = "com.glean.proxy.filters.helpers.OnPremisesProxyTest", - deps = [ - "//src/main/java/com/glean/proxy/filters/helpers", - "//src/test/java/com/glean/proxy/test_utils", - ], -) diff --git a/src/test/java/com/glean/proxy/filters/helpers/OnPremisesProxyTest.java b/src/test/java/com/glean/proxy/filters/helpers/OnPremisesProxyTest.java deleted file mode 100644 index d128459..0000000 --- a/src/test/java/com/glean/proxy/filters/helpers/OnPremisesProxyTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.glean.proxy.filters.helpers; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -public class OnPremisesProxyTest { - - @Test - public void testProxy() throws Exception { - final OnPremisesProxy proxy = new OnPremisesProxy("http://webhook_target", false); - assertEquals( - "http://webhook_target/github/events", proxy.getTargetURL("/proxy/webhook/github/events")); - } - - @Test(expected = IllegalArgumentException.class) - public void testProxy_throws() throws Exception { - final OnPremisesProxy proxy = new OnPremisesProxy("http://webhook_target", false); - proxy.getTargetURL("/proxy/other/github/events"); - proxy.getTargetURL("/proxy/crawl/events"); - } - - @Test - public void testProxy_allowAllIngress() throws Exception { - final OnPremisesProxy proxy = new OnPremisesProxy("http://webhook_target", true); - assertEquals( - "http://webhook_target/api/v1/search?actas=123", - proxy.getTargetURL("/proxy/api/v1/search?actas=123")); - assertEquals( - "http://webhook_target/rest/api/index", proxy.getTargetURL("/proxy/rest/api/index")); - } - - @Test(expected = IllegalArgumentException.class) - public void testProxy_allowAllIngress_throws() throws Exception { - final OnPremisesProxy proxy = new OnPremisesProxy("http://webhook_target", true); - proxy.getTargetURL("/proxy/other/github/events"); - } -}