You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2019/06/19 12:38:47 UTC

[sling-whiteboard] branch master updated: url-connection-agent moved to https://github.com/apache/sling-org-apache-sling-connection-timeout-agent

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

rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git


The following commit(s) were added to refs/heads/master by this push:
     new 4bcce72  url-connection-agent moved to https://github.com/apache/sling-org-apache-sling-connection-timeout-agent
4bcce72 is described below

commit 4bcce72e1a8fda9c58d255558f6c6d28a6739a92
Author: Robert Munteanu <ro...@apache.org>
AuthorDate: Wed Jun 19 14:38:09 2019 +0200

    url-connection-agent moved to https://github.com/apache/sling-org-apache-sling-connection-timeout-agent
---
 pom.xml                                            |   1 -
 url-connection-agent/README.md                     |  55 ------
 url-connection-agent/pom.xml                       | 142 --------------
 .../main/java/org/apache/sling/uca/impl/Agent.java |  72 -------
 .../java/org/apache/sling/uca/impl/AgentInfo.java  |  77 --------
 .../org/apache/sling/uca/impl/AgentInfoMBean.java  |  52 ------
 .../uca/impl/HttpClient3TimeoutTransformer.java    |  61 ------
 .../uca/impl/HttpClient4TimeoutTransformer.java    |  35 ----
 .../sling/uca/impl/JavaNetTimeoutTransformer.java  |  65 -------
 .../main/java/org/apache/sling/uca/impl/Log.java   | 113 -----------
 .../uca/impl/MBeanAwareTimeoutTransformer.java     |  75 --------
 .../sling/uca/impl/OkHttpTimeoutTransformer.java   |  36 ----
 ...pdateFieldsInConstructorTimeoutTransformer.java |  62 ------
 .../java/org/apache/sling/uca/impl/AgentIT.java    | 206 --------------------
 .../org/apache/sling/uca/impl/AgentLauncher.java   | 107 -----------
 .../org/apache/sling/uca/impl/ErrorDescriptor.java |  37 ----
 .../apache/sling/uca/impl/HttpClientLauncher.java  | 208 ---------------------
 .../sling/uca/impl/MisbehavingServerControl.java   |  45 -----
 .../sling/uca/impl/MisbehavingServerExtension.java | 121 ------------
 .../apache/sling/uca/impl/RecordedThrowable.java   |  40 ----
 .../org/apache/sling/uca/impl/TestTimeouts.java    |  64 -------
 .../src/test/resources/simplelogger.properties     |  20 --
 22 files changed, 1694 deletions(-)

diff --git a/pom.xml b/pom.xml
index db99403..406d475 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,7 +41,6 @@
     <modules>
           <module>mdresourceprovider</module>
           <module>maven-central-source-reporter</module>
-          <module>url-connection-agent</module>
     </modules>
 </project>
 
diff --git a/url-connection-agent/README.md b/url-connection-agent/README.md
deleted file mode 100644
index d743d88..0000000
--- a/url-connection-agent/README.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Apache Sling HTTP timeout enforcer
-
-This module is part of the [Apache Sling](https://sling.apache.org) project.
-
-This module provides a java agent that uses the [instrumentation API](https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html) to add connect and read timeouts to `connect` made via HTTP or HTTPs. It only applies these timeouts if none were set explicitly.
-
-The agent is intended as an additional layer of control to use when running untrusted client code that may make calls without explicitly setting timeouts. It is always recommended to set timeouts in client code, rather than relying on this agent.
-
-It currently supports setting timeouts for HTTP connections done using:
-
-* [java.net.URL](https://docs.oracle.com/javase/7/docs/api/java/net/URL.html) and/or [java.net.URLConnection](https://docs.oracle.com/javase/7/docs/api/java/net/URLConnection.html)
-* [Apache Commons HttpClient 3.x](https://hc.apache.org/httpclient-3.x/)
-* [Apache HttpComponents Client 4.x](https://hc.apache.org/httpcomponents-client-ga/)
-* [OK Http](https://square.github.io/okhttp/)
-
-## Validation
-
-In addition to running the integration tests, you can also build the project with `mvn clean package` and then run a simple connection test with 
-
-    java -javaagent:target/org.apache.sling.connection-timeout-agent-0.0.1-SNAPSHOT-jar-with-dependencies.jar=<agent-connect-timeout>,<agent-read-timeout> -cp target/test-classes:target/it-dependencies/* org.apache.sling.uca.impl.HttpClientLauncher <url> <client-type> [<client-connect-timeout> <client-read-timeout>]
-    
- The parameters are as follows:
- 
- - `<agent-connect-timeout>` - connection timeout in milliseconds to apply via the agent
- - `<agent-read-timeout>`- read timeout in milliseconds to apply via the agent
- - `<url>` - the URL to access
- - `<client-type>` - the client type, either `JavaNet` for java.net.URL-based connections ,`HC3` for Apache Commons HttpClient 3.x, `HC4` for Apache Commons HttpClient 4.x or `OkHttp` for OK HTTP.
- - `<client-connect-timeout>` (optional) - the connection timeout in milliseconds to apply via client APIs
- - `<client-read-timeout>` (optional) - the read timeout in milliseconds to apply via client APIs
- 
-The read and connect timeouts may be specified for both the agent and client APIs. The reason is that the agent should not change the timeout defaults if they are already set. Therefore, setting the agent timeouts to a very high value and the client API timeouts to a very low value ( e.g. 1 millisecond ) should still result in a timeout. 
- 
- 
- For a test that always fails, set one of the timeouts to 1. Both executions listed below will typically fail:
- 
- ```
-java -javaagent:target/org.apache.sling.connection-timeout-agent-0.0.1-SNAPSHOT-jar-with-dependencies.jar=1,1000 -cp target/test-classes:target/it-dependencies/* org.apache.sling.uca.impl.HttpClientLauncher https://sling.apache.org JavaNet
-java -javaagent:target/org.apache.sling.connection-timeout-agent-0.0.1-SNAPSHOT-jar-with-dependencies.jar=1000,1 -cp target/test-classes:target/it-dependencies/* org.apache.sling.uca.impl.HttpClientLauncher https://sling.apache.org JavaNet
- ```
- 
-In contrast, the execution below should succeed:
-
-```
-java -javaagent:target/org.apache.sling.connection-timeout-agent-0.0.1-SNAPSHOT-jar-with-dependencies.jar=1000,1000 -cp target/test-classes:target/it-dependencies/* org.apache.sling.uca.impl.HttpClientLauncher https://sling.apache.org JavaNet
-```
-
-To use this in your own project you should 
-
-## Tested platforms
-
-* openjdk version "1.8.0_212"
-* openjdk version "11.0.2" 2019-01-15
-* commons-httpclient 3.1
-* httpclient 4.5.4
-* okhttp 3.14.2
\ No newline at end of file
diff --git a/url-connection-agent/pom.xml b/url-connection-agent/pom.xml
deleted file mode 100644
index 2a6416e..0000000
--- a/url-connection-agent/pom.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<!--
-    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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.sling</groupId>
-        <artifactId>sling</artifactId>
-        <version>35</version>
-        <relativePath/>
-    </parent>
-    <artifactId>org.apache.sling.connection-timeout-agent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-
-    <build>
-        <plugins>
-            <plugin>
-                <!-- package the agent as an all-in-one jar -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <archiveBaseDirectory>${project.basedir}</archiveBaseDirectory>
-                            <archive>
-                                <manifestEntries>
-                                    <Premain-Class>org.apache.sling.uca.impl.Agent</Premain-Class>
-                                    <Can-Redefine-Classes>true</Can-Redefine-Classes>
-                                    <Can-Retransform-Classes>true</Can-Retransform-Classes>
-                                </manifestEntries>
-                            </archive>
-                            <descriptorRefs>
-                                <descriptorRef>jar-with-dependencies</descriptorRef>
-                            </descriptorRefs>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <!-- save certain jars in a well-known location for easy usage in tests -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>copy-it-dependencies</id>
-                        <phase>pre-integration-test</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <outputDirectory>${project.build.directory}/it-dependencies</outputDirectory>
-                    <stripVersion>true</stripVersion>
-                </configuration>
-            </plugin>
-            <plugin>
-                <!-- Run ITs in the integration-test phase, once the agent jar is packaged -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-failsafe-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>integration-test</goal>
-                            <goal>verify</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.javassist</groupId>
-            <artifactId>javassist</artifactId>
-            <version>3.24.0-GA</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>9.4.18.v20190429</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-simple</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.junit.jupiter</groupId>
-            <artifactId>junit-jupiter</artifactId>
-            <version>5.4.2</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-httpclient</groupId>
-            <artifactId>commons-httpclient</artifactId>
-            <version>3.1</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jcl-over-slf4j</artifactId>
-            <version>1.7.25</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <version>4.5.4</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-          <groupId>com.squareup.okhttp3</groupId>
-          <artifactId>okhttp</artifactId>
-          <version>3.14.2</version>
-          <scope>test</scope>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/Agent.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/Agent.java
deleted file mode 100644
index d46c56c..0000000
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/Agent.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.instrument.Instrumentation;
-import java.lang.management.ManagementFactory;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.MBeanRegistrationException;
-import javax.management.NotCompliantMBeanException;
-
-public class Agent {
-
-    public static void premain(String args, Instrumentation inst) {
-        
-        String[] parsedArgs = args != null ? args.split(",") : new String[0];
-        long connectTimeout =  TimeUnit.MINUTES.toMillis(1);
-        long readTimeout = TimeUnit.MINUTES.toMillis(1);
-        String logSpec = "";
-        if ( parsedArgs.length > 0 )
-            connectTimeout = Long.parseLong(parsedArgs[0]);
-        if ( parsedArgs.length > 1 )
-            readTimeout = Long.parseLong(parsedArgs[1]);
-        if ( parsedArgs.length > 2)
-            logSpec = parsedArgs[2];
-        
-        Log.configure(logSpec);
-        
-        Log.get().log("Preparing to install URL transformers. Configured timeouts - connectTimeout : %d, readTimeout: %d", connectTimeout, readTimeout);
-
-        AgentInfo agentInfoMBean = new AgentInfo(connectTimeout, readTimeout);
-        
-        ClassFileTransformer[] transformers = new ClassFileTransformer[] {
-            new JavaNetTimeoutTransformer(connectTimeout, readTimeout, agentInfoMBean),
-            new HttpClient3TimeoutTransformer(connectTimeout, readTimeout, agentInfoMBean),
-            new HttpClient4TimeoutTransformer(connectTimeout, readTimeout, agentInfoMBean),
-            new OkHttpTimeoutTransformer(connectTimeout, readTimeout, agentInfoMBean)
-        };
-        
-        List<String> transformerNames = new ArrayList<>();
-        for ( ClassFileTransformer transformer : transformers ) {
-            inst.addTransformer(transformer, true);
-            transformerNames.add(transformer.getClass().getName());
-        }
-        
-        try {
-            ManagementFactory.getPlatformMBeanServer().registerMBean(agentInfoMBean, AgentInfo.NAME);
-        } catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) {
-            Log.get().log("Failed registering MBean: %s", e.getMessage());
-        }
-
-        Log.get().log("All transformers installed");
-    }    
-}
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfo.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfo.java
deleted file mode 100644
index 1a4f641..0000000
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfo.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.lang.instrument.ClassFileTransformer;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-
-public class AgentInfo implements AgentInfoMBean {
-    
-    static final ObjectName NAME;
-    
-    static {
-        try {
-            NAME = new ObjectName(AgentInfo.class.getPackage().getName()+":type=Agent");
-        } catch (MalformedObjectNameException e) {
-            throw new ExceptionInInitializerError(e);
-        }
-    }
-    
-    private final long connectTimeoutMillis;
-    
-    private final long readTimeoutMillis;
-
-    private List<String> transformers = new ArrayList<>();
-
-    private List<String> transformedClasses = new ArrayList<>();
-    
-
-    public AgentInfo(long connectTimeoutMillis, long readTimeoutMillis) {
-        this.connectTimeoutMillis = connectTimeoutMillis;
-        this.readTimeoutMillis = readTimeoutMillis;
-    }
-
-    @Override
-    public long getConnectTimeoutMillis() {
-        return connectTimeoutMillis;
-    }
-
-    @Override
-    public long getReadTimeoutMillis() {
-        return readTimeoutMillis;
-    }
-    
-    public String[] getTransformers() {
-        return transformers.toArray(new String[0]);
-    }
-    
-    public String[] getTransformedClasses() {
-        return transformedClasses.toArray(new String[0]);
-    }
-    
-    public void registerTransformedClass(String transformedClassName) {
-        transformedClasses.add(transformedClassName);
-    }
-    
-    public void registerTransformer(Class<? extends ClassFileTransformer> transformerClass) {
-        transformers.add(transformerClass.getName());
-    }
-}
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfoMBean.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfoMBean.java
deleted file mode 100644
index d0b9eb9..0000000
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfoMBean.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-/**
- * Exposes runtime information about the agent using <tt>JMX</tt>.
- *
- */
-public interface AgentInfoMBean {
-
-    /**
-     * Returns the connect timeout
-     * 
-     * @return the connect timeout as configured, in milliseconds
-     */
-    long getConnectTimeoutMillis();
-
-    /**
-     * Returns the read timeout
-     * 
-     * @return the read timeout as configured, in milliseconds
-     */
-    long getReadTimeoutMillis();
-    
-    /**
-     * Returns the active transformers
-     * 
-     * @return the active transformers
-     */
-    String[] getTransformers();
-    
-    /**
-     * Returns the classes that were transformed to enforce global timeout defaults
-     * 
-     * @return the classes that were transformed
-     */
-    String[] getTransformedClasses();
-}
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient3TimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient3TimeoutTransformer.java
deleted file mode 100644
index aa0b807..0000000
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient3TimeoutTransformer.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.util.Collections;
-
-import javassist.CtClass;
-import javassist.CtMethod;
-import javassist.bytecode.Descriptor;
-
-/**
- * Sets timeouts for HTTP calls done using <em>Apache Commons HttpClient 3.x</em>
- * 
- * <p>It inserts two calls in <tt>org.apache.commons.httpclient.params.DefaultHttpParamsFactory.createParams</tt> that set
- * default values for <tt>http.connection.timeout</tt> and <tt>http.socket.timeout</tt>.</p>
- */
-public class HttpClient3TimeoutTransformer extends MBeanAwareTimeoutTransformer {
-    
-    private static final String DEFAULT_HTTP_PARAMS_FACTORY_CLASS_NAME = Descriptor.toJvmName("org.apache.commons.httpclient.params.DefaultHttpParamsFactory");
-    
-    private final long connectTimeoutMillis;
-    private final long readTimeoutMillis;
-    
-    public HttpClient3TimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis, AgentInfo agentInfoMBean) {
-        super(agentInfoMBean, Collections.singleton(DEFAULT_HTTP_PARAMS_FACTORY_CLASS_NAME));
-        this.connectTimeoutMillis = connectTimeoutMillis;
-        this.readTimeoutMillis = readTimeoutMillis;
-    }
-
-    @Override
-    protected byte[] doTransformClass(CtClass cc) throws Exception {
-        
-        CtMethod getSoTimeout =  cc.getDeclaredMethod("createParams");
-        // javassist seems unable to resolve the constant values, so just inline them
-        // also, unable to resolve calls to setParameter with int values (no boxing?)
-        // HttpConnectionParams.CONNECTION_TIMEOUT
-        getSoTimeout.insertAfter("$_.setParameter(\"http.connection.timeout\", Integer.valueOf(" + connectTimeoutMillis + "));");
-        // HttpMethodParams.SO_TIMEOUT
-        getSoTimeout.insertAfter("$_.setParameter(\"http.socket.timeout\", Integer.valueOf(" + readTimeoutMillis + "));");
-        
-        byte[] classfileBuffer = cc.toBytecode();
-        cc.detach();
-        
-        return classfileBuffer;
-    }
-
-}
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java
deleted file mode 100644
index f888936..0000000
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import javassist.bytecode.Descriptor;
-
-/**
- * Sets timeouts for HTTP calls done using <em>Apache HttpComponents Client 4.x</em>
- * 
- * <p>It inserts two calls to <tt>org.apache.http.client.config.RequestConfig$Builder</tt> that set default
- * values for <tt>connectTimeout</tt> and <tt>socketTimeout</tt>.</p>
- */
-public class HttpClient4TimeoutTransformer extends UpdateFieldsInConstructorTimeoutTransformer {
-
-    private static final String REQUEST_CONFIG_BUILDER_CLASS_NAME = Descriptor.toJvmName("org.apache.http.client.config.RequestConfig$Builder");
-    
-    public HttpClient4TimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis, AgentInfo agentInfoMBean) {
-        super(REQUEST_CONFIG_BUILDER_CLASS_NAME, "connectTimeout", "socketTimeout",
-            connectTimeoutMillis, readTimeoutMillis, agentInfoMBean);
-    }
-}
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/JavaNetTimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/JavaNetTimeoutTransformer.java
deleted file mode 100644
index 2e5654b..0000000
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/JavaNetTimeoutTransformer.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.net.URLConnection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javassist.CtClass;
-import javassist.CtMethod;
-import javassist.bytecode.Descriptor;
-
-/**
- * Sets timeouts for HTTP calls done using <tt>java.net.URL</tt>/<tt>java.net.URLConnection</tt>.
- * 
- * <p>It transforms calls to <tt>connect</tt> methods of internal URL connection classes to set the
- * connect and read timeout in case they have the default value of <tt>0</tt>.</p>
- * 
- * @see URLConnection#getConnectTimeout()
- * @see URLConnection#getReadTimeout()
- *
- */
-class JavaNetTimeoutTransformer extends MBeanAwareTimeoutTransformer {
-
-    static final Set<String> CLASSES_TO_TRANSFORM = new HashSet<>();
-
-    static {
-        CLASSES_TO_TRANSFORM.add(Descriptor.toJvmName("sun.net.www.protocol.http.HttpURLConnection"));
-        CLASSES_TO_TRANSFORM.add(Descriptor.toJvmName("sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection"));
-    }
-
-    private final long readTimeoutMillis;
-    private final long connectTimeoutMillis;
-    public JavaNetTimeoutTransformer(long connectTimeout, long readTimeout, AgentInfo agentInfo) {
-        
-        super(agentInfo, CLASSES_TO_TRANSFORM);
-        
-        this.connectTimeoutMillis = connectTimeout;
-        this.readTimeoutMillis = readTimeout;
-    }
-
-    protected byte[] doTransformClass(CtClass cc) throws Exception {
-        CtMethod connectMethod = cc.getDeclaredMethod("connect");
-        connectMethod.insertBefore("if ( getConnectTimeout() == 0 ) { setConnectTimeout(" + connectTimeoutMillis + "); }");
-        connectMethod.insertBefore("if ( getReadTimeout() == 0 ) { setReadTimeout(" + readTimeoutMillis + "); }");
-        byte[] classfileBuffer = connectMethod.getDeclaringClass().toBytecode();
-        connectMethod.getDeclaringClass().detach();
-        return classfileBuffer;
-    }
-
-}
\ No newline at end of file
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/Log.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/Log.java
deleted file mode 100644
index 900f426..0000000
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/Log.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import static java.util.Objects.requireNonNull;
-
-import java.util.Formatter;
-
-/**
- * Simple logger abstraction
- * 
- * <p>This is an intentionally simple and simplistic logger for agent-internal usage. Since the agent environment
- * is limited and can make no assumption about how it will be used, it only uses the console and no
- * external libraries.</p>
- * 
- * <p>It is required to call {@link #configure(String)} before accessing the log instance using {@link #get()}.</p>
- *
- */
-abstract class Log {
-    
-    private static Log INSTANCE;
-
-    /**
-     * Configures the global logger instance
-     * 
-     * @param spec the logger spec, <tt>v</tt> for a console log, anything else for a no-op log
-     */
-    public static void configure(String spec) {
-        INSTANCE = "v".equals(spec) ? new ConsoleLog() : new NoopLog();
-    }
-    
-    /**
-     * Gets the global logger instance, configured with {@link #configure(String)}
-     * 
-     * @return the global logger instance
-     * @throws NullPointerException in case the logger is not configured
-     */
-    public static Log get() {
-        return requireNonNull(INSTANCE, "Log is null, did you foget to call Log.configure() ?");
-    }
-
-    private Log() {
-
-    }
-
-    /**
-     * Logs a message
-     * 
-     * <p>The message and the arguments are interpolated using a {@link Formatter}, e.g.
-     * 
-     * <pre>Logger.get().log("Transforming %s", klazz.getName());</pre>
-     * 
-     *  </p>
-     *  
-     *  <p>The line separator <tt>%n</tt> is automatically appended to the message.</p>
-     * 
-     * @param msg the message
-     * @param args the arguments
-     */
-    public abstract void log(String msg, Object... args);
-    
-    /**
-     * Prints the throwable stack trace and throws a <tt>RuntimeException</tt>
-     * 
-     * @param message the message to include in the <tt>RuntimeException</tt>
-     * @param t the throwable to print the stack trace for 
-     */
-    public abstract void fatal(String message, Throwable t);
-
-    static class ConsoleLog extends Log {
-
-        private static final String LOG_ENTRY_PREFIX = "[AGENT] ";
-
-        @Override
-        public void log(String msg, Object... args) {
-            System.out.format(LOG_ENTRY_PREFIX + msg + " %n", args);
-        }
-        
-        @Override
-        public void fatal(String msg, Throwable t) {
-            t.printStackTrace(); // ensure _something_ is printed
-            throw new RuntimeException(LOG_ENTRY_PREFIX + msg, t);
-            
-        }
-    }
-    
-    static class NoopLog extends Log {
-
-        @Override
-        public void log(String msg, Object... args) {
-            // empty by design
-        }
-        
-        @Override
-        public void fatal(String message, Throwable t) {
-            // empty by design
-        }
-    }
-}
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/MBeanAwareTimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/MBeanAwareTimeoutTransformer.java
deleted file mode 100644
index bf7eb02..0000000
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/MBeanAwareTimeoutTransformer.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.lang.instrument.ClassFileTransformer;
-import java.security.ProtectionDomain;
-import java.util.Set;
-
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.bytecode.Descriptor;
-
-/**
- * Support class for transformers that expose runtime information through JMX
- * 
- * <p>All transformer implementations should extend from this base class.</p>
- *
- */
-public abstract class MBeanAwareTimeoutTransformer implements ClassFileTransformer {
-
-    private final AgentInfo agentInfo;
-    private final Set<String> classesToTransform;
-
-    public MBeanAwareTimeoutTransformer(AgentInfo agent, Set<String> classesToTransform) {
-        this.agentInfo = agent;
-        this.classesToTransform = classesToTransform;
-        this.agentInfo.registerTransformer(getClass());
-    }
-
-    @Override
-    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
-        try {
-            if (classesToTransform.contains(className)) {
-                Log.get().log("%s asked to transform %s", getClass().getSimpleName(), className);
-                ClassPool defaultPool = ClassPool.getDefault();
-                CtClass cc = defaultPool.get(Descriptor.toJavaName(className));
-                if ( cc == null ) {
-                    Log.get().log("Could not find a class for %s in the default class pool, skipping transformation", className);
-                } else {
-                    classfileBuffer = doTransformClass(cc);
-                    Log.get().log("Transformation of %s complete", className);
-                    this.agentInfo.registerTransformedClass(className);
-                }
-            }
-            return classfileBuffer;
-        } catch (Exception e) {
-            Log.get().fatal("Transformation failed", e);
-            return null;
-        }
-    }
-
-    /**
-     * Transform a class that is guaranteed to exist and in scope of this agent instance
-     * 
-     * @param cc the class
-     * @return the new class definition
-     * @throws Exception in case of any problems while transforming
-     */
-    protected abstract byte[] doTransformClass(CtClass cc) throws Exception;
-
-}
\ No newline at end of file
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java
deleted file mode 100644
index 458996e..0000000
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import javassist.bytecode.Descriptor;
-
-/**
- * Sets timeouts for HTTP calls done using <em>OkHttp 3.x</em>
- * 
- * <p>It inserts two calls to <tt>okhttp3.OkHttpClient$Builder</tt> that set default
- * values for <tt>connectTimeout</tt> and <tt>readTimeout</tt>.</p>
- */
-public class OkHttpTimeoutTransformer extends UpdateFieldsInConstructorTimeoutTransformer {
-
-    private static final String REQUEST_CONFIG_BUILDER_CLASS_NAME = Descriptor.toJvmName("okhttp3.OkHttpClient$Builder");
-    
-    public OkHttpTimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis, AgentInfo agentInfoMBean) {
-        
-        super(REQUEST_CONFIG_BUILDER_CLASS_NAME, "connectTimeout", "readTimeout", 
-            connectTimeoutMillis, readTimeoutMillis, agentInfoMBean);
-    }
-}
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/UpdateFieldsInConstructorTimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/UpdateFieldsInConstructorTimeoutTransformer.java
deleted file mode 100644
index 3757137..0000000
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/UpdateFieldsInConstructorTimeoutTransformer.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.util.Collections;
-
-import javassist.CtClass;
-import javassist.CtConstructor;
-import javassist.CtField;
-import javassist.bytecode.Descriptor;
-
-/**
- * Support class for transformers that update the timeout fields in the default constructor
- */
-public abstract class UpdateFieldsInConstructorTimeoutTransformer extends MBeanAwareTimeoutTransformer {
-
-    private final String connectTimeoutFieldName;
-    private final String readTimeoutFieldName;
-    private final long connectTimeoutMillis;
-    private final long readTimeoutMillis;
-
-    public UpdateFieldsInConstructorTimeoutTransformer(String className, String connectTimeoutFieldName,
-            String readTimeoutFieldName, long connectTimeoutMillis, long readTimeoutMillis, AgentInfo agentInfo) {
-
-        super(agentInfo, Collections.singleton(className));
-        
-        this.connectTimeoutFieldName = connectTimeoutFieldName;
-        this.readTimeoutFieldName = readTimeoutFieldName;
-        this.connectTimeoutMillis = connectTimeoutMillis;
-        this.readTimeoutMillis = readTimeoutMillis;
-    }
-    
-    @Override
-    protected byte[] doTransformClass(CtClass cc) throws Exception {
-        
-        CtConstructor noArgCtor = cc.getConstructor(Descriptor.ofConstructor(new CtClass[0]));
-        CtField connectTimeout = cc.getDeclaredField(connectTimeoutFieldName);
-        CtField readTimeout = cc.getDeclaredField(readTimeoutFieldName);
-        noArgCtor.insertAfter("this." + connectTimeout.getName() + " = " + connectTimeoutMillis + ";");
-        noArgCtor.insertAfter("this." + readTimeout.getName() + " = " + readTimeoutMillis + ";");
-        
-        byte[] classfileBuffer = cc.toBytecode();
-        cc.detach();
-        
-        return classfileBuffer;
-    }
-
-}
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentIT.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentIT.java
deleted file mode 100644
index 0fd4d8a..0000000
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentIT.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import static java.time.Duration.ofSeconds;
-import static java.util.Objects.requireNonNull;
-import static org.apache.sling.uca.impl.HttpClientLauncher.ClientType.HC3;
-import static org.apache.sling.uca.impl.HttpClientLauncher.ClientType.HC4;
-import static org.apache.sling.uca.impl.HttpClientLauncher.ClientType.JavaNet;
-import static org.apache.sling.uca.impl.HttpClientLauncher.ClientType.OkHttp;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTimeout;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.io.IOException;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.httpclient.ConnectTimeoutException;
-import org.apache.sling.uca.impl.HttpClientLauncher.ClientType;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.EnumSource;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Validates that accessing URLs that exhibit connection problems results in a timeouts being fired when the agent is used
- * 
- * <p>This test validates that the agent works when statically loaded, i.e. with a <tt>-javaagent:</tt> flag
- * passed to the JVM. As such it requires launching a new JVM instance each time, otherwise the results are
- * not valid.</p>
- * 
- * <p>It does so by reusing the same JVM as the one running the test. Validation is done by looking for a
- * Throwable information in the stderr and recording the exception class name and the message.</p>
- */
-@ExtendWith(MisbehavingServerExtension.class)
-public class AgentIT {
-    
-    static final int EXECUTION_TIMEOUT_SECONDS = 7;
-    static final int CONNECT_TIMEOUT_SECONDS = 3;
-    static final int READ_TIMEOUT_SECONDS = 3;
-    
-    static final String EXCEPTION_MARKER = "Exception in thread \"main\" ";
-    private static final Path STDERR = Paths.get("target", "stderr.txt");
-    private static final Path STDOUT = Paths.get("target", "stdout.txt");
-    private static final Logger LOG = LoggerFactory.getLogger(AgentIT.class);
-    
-    private static Map<ClientType, ErrorDescriptor> errorDescriptors = new EnumMap<>(ClientType.class);
-    static {
-        errorDescriptors.put(JavaNet, new ErrorDescriptor(SocketTimeoutException.class, "connect timed out", "Read timed out"));
-        errorDescriptors.put(HC3, new ErrorDescriptor(ConnectTimeoutException.class, "The host did not accept the connection within timeout of 3000 ms", "Read timed out"));
-        errorDescriptors.put(HC4, new ErrorDescriptor(org.apache.http.conn.ConnectTimeoutException.class, 
-                "Connect to repo1.maven.org:81 \\[.*\\] failed: connect timed out", "Read timed out"));
-        errorDescriptors.put(OkHttp, new ErrorDescriptor(SocketTimeoutException.class, "connect timed out", "timeout"));
-    }
-
-    /**
-     * Creates a matrix of all arguments to use for the read and connect timeout tests
-     * 
-     * <p>This matrix uses all client types and pairs them with each of the timeouts, for now:
-     * 
-     * <ol>
-     *   <li>default timeouts, which mean the agent-set default timeout will kick in</li>
-     *   <li>lower client API timeouts, which mean that the client-enforced timeouts will be applied</li>
-     * </ol>
-     * 
-     * </p>
-     * 
-     * @return a list of arguments to use for the tests
-     */
-    static List<Arguments> argumentsMatrix() {
-        
-        List<Arguments> args = new ArrayList<Arguments>();
-        
-        TestTimeouts clientLower = new TestTimeouts.Builder()
-            .agentTimeouts(Duration.ofMinutes(1), Duration.ofMinutes(1))
-            .clientTimeouts(Duration.ofSeconds(CONNECT_TIMEOUT_SECONDS), Duration.ofSeconds(READ_TIMEOUT_SECONDS))
-            .build();
-    
-        for ( ClientType client : ClientType.values() )
-            for ( TestTimeouts timeout : new TestTimeouts[] { TestTimeouts.DEFAULT, clientLower } )
-                args.add(Arguments.of(client, timeout));
-        
-        return args;
-    }
-
-    
-    /**
-     * Validates that connecting to a unaccessible port on an existing port fails with a connect 
-     * timeout exception
-     * 
-     * <p>It is surprisingly hard to simulate a connnection timeout. The most reliable way seems to
-     * be to get a firewall to drop packets, but this is very hard to do portably and safely
-     * in a unit test. The least bad possible solution is to access an URL that we know will timeout
-     * and that is able to sustain additional traffic. Maven Central is a good candidate for that.</p>
-     * 
-     * @throws IOException various I/O problems 
-     */
-    @ParameterizedTest
-    @MethodSource("argumentsMatrix")
-    public void connectTimeout(ClientType clientType, TestTimeouts timeouts) throws IOException {
-
-        ErrorDescriptor ed =  requireNonNull(errorDescriptors.get(clientType), "Unhandled clientType " + clientType);
-        RecordedThrowable error = assertTimeout(ofSeconds(EXECUTION_TIMEOUT_SECONDS),  
-            () -> runTest("http://repo1.maven.org:81", clientType, timeouts, false));
-        
-        assertEquals(ed.connectTimeoutClass.getName(), error.className);
-        assertTrue(error.message.matches(ed.connectTimeoutMessageRegex), 
-            "Actual message " + error.message + " did not match regex " + ed.connectTimeoutMessageRegex);
-    }
-
-    /**
-     * Validates that connecting to a host that delays the response fails with a read timeout
-     * 
-     * @throws IOException various I/O problems
-     * @throws InterruptedException 
-     */
-    @ParameterizedTest
-    @MethodSource("argumentsMatrix")
-    public void readTimeout(ClientType clientType, TestTimeouts timeouts, MisbehavingServerControl server) throws IOException, InterruptedException {
-        
-        ErrorDescriptor ed =  requireNonNull(errorDescriptors.get(clientType), "Unhandled clientType " + clientType);
-        RecordedThrowable error = assertTimeout(ofSeconds(EXECUTION_TIMEOUT_SECONDS),
-           () -> runTest("http://localhost:" + server.getLocalPort(), clientType, timeouts, false));
-
-        assertEquals(SocketTimeoutException.class.getName(), error.className);
-        assertEquals(ed.readTimeoutMessage, error.message);
-    }
-    
-    @ParameterizedTest
-    @EnumSource(HttpClientLauncher.ClientType.class)
-    public void connectAndReadSuccess(ClientType clientType, MisbehavingServerControl server) throws IOException, InterruptedException {
-        
-        // set a small accept delay for the server so the requests have time to complete
-        server.setHandleDelay(Duration.ofMillis(100));
-        
-        assertTimeout(ofSeconds(EXECUTION_TIMEOUT_SECONDS),
-                () ->runTest("http://localhost:" + server.getLocalPort(), clientType, TestTimeouts.DEFAULT, true));
-    }
-
-    private RecordedThrowable runTest(String urlSpec, ClientType clientType, TestTimeouts timeouts, boolean expectSuccess) throws IOException, InterruptedException {
-
-        Process process = new AgentLauncher(new URL(urlSpec), timeouts, clientType, STDOUT, STDERR).launch();
-        boolean done = process.waitFor(timeouts.executionTimeout.toMillis(), TimeUnit.MILLISECONDS);
-        
-        LOG.info("Dump of stdout: ");
-        Files
-            .lines(STDOUT)
-            .forEach(LOG::info);
-
-        LOG.info("Dump of stderr: ");
-        Files
-            .lines(STDERR)
-            .forEach(LOG::info);
-
-        if ( !done ) {
-            process.destroy();
-            throw new IllegalStateException("Terminated process since it did not complete within " + timeouts.executionTimeout.toMillis() + " milliseconds");
-        }
-        int exitCode = process.exitValue();
-        LOG.info("Exited with code {}", exitCode);
-        
-        if ( expectSuccess ) {
-            if ( exitCode != 0 )
-                throw new RuntimeException("Expected success, but command exited with code " + exitCode);
-            
-            return null;
-        }
-        
-        if ( exitCode == 0 ) {
-            throw new RuntimeException("Command terminated successfully. That is unexpected.");
-        } else {
-            return Files.lines(STDERR)
-                .filter( l -> l.startsWith(EXCEPTION_MARKER))
-                .map( RecordedThrowable::fromLine )
-                .findFirst()
-                .orElseThrow(() -> new RuntimeException("Exit code was not zero ( " + exitCode + " ) but did not find any exception information in stderr.txt"));
-        }
-    }
-}
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentLauncher.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentLauncher.java
deleted file mode 100644
index 93a006b..0000000
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentLauncher.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.ProcessBuilder.Redirect;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.sling.uca.impl.HttpClientLauncher.ClientType;
-
-/**
- * Launches the {@link HttpClientLauncher} as a separate process with the timeout agent enabled
- *
- */
-class AgentLauncher {
-    private final URL url;
-    private final TestTimeouts timeouts;
-    private final ClientType clientType;
-    private Path stdout;
-    private Path stderr;
-
-    public AgentLauncher(URL url, TestTimeouts timeouts, ClientType clientType, Path stdout, Path stderr) {
-        this.url = url;
-        this.timeouts = timeouts;
-        this.clientType = clientType;
-        this.stdout = stdout;
-        this.stderr = stderr;
-    }
-    
-    public Process launch() throws IOException {
-        
-        Path jar = Files.list(Paths.get("target"))
-            .filter( p -> p.getFileName().toString().endsWith("-jar-with-dependencies.jar"))
-            .findFirst()
-            .orElseThrow( () -> new IllegalStateException("Did not find the agent jar. Did you run mvn package first?"));
-        
-        String classPath = buildClassPath();
-
-        String javaHome = System.getProperty("java.home");
-        Path javaExe = Paths.get(javaHome, "bin", "java");
-        ProcessBuilder pb = new ProcessBuilder(
-            javaExe.toString(),
-            "-showversion",
-            "-javaagent:" + jar +"=" + timeouts.agentConnectTimeout.toMillis() +"," + timeouts.agentReadTimeout.toMillis()+",v",
-            "-cp",
-            classPath,
-            HttpClientLauncher.class.getName(),
-            url.toString(),
-            clientType.toString(),
-            String.valueOf(timeouts.clientConnectTimeout.toMillis()),
-            String.valueOf(timeouts.clientReadTimeout.toMillis())
-        );
-        
-        pb.redirectInput(Redirect.INHERIT);
-        pb.redirectOutput(stdout.toFile());
-        pb.redirectError(stderr.toFile());
-        
-        return pb.start();
-    }
-    
-    private String buildClassPath() throws IOException {
-        
-        List<String> elements = new ArrayList<>();
-        elements.add(Paths.get("target", "test-classes").toString());
-        
-        Set<String> dependencies = new HashSet<>(Arrays.asList(new String[] {
-            "commons-httpclient.jar",
-            "commons-codec.jar",
-            "slf4j-simple.jar",
-            "slf4j-api.jar",
-            "jcl-over-slf4j.jar",
-            "httpclient.jar",
-            "httpcore.jar",
-            "okhttp.jar",
-            "okio.jar"
-        }));
-        
-        Files.list(Paths.get("target", "it-dependencies"))
-            .filter( p -> dependencies.contains(p.getFileName().toString()) )
-            .forEach( p -> elements.add(p.toString()));
-        
-        return String.join(File.pathSeparator, elements);
-    }
-}
\ No newline at end of file
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/ErrorDescriptor.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/ErrorDescriptor.java
deleted file mode 100644
index 840ea05..0000000
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/ErrorDescriptor.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.io.IOException;
-
-import org.apache.sling.uca.impl.HttpClientLauncher.ClientType;
-
-/**
- * Data class for defining specific error messages related to individual {@link ClientType client types}. 
- */
-class ErrorDescriptor {
-    Class<? extends IOException> connectTimeoutClass;
-    String connectTimeoutMessageRegex;
-    String readTimeoutMessage;
-
-    public ErrorDescriptor(Class<? extends IOException> connectTimeoutClass, String connectTimeoutMessageRegex,
-            String readTimeoutMessage) {
-        this.connectTimeoutClass = connectTimeoutClass;
-        this.connectTimeoutMessageRegex = connectTimeoutMessageRegex;
-        this.readTimeoutMessage = readTimeoutMessage;
-    }
-}
\ No newline at end of file
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/HttpClientLauncher.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/HttpClientLauncher.java
deleted file mode 100644
index d2408de..0000000
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/HttpClientLauncher.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.time.Duration;
-import java.util.EnumSet;
-import java.util.stream.Collectors;
-
-import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.params.HttpClientParams;
-import org.apache.commons.httpclient.params.HttpConnectionParams;
-import org.apache.commons.httpclient.params.HttpMethodParams;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.config.RequestConfig.Builder;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
-
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
-
-/**
- * CLI interface to run HTTP clients
- */
-public class HttpClientLauncher {
-    
-    public enum ClientType {
-        JavaNet(HttpClientLauncher::runUsingJavaNet), 
-        HC3(HttpClientLauncher::runUsingHttpClient3),
-        HC4(HttpClientLauncher::runUsingHttpClient4),
-        OkHttp(HttpClientLauncher::runUsingOkHttp);
-        
-        private final HttpConsumer consumer;
-
-        ClientType(HttpConsumer consumer) {
-            this.consumer = consumer;
-        }
-        
-        public HttpConsumer getConsumer() {
-            return consumer;
-        }
-        
-        static String pipeSeparatedString() {
-            return EnumSet.allOf(ClientType.class).stream()
-                .map(ClientType::toString)
-                .collect(Collectors.joining("|"));
-        }
-        
-        static ClientType fromString(String value) {
-            return EnumSet.allOf(ClientType.class).stream()
-                .filter( e -> e.toString().equals(value) )
-                .findFirst()
-                .orElse(null);
-        }
-    }
-    
-    /**
-     * Thin wrapper for various http client abstractions
-     *
-     */
-    @FunctionalInterface
-    interface HttpConsumer {
-        void accept(String http, int connectTimeoutSeconds, int readTimeoutSeconds) throws Exception;
-    }
-
-    public static void main(String[] args) throws Exception {
-        
-        if ( args.length < 2 )
-            throw new IllegalArgumentException(usage());
-        
-        ClientType type = ClientType.fromString(args[1]);
-        if ( type == null )
-            throw new IllegalArgumentException(usage());
-        
-        log("Executing request via " + type);
-        
-        int connectTimeout = args.length > 2 ? Integer.parseInt(args[2]) : 0;
-        int readTimeout = args.length > 3 ? Integer.parseInt(args[3]) : 0;
-        
-        log("Client API configured timeouts: " + connectTimeout + "/" + readTimeout);
-        
-        type.consumer.accept(args[0], connectTimeout, readTimeout);
-    }
-
-    private static String usage() {
-        return "Usage: java -cp ... " + HttpClientLauncher.class.getName() + " <URL> " + ClientType.pipeSeparatedString();
-    }
-    
-    private static void log(String msg, Object... args) {
-        System.out.format("[LAUNCHER] " + msg + "%n", args);
-    }
-
-    private static void runUsingJavaNet(String targetUrl, int connectTimeoutMillis, int readTimeoutMillis) throws IOException  {
-        HttpURLConnection con = (HttpURLConnection) new URL(targetUrl).openConnection();
-        log("Connection type is %s", con);
-        
-        con.setConnectTimeout(connectTimeoutMillis);
-        con.setReadTimeout(readTimeoutMillis);
-        
-        try (InputStream in = con.getInputStream();
-                InputStreamReader isr = new InputStreamReader(in);
-                BufferedReader br = new BufferedReader(isr)) {
-            
-            log(con.getResponseCode() + " " + con.getResponseMessage());
-
-            con.getHeaderFields().forEach( (k, v) -> {
-                log(k + " : " + v);
-            });
-        }
-    }
-
-
-    private static void runUsingHttpClient3(String targetUrl, int connectTimeoutMillis, int readTimeoutMillis) throws IOException {
-        HttpClient client = new HttpClient();
-        // disable retries, to make sure that we get equivalent behaviour with other implementations
-        client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(0, false));
-        
-        if ( connectTimeoutMillis != 0 )
-            client.getParams().setParameter(HttpConnectionParams.CONNECTION_TIMEOUT, Integer.valueOf(connectTimeoutMillis));
-        if ( readTimeoutMillis != 0 )
-            client.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, Integer.valueOf(readTimeoutMillis));
-        
-        HttpMethod get = new GetMethod(targetUrl);
-        log("Connection timeouts: connect: %d, so: %s", 
-                client.getHttpConnectionManager().getParams().getConnectionTimeout(),
-                client.getHttpConnectionManager().getParams().getSoTimeout());
-        log("Client so timeout: %d (raw: %s)", client.getParams().getSoTimeout(), 
-                client.getParams().getParameter(HttpClientParams.SO_TIMEOUT));
-        client.executeMethod(get);
-        
-        log(get.getStatusLine().toString());
-        
-        for ( Header header : get.getResponseHeaders() )
-            log(header.toExternalForm());
-    }
-    
-    private static void runUsingHttpClient4(String targetUrl, int connectTimeoutMillis, int readTimeoutMillis) throws IOException {
-        // disable retries, to make sure that we get equivalent behaviour with other implementations
-        
-        Builder config = RequestConfig.custom();
-        if ( connectTimeoutMillis != 0 )
-            config.setConnectTimeout(connectTimeoutMillis);
-        if ( readTimeoutMillis != 0 )
-            config.setSocketTimeout(readTimeoutMillis);
-        
-        try ( CloseableHttpClient client = HttpClients.custom()
-                .setDefaultRequestConfig(config.build())
-                .disableAutomaticRetries().build() ) {
-            
-            HttpGet get = new HttpGet(targetUrl);
-            try ( CloseableHttpResponse response = client.execute(get)) {
-                log(response.getStatusLine().toString());
-                for ( org.apache.http.Header header : response.getAllHeaders() )
-                    log(header.toString());
-                
-                EntityUtils.consume(response.getEntity());
-            }
-        }
-    }
-
-    private static void runUsingOkHttp(String targetUrl, int connectTimeoutSeconds, int readTimeoutSeconds) throws IOException {
-        OkHttpClient.Builder clientBuilder = new OkHttpClient().newBuilder();
-        if ( connectTimeoutSeconds != 0 )
-            clientBuilder.connectTimeout(Duration.ofMillis(connectTimeoutSeconds));
-        if ( readTimeoutSeconds != 0 )
-            clientBuilder.readTimeout(Duration.ofMillis(readTimeoutSeconds));
-        
-        OkHttpClient client = clientBuilder.build();
-        
-        Request request = new Request.Builder()
-            .url(targetUrl)
-            .build();
-
-        try (Response response = client.newCall(request).execute()) {
-            log("%s %s", response.code(), response.message());
-            response.headers().toMultimap().forEach( (n, v) -> {
-                log("%s : %s", n, v);
-            });
-        }
-    }
-}
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerControl.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerControl.java
deleted file mode 100644
index 0161006..0000000
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerControl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.time.Duration;
-
-/**
- * Allows control of a local server
- *
- */
-public interface MisbehavingServerControl {
-
-    /**
-     * Returns the port on which the local server is bound
-     * 
-     * @return the port
-     */
-    int getLocalPort();
-
-    /**
-     * Sets a new value for the handleDelay parameter
-     * 
-     * <p>This value reflects how long the HTTP handler will wait before handling the client request.</p>
-     * 
-     * <p>The value only takes effect for the current test method invocation and will be reset
-     * for the next one.</p>
-     * 
-     * @param handleDelay the new duration
-     */
-    void setHandleDelay(Duration handleDelay);
-}
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerExtension.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerExtension.java
deleted file mode 100644
index f5bfe1f..0000000
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerExtension.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.io.IOException;
-import java.time.Duration;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-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.junit.jupiter.api.extension.AfterEachCallback;
-import org.junit.jupiter.api.extension.BeforeEachCallback;
-import org.junit.jupiter.api.extension.ExtensionContext;
-import org.junit.jupiter.api.extension.ParameterContext;
-import org.junit.jupiter.api.extension.ParameterResolutionException;
-import org.junit.jupiter.api.extension.ParameterResolver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Provides an Jetty-based local server that can be configured to timeout
- * 
- * <p>After extending a JUnit Jupiter test with this extension, any parameter of type {@link MisbehavingServerControl}
- * will be resolved.</p>
- *
- */
-class MisbehavingServerExtension implements BeforeEachCallback, AfterEachCallback, ParameterResolver, MisbehavingServerControl {
-    
-    private static final Duration DEFAULT_HANDLE_DELAY = Duration.ofSeconds(10);
-    
-    private final Logger logger = LoggerFactory.getLogger(getClass());
-    
-    public int getLocalPort() {
-        return ((ServerConnector) server.getConnectors()[0]).getLocalPort();
-    }
-    
-    private Server server;
-    
-    private Duration handleDelay = DEFAULT_HANDLE_DELAY;
-    
-    @Override
-    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
-            throws ParameterResolutionException {
-        return parameterContext.getParameter().getType() == MisbehavingServerControl.class;
-    }
-    
-    @Override
-    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
-            throws ParameterResolutionException {
-        if ( parameterContext.getParameter().getType() == MisbehavingServerControl.class )
-            return this;
-        
-        throw new ParameterResolutionException("Unable to get a " + MisbehavingServerControl.class.getSimpleName() + " instance for " + parameterContext);
-    }
-    
-    @Override
-    public void beforeEach(ExtensionContext context) throws Exception {
-        
-        // reset the delay before each execution to make test logic simpler 
-        handleDelay = DEFAULT_HANDLE_DELAY;
-        
-        server = new Server(0);
-        server.setHandler(new AbstractHandler() {
-            
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
-                    throws IOException, ServletException {
-                logger.info("Waiting for " + handleDelay + " before handling");
-                try {
-                    Thread.sleep(handleDelay.toMillis());
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                    return;
-                }
-
-                response.setStatus(HttpServletResponse.SC_NO_CONTENT);
-                if ( baseRequest.getHeader("User-Agent") != null )
-                    response.addHeader("Original-User-Agent", baseRequest.getHeader("User-Agent"));
-                baseRequest.setHandled(true);
-                logger.info("Handled");
-            }
-        });
-        
-        server.start();
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) throws Exception {
-        if ( server == null )
-            return;
-        try {
-            server.stop();
-        } catch (Exception e) {
-            logger.info("Failed shutting down server", e);
-        }
-    }
-    
-    @Override
-    public void setHandleDelay(Duration handleDelay) {
-        this.handleDelay = handleDelay;
-    }
-}
\ No newline at end of file
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/RecordedThrowable.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/RecordedThrowable.java
deleted file mode 100644
index 63ba806..0000000
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/RecordedThrowable.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-/**
- * Basic information about a {@link Throwable} that was recorded in a file
- */
-class RecordedThrowable {
-    
-    static RecordedThrowable fromLine(String line) {
-        line = line.replace(AgentIT.EXCEPTION_MARKER, "");
-
-        String className = line.substring(0, line.indexOf(':'));
-        String message = line.substring(line.indexOf(':') + 2); // ignore ':' and leading ' '
-
-        return new RecordedThrowable(className, message);
-    }
-    
-    String className;
-    String message;
-
-    public RecordedThrowable(String className, String message) {
-        this.className = className;
-        this.message = message;
-    }
-}
\ No newline at end of file
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/TestTimeouts.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/TestTimeouts.java
deleted file mode 100644
index 0d5cb36..0000000
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/TestTimeouts.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.sling.uca.impl;
-
-import java.time.Duration;
-import java.util.Objects;
-
-/**
- * Data class for holding information about various timeouts set in the tests
- */
-class TestTimeouts {
-
-    Duration executionTimeout = Duration.ofSeconds(AgentIT.EXECUTION_TIMEOUT_SECONDS);
-    Duration agentConnectTimeout = Duration.ofSeconds(AgentIT.CONNECT_TIMEOUT_SECONDS);
-    Duration agentReadTimeout = Duration.ofSeconds(AgentIT.READ_TIMEOUT_SECONDS);
-    Duration clientConnectTimeout = Duration.ZERO;
-    Duration clientReadTimeout = Duration.ZERO;
-    
-    public static TestTimeouts DEFAULT = new TestTimeouts();
-    
-    static class Builder {
-        private TestTimeouts timeouts = new TestTimeouts();
-        
-        public TestTimeouts.Builder executionTimeout(Duration duration) {
-            timeouts.executionTimeout = Objects.requireNonNull(duration);
-            return this;
-        }
-
-        public TestTimeouts.Builder agentTimeouts(Duration connectTimeout, Duration readTimeout) {
-            timeouts.agentConnectTimeout = Objects.requireNonNull(connectTimeout);
-            timeouts.agentReadTimeout = Objects.requireNonNull(readTimeout);
-            return this;
-        }
-        
-        public TestTimeouts.Builder clientTimeouts(Duration connectTimeout, Duration readTimeout) {
-            timeouts.clientConnectTimeout = Objects.requireNonNull(connectTimeout);
-            timeouts.clientReadTimeout = Objects.requireNonNull(readTimeout);
-            return this;
-        }
-        
-        public TestTimeouts build() {
-            return timeouts;
-        }
-    }
-    
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + ": execution " + executionTimeout + ", agent: " + agentConnectTimeout + "/" + agentReadTimeout + ", client : " + clientConnectTimeout + "/" + clientReadTimeout;
-    }
-}
\ No newline at end of file
diff --git a/url-connection-agent/src/test/resources/simplelogger.properties b/url-connection-agent/src/test/resources/simplelogger.properties
deleted file mode 100644
index 0297949..0000000
--- a/url-connection-agent/src/test/resources/simplelogger.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-#  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.
-#
-
-org.slf4j.simpleLogger.showDateTime=true
\ No newline at end of file