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
相关产品推荐
相关产品推荐

