【问题标题】:How to set HTTP header with javaagent如何使用 javaagent 设置 HTTP 标头
【发布时间】:2021-06-29 01:42:49
【问题描述】:

我正在使用一个 Java 库,它在内部使用 Apache HttpClient 4.3 来发送 https 请求。第 3 方服务器需要 'Content-Type' 标头,不幸的是,该标头没有由 lib 设置。

由于无法更改库,我想使用 javaagents 来添加标头。

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

【问题讨论】:

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


    【解决方案1】:

    我想出的解决方案:使用 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");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 2018-12-17
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多