Skip to content

Commit

Permalink
inject path parsing filter (5.3. muzzles)
Browse files Browse the repository at this point in the history
  • Loading branch information
amarziali committed Feb 1, 2023
1 parent 6a95a76 commit a7aa4ff
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 0 deletions.
@@ -0,0 +1,64 @@
package datadog.trace.instrumentation.springweb6;

import static datadog.trace.agent.tooling.bytebuddy.matcher.ClassLoaderMatchers.hasClassNamed;
import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.extendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.implementsInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;

import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;

/**
* This instrumentation adds the ServletPathRequestFilter definition to the spring context When the
* context is created, the filter will be added to the beginning of the filter chain
*/
@AutoService(Instrumenter.class)
public class ServletPathRequestFilterInstrumentation extends Instrumenter.Tracing
implements Instrumenter.ForTypeHierarchy {
public ServletPathRequestFilterInstrumentation() {
super("spring-web", "spring-path-filter");
}

@Override
public ElementMatcher<ClassLoader> classLoaderMatcher() {
return hasClassNamed("org.springframework.web.filter.ServletRequestPathFilter")
.and(hasClassNamed("javax.servlet.Filter"));
}

@Override
public String hierarchyMarkerType() {
return "org.springframework.web.context.WebApplicationContext";
}

@Override
public ElementMatcher<TypeDescription> hierarchyMatcher() {
return extendsClass(named("org.springframework.context.support.AbstractApplicationContext"))
.and(implementsInterface(named(hierarchyMarkerType())));
}

@Override
public String[] helperClassNames() {
return new String[] {
packageName + ".BeanDefinitionRepairer",
packageName + ".OrderedServletPathRequestFilter",
packageName + ".OrderedServletPathRequestFilter$BeanDefinition",
};
}

@Override
public void adviceTransformations(AdviceTransformation transformation) {
transformation.applyAdvice(
isMethod()
.and(named("postProcessBeanFactory"))
.and(
takesArgument(
0,
named(
"org.springframework.beans.factory.config.ConfigurableListableBeanFactory"))),
packageName + ".ServletPathFilterInjectingAdvice");
}
}
@@ -0,0 +1,30 @@
package datadog.trace.instrumentation.springweb;

import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
import org.springframework.core.Ordered;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.filter.ServletRequestPathFilter;

public class OrderedServletPathRequestFilter extends DelegatingFilterProxy implements Ordered {

@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}

public OrderedServletPathRequestFilter() {
super(new ServletRequestPathFilter());
}

public static class BeanDefinition extends AnnotatedGenericBeanDefinition {
private static final long serialVersionUID = -5117836999188187797L;

public BeanDefinition() {
super(OrderedServletPathRequestFilter.class);
BeanDefinitionRepairer.register(OrderedServletPathRequestFilter.class);
setBeanClassName(OrderedServletPathRequestFilter.class.getName());
setScope(SCOPE_SINGLETON);
setLazyInit(true);
}
}
}
@@ -0,0 +1 @@

0 comments on commit a7aa4ff

Please sign in to comment.