【发布时间】:2018-08-10 16:29:29
【问题描述】:
上下文:尝试通过 Java 的 HttpsURLConnection 类从 Jenkins CI 服务器获取碎屑时收到 400 错误。我编写的 Python 实用程序可以毫无问题地成功调用,wget 也是如此。这是Java代码:
String crumb_url = JENKINS_URL + "crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)";
String userpass = config.getProperty("USERNAME") + ":" + config.getProperty("API_TOKEN");
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());
URL url = new URL(crumb_url);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(sslFactory);
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", basicAuth);
conn.setRequestProperty("User-Agent", "XXXXXXXXXX/1.0");
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
创建 BufferedReader 的调用是我收到 IOException 的地方,表明我从服务器获得了 400。由于我得到的是 400 而不是与证书相关的异常,因此我很确定 SSL 工作正常。我打开调试信息以查看发送的确切内容,这就是它告诉我的内容:
很抱歉编辑了一些信息,但它不应该是相关的。我主要关心的是请求开头突出显示的 16 个字节,额外的数据可能是 Jenkins 服务器不满意的原因。否则,请求看起来与 wget 发送的内容几乎相同,除了 wget 中的“Keep-Alive”与 Java 中的“keep-alive”。如果大小写差异是问题,我还尝试手动生成请求,但我仍然在 GET 之前获得 16 字节前缀。我对请求后的尾随数据也有些好奇,但我怀疑只要最后有两个 CR/LF 就没有关系了。
如果有人对如何解决此问题有任何想法,我会全力以赴。谢谢。
【问题讨论】:
-
尝试使用 wget 或 Python 打开调试信息以查看它们发送的标头。
-
谢谢 - 我已经让 wget 转储请求的标头/正文数据。我会使用 Wireshark,但无法访问直接解码数据包的密钥。
标签: java jenkins httpsurlconnection