Skip to content

Commit f5efab3

Browse files
committed
Reorganize advice classes by target client
1 parent bc64498 commit f5efab3

12 files changed

+64
-53
lines changed

src/main/java/tech/httptoolkit/javaagent/JettyResetDestinationsAdvice.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

src/main/java/tech/httptoolkit/javaagent/ReturnProxySelectorAdvice.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import net.bytebuddy.asm.Advice;
44

5-
import java.net.InetSocketAddress;
6-
import java.net.Proxy;
75
import java.net.ProxySelector;
86
import java.util.Optional;
97

src/main/java/tech/httptoolkit/javaagent/ApacheSetSslSocketFactoryAdvice.java renamed to src/main/java/tech/httptoolkit/javaagent/apacheclient/ApacheSetSslSocketFactoryAdvice.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
package tech.httptoolkit.javaagent;
1+
package tech.httptoolkit.javaagent.apacheclient;
22

33
import net.bytebuddy.asm.Advice;
4+
import tech.httptoolkit.javaagent.HttpProxyAgent;
45

56
import java.lang.reflect.Field;
67
import java.util.Arrays;

src/main/java/tech/httptoolkit/javaagent/ApacheV4ReturnProxyRouteAdvice.java renamed to src/main/java/tech/httptoolkit/javaagent/apacheclient/ApacheV4ReturnProxyRouteAdvice.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
package tech.httptoolkit.javaagent;
1+
package tech.httptoolkit.javaagent.apacheclient;
22

33
import net.bytebuddy.asm.Advice;
44
import org.apache.http.HttpHost;
55
import org.apache.http.conn.routing.HttpRoute;
6+
import tech.httptoolkit.javaagent.HttpProxyAgent;
67

78
public class ApacheV4ReturnProxyRouteAdvice {
89
@Advice.OnMethodExit

src/main/java/tech/httptoolkit/javaagent/ApacheV5ReturnProxyRouteAdvice.java renamed to src/main/java/tech/httptoolkit/javaagent/apacheclient/ApacheV5ReturnProxyRouteAdvice.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
package tech.httptoolkit.javaagent;
1+
package tech.httptoolkit.javaagent.apacheclient;
22

33
import net.bytebuddy.asm.Advice;
44
import org.apache.hc.core5.http.HttpHost;
55
import org.apache.hc.client5.http.HttpRoute;
6+
import tech.httptoolkit.javaagent.HttpProxyAgent;
67

78
public class ApacheV5ReturnProxyRouteAdvice {
89
@Advice.OnMethodExit
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package tech.httptoolkit.javaagent.jettyclient;
2+
3+
import net.bytebuddy.asm.Advice;
4+
import org.eclipse.jetty.client.*;
5+
6+
import java.util.Collections;
7+
import java.util.Map;
8+
import java.util.Set;
9+
import java.util.WeakHashMap;
10+
11+
public class JettyResetDestinationsAdvice {
12+
13+
// Track each client with a weak ref, to avoid unnecessary reflection overhead by only
14+
// initializing them once, instead of every request
15+
public static Set<Object> patchedHttpClients = Collections.newSetFromMap(new WeakHashMap());
16+
17+
@Advice.OnMethodEnter
18+
public static void beforeResolveDestination(
19+
@Advice.This Object thisHttpClient
20+
// ^ Note that we can't use the real HttpClient type here, since this class is redefining it, so it would
21+
// cause a circular reference that breaks patching completely.
22+
) {
23+
if (patchedHttpClients.contains(thisHttpClient)) return;
24+
25+
// If this is the first time that we've seen this client, it's possible that it existed before we attached,
26+
// and it might have some existing open connections that don't use our proxy. To fix that, just once per
27+
// client, we use reflection to get the destinations (cached connections) and reset them.
28+
try {
29+
@SuppressWarnings("unchecked")
30+
Map<Origin, HttpDestination> destinations = (Map<Origin, HttpDestination>)
31+
thisHttpClient.getClass().getDeclaredField("destinations").get(thisHttpClient);
32+
33+
// Reset this destinations list:
34+
for (HttpDestination destination : destinations.values()) {
35+
destination.close();
36+
}
37+
destinations.clear();
38+
} catch (Exception e) {
39+
throw new RuntimeException(e);
40+
}
41+
42+
patchedHttpClients.add(thisHttpClient);
43+
}
44+
}

src/main/java/tech/httptoolkit/javaagent/JettyReturnProxyConfigurationAdvice.java renamed to src/main/java/tech/httptoolkit/javaagent/jettyclient/JettyReturnProxyConfigurationAdvice.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
package tech.httptoolkit.javaagent;
1+
package tech.httptoolkit.javaagent.jettyclient;
22

33
import net.bytebuddy.asm.Advice;
44
import org.eclipse.jetty.client.HttpProxy;
55
import org.eclipse.jetty.client.Origin;
66
import org.eclipse.jetty.client.ProxyConfiguration;
7+
import tech.httptoolkit.javaagent.HttpProxyAgent;
78

89
public class JettyReturnProxyConfigurationAdvice {
910
@Advice.OnMethodExit

src/main/java/tech/httptoolkit/javaagent/JettyReturnSslContextFactoryV10Advice.java renamed to src/main/java/tech/httptoolkit/javaagent/jettyclient/JettyReturnSslContextFactoryV10Advice.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
package tech.httptoolkit.javaagent;
1+
package tech.httptoolkit.javaagent.jettyclient;
22

33
import net.bytebuddy.asm.Advice;
44
import org.eclipse.jetty.util.ssl.SslContextFactory;
5+
import tech.httptoolkit.javaagent.HttpProxyAgent;
56

67
public class JettyReturnSslContextFactoryV10Advice {
78
@Advice.OnMethodExit

src/main/java/tech/httptoolkit/javaagent/JettyReturnSslContextFactoryV9Advice.java renamed to src/main/java/tech/httptoolkit/javaagent/jettyclient/JettyReturnSslContextFactoryV9Advice.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
package tech.httptoolkit.javaagent;
1+
package tech.httptoolkit.javaagent.jettyclient;
22

33
import net.bytebuddy.asm.Advice;
44
import org.eclipse.jetty.util.ssl.SslContextFactory;
5+
import tech.httptoolkit.javaagent.HttpProxyAgent;
56

67
public class JettyReturnSslContextFactoryV9Advice {
78

src/main/java/tech/httptoolkit/javaagent/JettyV9StubContextFactory.java renamed to src/main/java/tech/httptoolkit/javaagent/jettyclient/JettyV9StubContextFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tech.httptoolkit.javaagent;
1+
package tech.httptoolkit.javaagent.jettyclient;
22

33
import org.eclipse.jetty.util.ssl.SslContextFactory;
44

0 commit comments

Comments
 (0)