This is an automated email from the ASF dual-hosted git repository.

zrlw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-samples.git


The following commit(s) were added to refs/heads/master by this push:
     new 35eff2301 Add server Http2 connection preface test case (#1234)
35eff2301 is described below

commit 35eff230158247dbe063235d7a8ba0bbbf5cd0a5
Author: zrlw <z...@sina.com>
AuthorDate: Fri Jul 18 19:15:39 2025 +0800

    Add server Http2 connection preface test case (#1234)
---
 .../dubbo-samples-triple-rest-basic/pom.xml        | 22 +++++++++++
 .../org/apache/dubbo/rest/demo/DemoService.java    |  3 ++
 .../apache/dubbo/rest/demo/DemoServiceImpl.java    | 29 ++++++++++++++
 .../apache/dubbo/rest/demo/DelayConsumerIT.java    | 46 ++++++++++++++++++++++
 4 files changed, 100 insertions(+)

diff --git 
a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/pom.xml 
b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/pom.xml
index 24c51a6eb..42404115f 100644
--- 
a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/pom.xml
+++ 
b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/pom.xml
@@ -26,6 +26,10 @@
 
   <artifactId>dubbo-samples-triple-rest-basic</artifactId>
 
+  <properties>
+    <jetty.version>12.0.6</jetty.version>
+  </properties>
+
   <dependencies>
     <dependency>
       <groupId>org.springframework.boot</groupId>
@@ -51,6 +55,24 @@
       <version>6.1.5</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-client</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.http2</groupId>
+      <artifactId>jetty-http2-client-transport</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-util</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
diff --git 
a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
 
b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
index 65feeb192..f8c740bd1 100644
--- 
a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
+++ 
b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
@@ -18,6 +18,7 @@
 package org.apache.dubbo.rest.demo;
 
 import org.apache.dubbo.remoting.http12.HttpMethods;
+import org.apache.dubbo.remoting.http12.HttpResult;
 import org.apache.dubbo.remoting.http12.rest.Mapping;
 import org.apache.dubbo.remoting.http12.rest.Param;
 import org.apache.dubbo.remoting.http12.rest.ParamType;
@@ -32,4 +33,6 @@ public interface DemoService {
     @Mapping
     String helloUser(User user);
 
+    @Mapping(method = HttpMethods.GET)
+    HttpResult<String> helloH2cWithExceededLargeSizeHeaderResp();
 }
diff --git 
a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java
 
b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java
index b6083a9dd..0464419c6 100644
--- 
a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java
+++ 
b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java
@@ -18,7 +18,12 @@
 package org.apache.dubbo.rest.demo;
 
 import org.apache.dubbo.config.annotation.DubboService;
+import org.apache.dubbo.remoting.http12.HttpResult;
 
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.IntStream;
 
 @DubboService
@@ -26,8 +31,11 @@ public class DemoServiceImpl implements DemoService {
 
     private static final StringBuffer finalString = new StringBuffer();
 
+    private static final Map<String, List<String>> finalMap = new 
LinkedHashMap<>();
+
     static {
         IntStream.range(0, 20000).forEach(i -> 
finalString.append(i).append("Hello"));
+        finalMap.put("large-size-response-header", 
Collections.singletonList(finalString.toString()));
     }
 
     @Override
@@ -44,4 +52,25 @@ public class DemoServiceImpl implements DemoService {
     public String helloUser(User user) {
         return finalString + "Hello " + user.getTitle() + ". " + 
user.getName();
     }
+
+    @Override
+    public HttpResult<String> helloH2cWithExceededLargeSizeHeaderResp() {
+        return new HttpResult<>() {
+
+            @Override
+            public int getStatus() {
+                return 200;
+            }
+
+            @Override
+            public Map<String, List<String>> getHeaders() {
+                return finalMap;
+            }
+
+            @Override
+            public String getBody() {
+                return "Client should not get this because response header 
size exceeds limitation!";
+            }
+        };
+    }
 }
diff --git 
a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/test/java/org/apache/dubbo/rest/demo/DelayConsumerIT.java
 
b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/test/java/org/apache/dubbo/rest/demo/DelayConsumerIT.java
index dd3d58571..9fbad9dfc 100644
--- 
a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/test/java/org/apache/dubbo/rest/demo/DelayConsumerIT.java
+++ 
b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/test/java/org/apache/dubbo/rest/demo/DelayConsumerIT.java
@@ -19,8 +19,19 @@ package org.apache.dubbo.rest.demo;
 
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 
+import java.util.concurrent.TimeUnit;
 import java.util.stream.IntStream;
 
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpClientTransport;
+import org.eclipse.jetty.client.transport.HttpClientConnectionFactory;
+import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http2.client.HTTP2Client;
+import 
org.eclipse.jetty.http2.client.transport.ClientConnectionFactoryOverHTTP2;
+import org.eclipse.jetty.io.ClientConnectionFactory;
+import org.eclipse.jetty.io.ClientConnector;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -70,4 +81,39 @@ public class DelayConsumerIT {
                 .body(String.class);
         Assertions.assertEquals("\"" + finalString + "Hello Mr. Yang\"", 
result);
     }
+
+    /**
+     * The MAX_HEADER_LIST_SIZE value of jetty HTTP/2 client is 8192, which is 
smaller than the default value of
+     * Triple server, Triple server should wait client connection preface 
before sending back response with large
+     * size header, otherwise the client will encounter IOException with 
invalid_continuation_stream.
+     */
+    @Test
+    public void helloH2cWithExceededLargeSizeHeaderResp() throws Exception {
+        ClientConnector clientConnector = new ClientConnector();
+        HTTP2Client http2Client = new HTTP2Client(clientConnector);
+        ClientConnectionFactory.Info h2 = new 
ClientConnectionFactoryOverHTTP2.HTTP2(http2Client);
+        clientConnector.setSelectors(1);
+        QueuedThreadPool clientThreads = new QueuedThreadPool();
+        clientThreads.setName("client");
+        clientConnector.setExecutor(clientThreads);
+        HttpClientTransport httpClientTransport
+                = new HttpClientTransportDynamic(clientConnector, 
HttpClientConnectionFactory.HTTP11, h2);
+        HttpClient httpClient = new HttpClient(httpClientTransport);
+        httpClient.start();
+
+        try {
+            
httpClient.newRequest(toUri("/helloH2cWithExceededLargeSizeHeaderResp"))
+                    .headers(headers -> headers
+                            .put(HttpHeader.UPGRADE, "h2c")
+                            .put(HttpHeader.HTTP2_SETTINGS, "")
+                            .put(HttpHeader.CONNECTION, "Upgrade, 
HTTP2-Settings"))
+                    .timeout(5, TimeUnit.SECONDS)
+                    .send();
+            Assertions.fail("Expected exception not occurred!");
+        } catch (Exception ex) {
+            Assertions.assertEquals("java.io.IOException: 
cancel_stream_error", ex.getMessage());
+        } finally {
+            httpClient.stop();
+        }
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org
For additional commands, e-mail: notifications-h...@dubbo.apache.org

Reply via email to