如何使用 javaagent 设置 HTTP 标头

时间:2021-04-02 05:51:37

标签: java apache-httpclient-4.x content-type javaagents

我使用的是内部使用 Apache HttpClient 4.3 发送 https 请求的 Java 库。 3rd 方服务器需要“Content-Type”标头,不幸的是,lib 未设置该标头。

由于不能更改 lib,我想使用 javaagents 添加标头。

我发现这个有用的教程让我相信有可能实现这一目标:https://httptoolkit.tech/blog/how-to-intercept-debug-java-http/ 但是我无法弄清楚要操作 HttpClient 4.3 的哪个接口来设置标头。有人知道它是如何工作的吗?

1 个答案:

答案 0 :(得分:0)

我想出的解决方案:使用 bytebuddy 拦截第三方库使用的 Apache InternalHttpClient 的“doExecute”方法。所以我能够添加所需的内容类型标题。

public class AgentMain {

    public static void premain(String agentArgs, Instrumentation inst) {
        new AgentBuilder.Default()
                .type(named("org.apache.http.impl.client.InternalHttpClient"))
                .transform((builder, type, classLoader, module) ->
                        builder.method(named("doExecute"))
                                .intercept(Advice.to(HttpClientAdvice.class))
                ).installOn(inst);
    }

    public static void agentmain(String agentArgs, Instrumentation inst) {
        // Not used
    }

    public static class HttpClientAdvice {
        @Advice.OnMethodEnter
        public static void doExecute(@Advice.AllArguments Object[] args) {
            final HttpRequest request = (HttpRequest) args[1];
            request.addHeader("Content-Type", "text/xml");
        }
    }
}