From f71ace054e4a6188836751fc7d225fb8d8440769 Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Thu, 2 Oct 2025 00:09:30 +1000 Subject: [PATCH 1/5] Fix issues with CookieCompliance on Jetty 9.4 HttpConnector mode. Signed-off-by: Lachlan Roberts --- .../runtime/jetty9/JettyHttpProxy.java | 15 ++++-- .../runtime/jetty9/CookieComplianceTest.java | 51 ++++++++++++++++--- .../JakartaCookieTestServlet.java | 37 ++++++++++++++ ...rvlet.java => JavaxCookieTestServlet.java} | 2 +- .../{ => jakarta}/WEB-INF/appengine-web.xml | 0 .../jakarta/WEB-INF/web.xml | 29 +++++++++++ .../javax/WEB-INF/appengine-web.xml | 25 +++++++++ .../{ => javax}/WEB-INF/web.xml | 2 +- 8 files changed, 146 insertions(+), 15 deletions(-) create mode 100644 runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/JakartaCookieTestServlet.java rename runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/{CookieTestServlet.java => JavaxCookieTestServlet.java} (95%) rename runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/{ => jakarta}/WEB-INF/appengine-web.xml (100%) create mode 100644 runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/jakarta/WEB-INF/web.xml create mode 100644 runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/javax/WEB-INF/appengine-web.xml rename runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/{ => javax}/WEB-INF/web.xml (95%) diff --git a/runtime/runtime_impl_jetty9/src/main/java/com/google/apphosting/runtime/jetty9/JettyHttpProxy.java b/runtime/runtime_impl_jetty9/src/main/java/com/google/apphosting/runtime/jetty9/JettyHttpProxy.java index 226bd7a27..3b0bf085c 100644 --- a/runtime/runtime_impl_jetty9/src/main/java/com/google/apphosting/runtime/jetty9/JettyHttpProxy.java +++ b/runtime/runtime_impl_jetty9/src/main/java/com/google/apphosting/runtime/jetty9/JettyHttpProxy.java @@ -16,6 +16,7 @@ package com.google.apphosting.runtime.jetty9; +import static com.google.apphosting.runtime.AppEngineConstants.HTTP_CONNECTOR_MODE; import static com.google.apphosting.runtime.AppEngineConstants.LEGACY_MODE; import com.google.apphosting.base.protos.AppLogsPb; @@ -35,12 +36,9 @@ import java.util.logging.Level; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.http.CookieCompliance; import org.eclipse.jetty.http.HttpCompliance; -import org.eclipse.jetty.server.HttpConfiguration; -import org.eclipse.jetty.server.HttpConnectionFactory; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.*; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.SizeLimitHandler; import org.eclipse.jetty.server.handler.gzip.GzipHandler; @@ -104,6 +102,13 @@ public static ServerConnector newConnector( config.setSendServerVersion(false); config.setSendXPoweredBy(false); + if (LEGACY_MODE && Boolean.getBoolean(HTTP_CONNECTOR_MODE)) + { + config.setRequestCookieCompliance(CookieCompliance.RFC2965); + config.setResponseCookieCompliance(CookieCompliance.RFC2965); + config.setMultiPartFormDataCompliance(MultiPartFormDataCompliance.LEGACY); + } + return connector; } diff --git a/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/CookieComplianceTest.java b/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/CookieComplianceTest.java index 66a771047..75d77324a 100644 --- a/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/CookieComplianceTest.java +++ b/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/CookieComplianceTest.java @@ -17,7 +17,10 @@ package com.google.apphosting.runtime.jetty9; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assume.assumeTrue; +import java.util.Arrays; +import java.util.List; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; @@ -28,9 +31,9 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import org.junit.runners.Parameterized; -@RunWith(JUnit4.class) +@RunWith(Parameterized.class) public class CookieComplianceTest extends JavaRuntimeViaHttpBase { // This is set in the app appengine-web.xml file @@ -38,18 +41,50 @@ public class CookieComplianceTest extends JavaRuntimeViaHttpBase { System.setProperty("com.google.apphosting.runtime.jetty94.LEGACY_MODE", "true"); } - public CookieComplianceTest() { - //Test also running in google3, so we limit to jetty 9.4 for now. - // TODO(ludo): Enable for other versions once we remove internal jetty94 dependency. - // TODO(ludo): http connector true: fails, but http connector false: pass - super("java17", "9.4", "EE6", false); + @Parameterized.Parameters + public static List version() { + return Arrays.asList( + new Object[][] { + {"java17", "9.4", "EE6", false}, + {"java17", "12.0", "EE8", false}, + {"java17", "12.0", "EE10", false}, + {"java17", "12.1", "EE11", false}, + {"java21", "12.0", "EE8", false}, + {"java21", "12.0", "EE10", false}, + {"java21", "12.1", "EE11", false}, + {"java25", "12.1", "EE8", false}, + {"java25", "12.1", "EE11", false}, + {"java17", "9.4", "EE6", true}, + {"java17", "12.0", "EE8", true}, + {"java17", "12.0", "EE10", true}, + {"java17", "12.1", "EE11", true}, + {"java21", "12.0", "EE8", true}, + {"java21", "12.0", "EE10", true}, + {"java21", "12.1", "EE11", true}, + {"java25", "12.1", "EE8", true}, + {"java25", "12.1", "EE11", true}, + }); + } + + public CookieComplianceTest(String runtimeVersion, String jettyVersion, String version, boolean useHttpConnector) { + super(runtimeVersion, jettyVersion, version, useHttpConnector); } @Rule public TemporaryFolder temp = new TemporaryFolder(); @Before public void copyAppToTemp() throws Exception { - copyAppToDir("cookiecomplianceapp", temp.getRoot().toPath()); + // Internal testing is limited to Jetty 9.4 EE6 for now. + boolean internal = Boolean.getBoolean("test.running.internally"); + assumeTrue(!internal || "EE6".equals(jakartaVersion)); + + String app = "com/google/apphosting/runtime/jetty9/cookiecomplianceapp/"; + if (isJakarta()) { + app = app + "jakarta"; + } else { + app = app + "javax"; + } + copyAppToDir(app, temp.getRoot().toPath()); } @Test diff --git a/runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/JakartaCookieTestServlet.java b/runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/JakartaCookieTestServlet.java new file mode 100644 index 000000000..35abba62a --- /dev/null +++ b/runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/JakartaCookieTestServlet.java @@ -0,0 +1,37 @@ +/* + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.apphosting.runtime.jetty9.cookiecomplianceapp; + +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** This servlet sets a cookie which is illegal to be set under the rules of RFC6265. */ +@WebServlet(urlPatterns = "/*") +public class JakartaCookieTestServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + PrintWriter writer = resp.getWriter(); + resp.setContentType("text/plain"); + writer.print("cookieTestServletContent"); + resp.addCookie(new Cookie("invalidRFC6265Cookie", "value\"1234")); + } +} diff --git a/runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/CookieTestServlet.java b/runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/JavaxCookieTestServlet.java similarity index 95% rename from runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/CookieTestServlet.java rename to runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/JavaxCookieTestServlet.java index 78249fbe3..6a3d03c0c 100644 --- a/runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/CookieTestServlet.java +++ b/runtime/testapps/src/main/java/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/JavaxCookieTestServlet.java @@ -26,7 +26,7 @@ /** This servlet sets a cookie which is illegal to be set under the rules of RFC6265. */ @WebServlet(urlPatterns = "/*") -public class CookieTestServlet extends HttpServlet { +public class JavaxCookieTestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PrintWriter writer = resp.getWriter(); diff --git a/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/WEB-INF/appengine-web.xml b/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/jakarta/WEB-INF/appengine-web.xml similarity index 100% rename from runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/WEB-INF/appengine-web.xml rename to runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/jakarta/WEB-INF/appengine-web.xml diff --git a/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/jakarta/WEB-INF/web.xml b/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/jakarta/WEB-INF/web.xml new file mode 100644 index 000000000..36da38641 --- /dev/null +++ b/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/jakarta/WEB-INF/web.xml @@ -0,0 +1,29 @@ + + + + + + CookieTestServlet + com.google.apphosting.runtime.jetty9.cookiecomplianceapp.JakartaCookieTestServlet + + + CookieTestServlet + /* + + diff --git a/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/javax/WEB-INF/appengine-web.xml b/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/javax/WEB-INF/appengine-web.xml new file mode 100644 index 000000000..e1d843ba5 --- /dev/null +++ b/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/javax/WEB-INF/appengine-web.xml @@ -0,0 +1,25 @@ + + + + + java17 + cookiecomplianceapp + 1 + + + + diff --git a/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/WEB-INF/web.xml b/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/javax/WEB-INF/web.xml similarity index 95% rename from runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/WEB-INF/web.xml rename to runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/javax/WEB-INF/web.xml index 6e7bdc975..d63f2957d 100644 --- a/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/WEB-INF/web.xml +++ b/runtime/testapps/src/main/resources/com/google/apphosting/runtime/jetty9/cookiecomplianceapp/javax/WEB-INF/web.xml @@ -20,7 +20,7 @@ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"> CookieTestServlet - com.google.apphosting.runtime.jetty9.cookiecomplianceapp.CookieTestServlet + com.google.apphosting.runtime.jetty9.cookiecomplianceapp.JavaxCookieTestServlet CookieTestServlet From 3a4a62d192846492bd29001c2be1ac7f41e89b35 Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Thu, 2 Oct 2025 00:35:23 +1000 Subject: [PATCH 2/5] Fix issues with CookieCompliance on Jetty 9.4 HttpConnector mode. Signed-off-by: Lachlan Roberts --- .../runtime/jetty9/CookieComplianceTest.java | 25 ++----------------- .../jetty9/JavaRuntimeViaHttpBase.java | 10 ++++---- 2 files changed, 7 insertions(+), 28 deletions(-) diff --git a/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/CookieComplianceTest.java b/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/CookieComplianceTest.java index 75d77324a..e432316cf 100644 --- a/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/CookieComplianceTest.java +++ b/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/CookieComplianceTest.java @@ -19,7 +19,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assume.assumeTrue; -import java.util.Arrays; import java.util.List; import org.apache.http.Header; import org.apache.http.HttpResponse; @@ -36,34 +35,14 @@ @RunWith(Parameterized.class) public class CookieComplianceTest extends JavaRuntimeViaHttpBase { - // This is set in the app appengine-web.xml file + // This is set in the app appengine-web.xml file. static { System.setProperty("com.google.apphosting.runtime.jetty94.LEGACY_MODE", "true"); } @Parameterized.Parameters public static List version() { - return Arrays.asList( - new Object[][] { - {"java17", "9.4", "EE6", false}, - {"java17", "12.0", "EE8", false}, - {"java17", "12.0", "EE10", false}, - {"java17", "12.1", "EE11", false}, - {"java21", "12.0", "EE8", false}, - {"java21", "12.0", "EE10", false}, - {"java21", "12.1", "EE11", false}, - {"java25", "12.1", "EE8", false}, - {"java25", "12.1", "EE11", false}, - {"java17", "9.4", "EE6", true}, - {"java17", "12.0", "EE8", true}, - {"java17", "12.0", "EE10", true}, - {"java17", "12.1", "EE11", true}, - {"java21", "12.0", "EE8", true}, - {"java21", "12.0", "EE10", true}, - {"java21", "12.1", "EE11", true}, - {"java25", "12.1", "EE8", true}, - {"java25", "12.1", "EE11", true}, - }); + return allVersions(); } public CookieComplianceTest(String runtimeVersion, String jettyVersion, String version, boolean useHttpConnector) { diff --git a/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java b/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java index 89943931c..f60b935d3 100644 --- a/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java +++ b/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java @@ -31,6 +31,10 @@ import static java.util.concurrent.TimeUnit.SECONDS; import static org.awaitility.Awaitility.await; +import com.google.appengine.repackaged.com.google.protobuf.ByteString; +import com.google.appengine.repackaged.com.google.protobuf.ExtensionRegistry; +import com.google.appengine.repackaged.com.google.protobuf.InvalidProtocolBufferException; +import com.google.appengine.repackaged.com.google.protobuf.UninitializedMessageException; import com.google.apphosting.base.protos.api.RemoteApiPb; import com.google.apphosting.testing.PortPicker; import com.google.auto.value.AutoValue; @@ -45,10 +49,6 @@ import com.google.common.reflect.Reflection; import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.errorprone.annotations.ForOverride; -import com.google.appengine.repackaged.com.google.protobuf.ByteString; -import com.google.appengine.repackaged.com.google.protobuf.ExtensionRegistry; -import com.google.appengine.repackaged.com.google.protobuf.InvalidProtocolBufferException; -import com.google.appengine.repackaged.com.google.protobuf.UninitializedMessageException; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpServer; import java.io.BufferedReader; @@ -171,7 +171,7 @@ public static List allVersions() { System.out.println("javaVersionForTest " + javaVersionForTest); return allVersions.stream() - .filter(v -> v[0].toString().equals(javaVersionForTest)) + .filter(v -> v[0].toString().equals(javaVersionForTest) || v[1].equals("9.4")) .collect(toImmutableList()); } From fc81e913c41e41853bb796052e5080fdec60d9af Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Thu, 2 Oct 2025 00:54:28 +1000 Subject: [PATCH 3/5] Fix bad formatting Signed-off-by: Lachlan Roberts --- .../apphosting/runtime/jetty9/JettyHttpProxy.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/runtime/runtime_impl_jetty9/src/main/java/com/google/apphosting/runtime/jetty9/JettyHttpProxy.java b/runtime/runtime_impl_jetty9/src/main/java/com/google/apphosting/runtime/jetty9/JettyHttpProxy.java index 3b0bf085c..02ec8cd34 100644 --- a/runtime/runtime_impl_jetty9/src/main/java/com/google/apphosting/runtime/jetty9/JettyHttpProxy.java +++ b/runtime/runtime_impl_jetty9/src/main/java/com/google/apphosting/runtime/jetty9/JettyHttpProxy.java @@ -38,7 +38,12 @@ import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.http.CookieCompliance; import org.eclipse.jetty.http.HttpCompliance; -import org.eclipse.jetty.server.*; +import org.eclipse.jetty.server.HttpConfiguration; +import org.eclipse.jetty.server.HttpConnectionFactory; +import org.eclipse.jetty.server.MultiPartFormDataCompliance; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.SizeLimitHandler; import org.eclipse.jetty.server.handler.gzip.GzipHandler; @@ -92,8 +97,7 @@ public static ServerConnector newConnector( connector.setPort(runtimeOptions.jettyHttpAddress().getPort()); HttpConnectionFactory factory = connector.getConnectionFactory(HttpConnectionFactory.class); - factory.setHttpCompliance( - LEGACY_MODE ? HttpCompliance.RFC7230_LEGACY : HttpCompliance.RFC7230); + factory.setHttpCompliance(LEGACY_MODE ? HttpCompliance.RFC7230_LEGACY : HttpCompliance.RFC7230); HttpConfiguration config = factory.getHttpConfiguration(); config.setRequestHeaderSize(runtimeOptions.jettyRequestHeaderSize()); @@ -102,8 +106,7 @@ public static ServerConnector newConnector( config.setSendServerVersion(false); config.setSendXPoweredBy(false); - if (LEGACY_MODE && Boolean.getBoolean(HTTP_CONNECTOR_MODE)) - { + if (LEGACY_MODE && Boolean.getBoolean(HTTP_CONNECTOR_MODE)) { config.setRequestCookieCompliance(CookieCompliance.RFC2965); config.setResponseCookieCompliance(CookieCompliance.RFC2965); config.setMultiPartFormDataCompliance(MultiPartFormDataCompliance.LEGACY); From 8d302a5c5750638ae01da53c81646461e5202349 Mon Sep 17 00:00:00 2001 From: Ludovic Champenois Date: Wed, 1 Oct 2025 08:58:53 -0700 Subject: [PATCH 4/5] remove jetty9.4 constraint --- .../apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java b/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java index f60b935d3..5a37bff1d 100644 --- a/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java +++ b/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java @@ -171,7 +171,7 @@ public static List allVersions() { System.out.println("javaVersionForTest " + javaVersionForTest); return allVersions.stream() - .filter(v -> v[0].toString().equals(javaVersionForTest) || v[1].equals("9.4")) + .filter(v -> v[0].toString().equals(javaVersionForTest)) .collect(toImmutableList()); } From 368805b5a0d4303a90d778c013470266ca81257d Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Thu, 2 Oct 2025 08:10:00 +1000 Subject: [PATCH 5/5] Fixes for import ordering Signed-off-by: Lachlan Roberts --- .../apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java b/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java index 5a37bff1d..89943931c 100644 --- a/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java +++ b/runtime/test/src/test/java/com/google/apphosting/runtime/jetty9/JavaRuntimeViaHttpBase.java @@ -31,10 +31,6 @@ import static java.util.concurrent.TimeUnit.SECONDS; import static org.awaitility.Awaitility.await; -import com.google.appengine.repackaged.com.google.protobuf.ByteString; -import com.google.appengine.repackaged.com.google.protobuf.ExtensionRegistry; -import com.google.appengine.repackaged.com.google.protobuf.InvalidProtocolBufferException; -import com.google.appengine.repackaged.com.google.protobuf.UninitializedMessageException; import com.google.apphosting.base.protos.api.RemoteApiPb; import com.google.apphosting.testing.PortPicker; import com.google.auto.value.AutoValue; @@ -49,6 +45,10 @@ import com.google.common.reflect.Reflection; import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.errorprone.annotations.ForOverride; +import com.google.appengine.repackaged.com.google.protobuf.ByteString; +import com.google.appengine.repackaged.com.google.protobuf.ExtensionRegistry; +import com.google.appengine.repackaged.com.google.protobuf.InvalidProtocolBufferException; +import com.google.appengine.repackaged.com.google.protobuf.UninitializedMessageException; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpServer; import java.io.BufferedReader;