如何使用 javaagent 设置 HTTP header
How to set HTTP header with javaagent
我正在使用 Java 库,它在内部使用 Apache HttpClient 4.3 发送 https 请求。第三方服务器需要 'Content-Type' header 不幸的是,lib 没有设置。
由于无法更改库,我想使用 javaagents 添加 header。
我找到了这个有用的教程,它让我相信可以实现这一目标:https://httptoolkit.tech/blog/how-to-intercept-debug-java-http/
但是我不知道要操作 HttpClient 4.3 的哪个接口来设置 header。有人知道它是如何工作的吗?
我想到的解决方案:使用bytebuddy拦截3rd方库使用的ApacheInternalHttpClient的'doExecute'方法。所以我能够添加所需的 content-type header.
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");
}
}
}
我正在使用 Java 库,它在内部使用 Apache HttpClient 4.3 发送 https 请求。第三方服务器需要 'Content-Type' header 不幸的是,lib 没有设置。
由于无法更改库,我想使用 javaagents 添加 header。
我找到了这个有用的教程,它让我相信可以实现这一目标:https://httptoolkit.tech/blog/how-to-intercept-debug-java-http/ 但是我不知道要操作 HttpClient 4.3 的哪个接口来设置 header。有人知道它是如何工作的吗?
我想到的解决方案:使用bytebuddy拦截3rd方库使用的ApacheInternalHttpClient的'doExecute'方法。所以我能够添加所需的 content-type header.
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");
}
}
}