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

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-java.git


The following commit(s) were added to refs/heads/main by this push:
     new bf2daf3e8b Fix Jetty client cannot receive the HTTP response 
body(#13500) (#775)
bf2daf3e8b is described below

commit bf2daf3e8bc4a3ec5ab0ceb6213cf57f563796ae
Author: xhrg <[email protected]>
AuthorDate: Fri Sep 26 08:43:46 2025 +0800

    Fix Jetty client cannot receive the HTTP response body(#13500) (#775)
---
 CHANGES.md                                         |   1 +
 .../client/AsyncHttpRequestSendInterceptor.java    |   9 +-
 .../jetty/v90/client/CompleteListenerWrapper.java  |  12 +-
 ...erWrapper.java => ResponseListenerWrapper.java} | 136 ++++++++++++--------
 .../client/define/HttpRequestInstrumentation.java  |   4 +-
 .../define/ResponseNotifierInstrumentation.java    |   4 +-
 .../jetty-plugin/jetty-client-9.x-plugin/pom.xml   |   2 +-
 .../v9/client/AsyncHttpRequestSendInterceptor.java |   9 +-
 .../jetty/v9/client/CompleteListenerWrapper.java   |  12 +-
 ...erWrapper.java => ResponseListenerWrapper.java} | 143 +++++++++++++--------
 .../AsyncHttpRequestSendInterceptorTest.java       |  13 +-
 .../client/SyncHttpRequestSendInterceptorTest.java |   7 +-
 .../jettyclient/controller/CaseController.java     |  24 ++--
 .../jettyserver/servlet/AsyncCaseServlet.java      |   4 +
 .../testcase/jettyserver/servlet/CaseServlet.java  |   4 +
 15 files changed, 244 insertions(+), 140 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 731f74226a..7d9f030558 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -16,6 +16,7 @@ Release Notes.
 * Update Maven to 3.6.3 in mvnw.
 * Fix OOM due to too many span logs.
 * Fix ClassLoader cache OOM issue with WeakHashMap.
+* Fix Jetty client cannot receive the HTTP response body.
 
 All issues and pull requests are 
[here](https://github.com/apache/skywalking/milestone/242?closed=1)
 
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java
 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java
index 669b43ffda..2858afce44 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java
@@ -58,8 +58,13 @@ public class AsyncHttpRequestSendInterceptor implements 
InstanceMethodsAroundInt
 
         span.prepareForAsync();
         request.attribute(Constants.SW_JETTY_EXIT_SPAN_KEY, span);
-        Response.CompleteListener callback = (Response.CompleteListener) 
allArguments[0];
-        allArguments[0] = new CompleteListenerWrapper(callback, 
ContextManager.capture());
+        if (allArguments[0] instanceof Response.Listener) {
+            Response.Listener listener = (Response.Listener) allArguments[0];
+            allArguments[0] = new ResponseListenerWrapper(listener, 
ContextManager.capture());
+        } else {
+            Response.CompleteListener listener = (Response.CompleteListener) 
allArguments[0];
+            allArguments[0] = new CompleteListenerWrapper(listener, 
ContextManager.capture());
+        }
     }
 
     @Override
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java
 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java
index 0318bd4c00..294b32fe7d 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java
@@ -27,11 +27,11 @@ import org.eclipse.jetty.client.api.Response;
 import org.eclipse.jetty.client.api.Result;
 
 public class CompleteListenerWrapper implements Response.CompleteListener  {
-    private Response.CompleteListener callback;
+    private Response.CompleteListener listener;
     private ContextSnapshot context;
 
-    public CompleteListenerWrapper(Response.CompleteListener callback, 
ContextSnapshot context) {
-        this.callback = callback;
+    public CompleteListenerWrapper(Response.CompleteListener listener, 
ContextSnapshot context) {
+        this.listener = listener;
         this.context = context;
     }
 
@@ -43,9 +43,9 @@ public class CompleteListenerWrapper implements 
Response.CompleteListener  {
         if (context != null) {
             ContextManager.continued(context);
         }
-        if (callback != null) {
-            callback.onComplete(result);
+        if (listener != null) {
+            listener.onComplete(result);
         }
         ContextManager.stopSpan();
     }
-}
+}
\ No newline at end of file
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java
 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java
similarity index 58%
copy from 
apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java
copy to 
apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java
index 0318bd4c00..cf3e097dda 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java
@@ -1,51 +1,85 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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
- *
- *     http://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 org.apache.skywalking.apm.plugin.jetty.v90.client;
-
-import org.apache.skywalking.apm.agent.core.context.ContextManager;
-import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
-import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
-import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
-import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
-import org.eclipse.jetty.client.api.Response;
-import org.eclipse.jetty.client.api.Result;
-
-public class CompleteListenerWrapper implements Response.CompleteListener  {
-    private Response.CompleteListener callback;
-    private ContextSnapshot context;
-
-    public CompleteListenerWrapper(Response.CompleteListener callback, 
ContextSnapshot context) {
-        this.callback = callback;
-        this.context = context;
-    }
-
-    @Override
-    public void onComplete(Result result) {
-        AbstractSpan span = 
ContextManager.createLocalSpan(Constants.PLUGIN_NAME + 
"/CompleteListener/onComplete");
-        span.setComponent(ComponentsDefine.JETTY_CLIENT);
-        SpanLayer.asHttp(span);
-        if (context != null) {
-            ContextManager.continued(context);
-        }
-        if (callback != null) {
-            callback.onComplete(result);
-        }
-        ContextManager.stopSpan();
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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
+ *
+ *     http://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 org.apache.skywalking.apm.plugin.jetty.v90.client;
+
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+import org.eclipse.jetty.client.api.Response;
+import org.eclipse.jetty.client.api.Result;
+import org.eclipse.jetty.http.HttpField;
+import java.nio.ByteBuffer;
+
+public class ResponseListenerWrapper implements Response.Listener {
+
+    private final Response.Listener listener;
+
+    private final ContextSnapshot context;
+
+    public ResponseListenerWrapper(Response.Listener listener, ContextSnapshot 
context) {
+        this.listener = listener;
+        this.context = context;
+    }
+
+    @Override
+    public void onComplete(Result result) {
+        AbstractSpan span = 
ContextManager.createLocalSpan(Constants.PLUGIN_NAME + 
"/CompleteListener/onComplete");
+        span.setComponent(ComponentsDefine.JETTY_CLIENT);
+        SpanLayer.asHttp(span);
+        if (context != null) {
+            ContextManager.continued(context);
+        }
+        if (listener != null) {
+            listener.onComplete(result);
+        }
+        ContextManager.stopSpan();
+    }
+
+    @Override
+    public void onHeaders(Response response) {
+        listener.onHeaders(response);
+    }
+
+    @Override
+    public void onContent(Response response, ByteBuffer content) {
+        listener.onContent(response, content);
+    }
+
+    @Override
+    public void onBegin(Response response) {
+        listener.onBegin(response);
+    }
+
+    @Override
+    public boolean onHeader(Response response, HttpField field) {
+        return listener.onHeader(response, field);
+    }
+
+    @Override
+    public void onSuccess(Response response) {
+        listener.onSuccess(response);
+    }
+
+    @Override
+    public void onFailure(Response response, Throwable failure) {
+        listener.onFailure(response, failure);
+    }
+}
\ No newline at end of file
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java
 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java
index ef8daf105a..2bee7ecdc1 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java
@@ -41,7 +41,7 @@ public class HttpRequestInstrumentation extends 
ClassInstanceMethodsEnhancePlugi
     private static final String ENHANCE_CLASS = 
"org.eclipse.jetty.client.HttpRequest";
     private static final String ENHANCE_CLASS_NAME = "send";
     public static final String SYNC_SEND_INTERCEPTOR =
-            
"org.apache.skywalking.apm.plugin.jetty.v90.client.SyncHttpRequestSendV90Interceptor";
+            
"org.apache.skywalking.apm.plugin.jetty.v90.client.SyncHttpRequestSendInterceptor";
 
     public static final String ASYNC_SEND_INTERCEPTOR =
             
"org.apache.skywalking.apm.plugin.jetty.v90.client.AsyncHttpRequestSendInterceptor";
@@ -85,7 +85,7 @@ public class HttpRequestInstrumentation extends 
ClassInstanceMethodsEnhancePlugi
 
                 @Override
                 public boolean isOverrideArgs() {
-                    return false;
+                    return true;
                 }
             }
         };
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java
 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java
index c4f39c4147..5502c8dc78 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java
@@ -41,10 +41,10 @@ import static 
net.bytebuddy.matcher.ElementMatchers.takesArguments;
  */
 public class ResponseNotifierInstrumentation extends 
ClassInstanceMethodsEnhancePluginDefine {
 
-    private static final String ENHANCE_CLASS = "org.eclipse.jetty.client.tar";
+    private static final String ENHANCE_CLASS = 
"org.eclipse.jetty.client.ResponseNotifier";
     private static final String ENHANCE_CLASS_NAME = "notifyComplete";
     public static final String SYNC_SEND_INTERCEPTOR =
-            
"org.apache.skywalking.apm.plugin.jetty.v9.client.ResponseNotifierInterceptor";
+            
"org.apache.skywalking.apm.plugin.jetty.v90.client.ResponseNotifierInterceptor";
 
     @Override
     public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml
index 6b92929f8b..229c401f21 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml
@@ -31,7 +31,7 @@
     <url>http://maven.apache.org</url>
 
     <properties>
-        <jetty-client.version>9.1.0.v20131115</jetty-client.version>
+        <jetty-client.version>9.2.23.v20171218</jetty-client.version>
     </properties>
 
     <dependencies>
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java
 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java
index 6f8870af49..6f39452e0c 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java
@@ -57,8 +57,13 @@ public class AsyncHttpRequestSendInterceptor implements 
InstanceMethodsAroundInt
 
         span.prepareForAsync();
         request.attribute(Constants.SW_JETTY_EXIT_SPAN_KEY, span);
-        Response.CompleteListener callback = (Response.CompleteListener) 
allArguments[0];
-        allArguments[0] = new CompleteListenerWrapper(callback, 
ContextManager.capture());
+        if (allArguments[0] instanceof Response.Listener) {
+            Response.Listener listener = (Response.Listener) allArguments[0];
+            allArguments[0] = new ResponseListenerWrapper(listener, 
ContextManager.capture());
+        } else {
+            Response.CompleteListener listener = (Response.CompleteListener) 
allArguments[0];
+            allArguments[0] = new CompleteListenerWrapper(listener, 
ContextManager.capture());
+        }
     }
 
     @Override
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java
 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java
index 50697bf3e4..156e636884 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java
@@ -27,11 +27,11 @@ import org.eclipse.jetty.client.api.Response;
 import org.eclipse.jetty.client.api.Result;
 
 public class CompleteListenerWrapper implements Response.CompleteListener  {
-    private Response.CompleteListener callback;
+    private Response.CompleteListener listener;
     private ContextSnapshot context;
 
-    public CompleteListenerWrapper(Response.CompleteListener callback, 
ContextSnapshot context) {
-        this.callback = callback;
+    public CompleteListenerWrapper(Response.CompleteListener listener, 
ContextSnapshot context) {
+        this.listener = listener;
         this.context = context;
     }
 
@@ -43,9 +43,9 @@ public class CompleteListenerWrapper implements 
Response.CompleteListener  {
         if (context != null) {
             ContextManager.continued(context);
         }
-        if (callback != null) {
-            callback.onComplete(result);
+        if (listener != null) {
+            listener.onComplete(result);
         }
         ContextManager.stopSpan();
     }
-}
+}
\ No newline at end of file
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java
 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java
similarity index 54%
copy from 
apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java
copy to 
apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java
index 50697bf3e4..09102cdc43 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java
@@ -1,51 +1,92 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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
- *
- *     http://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 org.apache.skywalking.apm.plugin.jetty.v9.client;
-
-import org.apache.skywalking.apm.agent.core.context.ContextManager;
-import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
-import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
-import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
-import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
-import org.eclipse.jetty.client.api.Response;
-import org.eclipse.jetty.client.api.Result;
-
-public class CompleteListenerWrapper implements Response.CompleteListener  {
-    private Response.CompleteListener callback;
-    private ContextSnapshot context;
-
-    public CompleteListenerWrapper(Response.CompleteListener callback, 
ContextSnapshot context) {
-        this.callback = callback;
-        this.context = context;
-    }
-
-    @Override
-    public void onComplete(Result result) {
-        AbstractSpan span = 
ContextManager.createLocalSpan(Constants.PLUGIN_NAME + 
"/CompleteListener/onComplete");
-        span.setComponent(ComponentsDefine.JETTY_CLIENT);
-        SpanLayer.asHttp(span);
-        if (context != null) {
-            ContextManager.continued(context);
-        }
-        if (callback != null) {
-            callback.onComplete(result);
-        }
-        ContextManager.stopSpan();
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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
+ *
+ *     http://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 org.apache.skywalking.apm.plugin.jetty.v9.client;
+
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+import org.eclipse.jetty.client.api.Response;
+import org.eclipse.jetty.client.api.Result;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.util.Callback;
+
+import java.nio.ByteBuffer;
+
+public class ResponseListenerWrapper implements Response.Listener {
+
+    private final Response.Listener listener;
+
+    private final ContextSnapshot context;
+
+    public ResponseListenerWrapper(Response.Listener listener, ContextSnapshot 
context) {
+        this.listener = listener;
+        this.context = context;
+    }
+
+    @Override
+    public void onComplete(Result result) {
+        AbstractSpan span = 
ContextManager.createLocalSpan(Constants.PLUGIN_NAME + 
"/CompleteListener/onComplete");
+        span.setComponent(ComponentsDefine.JETTY_CLIENT);
+        SpanLayer.asHttp(span);
+        if (context != null) {
+            ContextManager.continued(context);
+        }
+        if (listener != null) {
+            listener.onComplete(result);
+        }
+        ContextManager.stopSpan();
+    }
+
+    @Override
+    public void onHeaders(Response response) {
+        listener.onHeaders(response);
+    }
+
+    @Override
+    public void onContent(Response response, ByteBuffer content, Callback 
callback) {
+        listener.onContent(response, content, callback);
+    }
+
+    @Override
+    public void onContent(Response response, ByteBuffer content) {
+        listener.onContent(response, content);
+    }
+
+    @Override
+    public void onBegin(Response response) {
+        listener.onBegin(response);
+    }
+
+    @Override
+    public boolean onHeader(Response response, HttpField field) {
+        return listener.onHeader(response, field);
+    }
+
+    @Override
+    public void onSuccess(Response response) {
+        listener.onSuccess(response);
+    }
+
+    @Override
+    public void onFailure(Response response, Throwable failure) {
+        listener.onFailure(response, failure);
+    }
+}
\ No newline at end of file
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java
 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java
index ae3dc47db1..fb044435da 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java
@@ -33,6 +33,7 @@ import org.apache.skywalking.apm.agent.test.tools.SpanAssert;
 import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
 import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
 import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpConversation;
 import org.eclipse.jetty.client.HttpRequest;
 import org.eclipse.jetty.client.ResponseNotifier;
 import org.eclipse.jetty.client.api.Response;
@@ -82,8 +83,8 @@ public class AsyncHttpRequestSendInterceptorTest {
 
     @Before
     public void setUp() throws Exception {
-        httpRequestEnhancedInstance = new MockHttpRequest(httpClient, uri);
-        responseNotifierEnhancedInstance = new 
MockResponseNotifier(httpClient);
+        httpRequestEnhancedInstance = new MockHttpRequest(httpClient, new 
HttpConversation(), uri);
+        responseNotifierEnhancedInstance = new MockResponseNotifier();
 
         Result results = new Result(httpRequestEnhancedInstance, response);
         allArguments = new Object[]{(Response.CompleteListener) result -> { }, 
results};
@@ -146,8 +147,8 @@ public class AsyncHttpRequestSendInterceptorTest {
     }
 
     private class MockHttpRequest extends HttpRequest implements 
EnhancedInstance {
-        public MockHttpRequest(HttpClient httpClient, URI uri) {
-            super(httpClient, uri);
+        public MockHttpRequest(HttpClient client, HttpConversation 
conversation, URI uri) {
+            super(httpClient, conversation, uri);
         }
 
         @Override
@@ -172,8 +173,8 @@ public class AsyncHttpRequestSendInterceptorTest {
     }
 
     private class MockResponseNotifier extends ResponseNotifier implements 
EnhancedInstance {
-        public MockResponseNotifier(HttpClient client) {
-            super(client);
+        public MockResponseNotifier() {
+            super();
         }
 
         @Override
diff --git 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java
 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java
index e4a861fbc7..6f9d2ec489 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java
@@ -34,6 +34,7 @@ import 
org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint;
 import org.apache.skywalking.apm.agent.test.tools.SpanAssert;
 import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
 import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpConversation;
 import org.eclipse.jetty.client.HttpRequest;
 import org.junit.Assert;
 import org.junit.Before;
@@ -67,7 +68,7 @@ public class SyncHttpRequestSendInterceptorTest {
 
     @Before
     public void setUp() throws Exception {
-        enhancedInstance = new MockHttpRequest(httpClient, uri);
+        enhancedInstance = new MockHttpRequest(httpClient, new 
HttpConversation(), uri);
         allArguments = new Object[] {
             "OperationKey",
             "OperationValue"
@@ -123,8 +124,8 @@ public class SyncHttpRequestSendInterceptorTest {
     }
 
     private class MockHttpRequest extends HttpRequest implements 
EnhancedInstance {
-        public MockHttpRequest(HttpClient httpClient, URI uri) {
-            super(httpClient, uri);
+        public MockHttpRequest(HttpClient client, HttpConversation 
conversation, URI uri) {
+            super(httpClient, conversation, uri);
         }
 
         @Override
diff --git 
a/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java
 
b/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java
index d45d8adfed..4e31db9383 100644
--- 
a/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java
+++ 
b/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.apm.testcase.jettyclient.contr;
+package org.apache.skywalking.apm.testcase.jettyclient.controller;
 
 import javax.annotation.PostConstruct;
 import java.io.IOException;
@@ -26,6 +26,8 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.api.Response;
+import org.eclipse.jetty.client.api.Result;
+import org.eclipse.jetty.client.util.BufferingResponseListener;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.PropertySource;
 import org.springframework.stereotype.Controller;
@@ -51,13 +53,19 @@ public class CaseController {
     @ResponseBody
     public String jettyClientScenario() throws Exception {
         client.newRequest("http://"; + jettyServerHost + 
":18080/jettyserver-case/case/receiveContext-0").send();
-        Response.CompleteListener listener = result -> {
-            CloseableHttpClient httpclient = HttpClients.createDefault();
-            HttpGet httpget = new HttpGet("http://"; + jettyServerHost + 
":18080/jettyserver-case/case/receiveContext-0");
-            try {
-                httpclient.execute(httpget);
-            } catch (IOException e) {
-                throw new RuntimeException(e);
+        Response.Listener listener = new BufferingResponseListener() {
+            public void onComplete(Result result) {
+                byte[] bytes = this.getContent();
+                if (bytes == null || bytes.length == 0) {
+                    throw new RuntimeException("content cant be empty");
+                }
+                CloseableHttpClient httpclient = HttpClients.createDefault();
+                HttpGet httpget = new HttpGet("http://"; + jettyServerHost + 
":18080/jettyserver-case/case/receiveContext-0");
+                try {
+                    httpclient.execute(httpget);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
             }
         };
         client.newRequest("http://"; + jettyServerHost + 
":18080/jettyserver-case/case/receiveContext-1").send(listener);
diff --git 
a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java
 
b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java
index 667fdafd16..4075fc0e34 100644
--- 
a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java
+++ 
b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.apm.testcase.jettyserver.servlet;
 
 import java.io.IOException;
+import java.io.PrintWriter;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -31,6 +32,9 @@ public class AsyncCaseServlet extends HttpServlet {
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
         try {
             Thread.sleep(2000);
+            resp.setContentType("text/plain;charset=UTF-8");
+            PrintWriter out = resp.getWriter();
+            out.print("Success");
         } catch (InterruptedException e) {
         }
     }
diff --git 
a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java
 
b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java
index 9dfae15f64..22b6eeac90 100644
--- 
a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java
+++ 
b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.apm.testcase.jettyserver.servlet;
 
 import java.io.IOException;
+import java.io.PrintWriter;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -31,6 +32,9 @@ public class CaseServlet extends HttpServlet {
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
         try {
             Thread.sleep(2000);
+            resp.setContentType("text/plain;charset=UTF-8");
+            PrintWriter out = resp.getWriter();
+            out.print("Success");
         } catch (InterruptedException e) {
         }
     }


Reply via email to