You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jgit通过Jetty嵌入式代理时CONNECT请求丢失授权头问题求助

问题背景

我们的应用使用JGit库提供Git功能,执行克隆HTTPS仓库等操作时,请求需通过自研的Jetty嵌入式反向代理服务器。

当前技术栈

  • JDK 1.8
  • JGit 5.13.1.202206130422-r
  • Jetty 9.4.46.v20220331

客户端代理配置代码

克隆请求前,我们通过以下方式设置代理信息:

// 自定义连接工厂用于设置代理
CustomJdkHttpConnectionFactory connFactory = new CustomJdkHttpConnectionFactory();

command.setTransportConfigCallback(transport -> {
   if (transport instanceof TransportHttp) {
      
      TransportHttp transportHttp = (TransportHttp) transport;
      Map<String, String> headers = new HashMap<>();
      
      String authHeader = new String(Base64.getEncoder().encode(new String("admin" + ":" + "admin").getBytes()));
      headers.put("Authorization", "Basic " + authHeader);
      headers.put("Proxy-Authorization", "Basic " + authHeader);
      transportHttp.setAdditionalHeaders(headers);
      transportHttp.setHttpConnectionFactory(connFactory);
     
   }
});

Jetty代理服务器代码

我们的Jetty嵌入式代理服务器启动代码如下:

public void startHTTPProxyServer() throws Exception {
    server = new Server();

    ServerConnector connector = new ServerConnector(server);
    String hostName = InetAddress.getLocalHost().getCanonicalHostName();
    connector.setHost(hostName);
    connector.setPort(PORT);

    server.setConnectors(new Connector[] { connector });
    // 自定义连接处理器,用于检查请求头并执行授权验证
    ConnectHandler proxy = new CustomConnectHandler();
    server.setHandler(proxy);

    server.start();
}

自定义ConnectHandler目前仅枚举请求头,待确认正确头信息后添加验证逻辑:

public class CustomConnectHandler extends ConnectHandler {

    protected boolean handleAuthentication(HttpServletRequest request, HttpServletResponse response, String address) {
        logger.info("Request received: " + request.getMethod() + " " + request.getRequestURI());
        Enumeration<String> requestHeaderNames = request.getHeaderNames();
        while (requestHeaderNames.hasMoreElements()) {
            String headerName = requestHeaderNames.nextElement();
            String headerValue = request.getHeader(headerName);
            logger.info("Request Header : " + headerName + " = " + headerValue);
        }
        return false;
    }
}

遇到的问题

设置的Authorization和Proxy-Authorization头未传递到代理服务器。连接HTTPS仓库时客户端发送CONNECT请求,额外头信息被丢弃,导致无法对请求进行授权验证。

已尝试的方案(1月18日)

根据@Joakim的建议添加了Authenticator.setDefault(authenticator);,但验证器仅在请求目标仓库地址时被调用,而非初始向代理发送CONNECT请求的阶段。


内容的提问来源于stack exchange,提问作者Joyjit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:15:36