发送零长度HTTPS PUT?

时间:2017-11-09 03:24:44

标签: java https put

我正在使用一个系统,为了进行特定的服务呼叫,需要以下内容:

  • 发出HTTP PUT命令
  • 将网址设置为some_url_here
  • 设置最终用户证书。
  • 确保实体主体为空,并将Content-Length标头设置为0。

这是我编写的用于构建安全连接的方法。我测试了GET;他们工作得很好。我知道问题不在证书中。

public HttpsURLConnection getSecureConnection(final URL url, final String method, final int connectTimeout,
                                              final int readTimeout) throws IOException {
    Validate.notNull(sslContext);
    Validate.notNull(url);
    Validate.notNull(method);
    Validate.isTrue(connectTimeout > 0);
    Validate.isTrue(readTimeout > 0);
    HttpsURLConnection connection;
    try {
        connection = (HttpsURLConnection) url.openConnection();
    } catch (final IOException ioe) {
        LOGGER.error("[CertificateLoader] Unable to open URL connection!", ioe);
        throw new IOException("Unable to open URL connection!", ioe);
    }
    connection.setSSLSocketFactory(sslContext.getSocketFactory());
    connection.setRequestMethod(method);
    connection.setConnectTimeout(connectTimeout);
    connection.setReadTimeout(readTimeout);
    connection.setHostnameVerifier(NoopHostnameVerifier.INSTANCE);
    if (method.equals("PUT")) {
        connection.setRequestProperty("Content-Length", "0");
    }
    if (connection.getContentLength() > 0) {
        Object foo = connection.getContent();
        LOGGER.error("This is what's in here: " + foo.toString());
    }
    return connection;
}

现在,底部那个时髦if的原因是,当我去打PUT时,即使我没有直接打电话,我的日志坚持我&# 39; m得到非零内容长度。所以,我添加了一个小块来试图弄清楚那里有什么,并且看到它报告如下:

This is what's in here: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@70972170

现在,那个傻瓜默认在那里。我没有把它放在那里。我没有创建那个放在那里的对象。我刚刚从URL创建了对象,我从其他地方创建了一个String。我需要的是一种删除 HttpInputStream对象的方法,或者将其设置为null,或以其他方式告诉代码该PUT请求应该有 no 正文,以便我的服务器因为格式错误而拒绝接收我的邮件。建议?

1 个答案:

答案 0 :(得分:2)

  

现在,如果在底部那个时髦的原因是当我去打PUT电话时,即使我没有直接打电话,我的日志也坚持我得到了非零内容长度。

设置零内容长度的方法如下:

connection.setDoOutput(true); // if it's PUT or POST
connection.setRequestMethod(method);
connection.getOutputStream().close(); // send a zero length request body

永远不必致电connection.setRequestProperty("Content-Length", "0")。 Java为您设置它。或者可能省略,在这种情况下,您可以通过

确保它
connection.setFixedLengthStreamingMode(0);
  

所以,我添加了一个小块来试图弄清楚那里有什么,并且看到它报告如下:

This is what's in here: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@70972170
  

现在,那个傻瓜默认在那里。我没有把它放在那里。

Java把它放在那里。

  

我没有创建那个放在那里的对象。

Java把它放在那里。

  

我刚刚从URL创建了对象,我从其他地方创建了一个String。我需要的是一种方法来删除该HttpInputStream对象,或将其设置为null,或以其他方式告诉代码该PUT请求应该没有正文,以便我的服务器不会拒绝我的消息格式化。

不,不是。它是输入流,而不是一段内容。它是响应内容的输入流,而不是请求的内容。在任何情况下,服务器完全有权返回您的内容以响应您的请求。

你的任务是:

  1. 获取响应代码并记录下来。
  2. 如果> = 200且< = 299,请获取连接的输入流。
  3. 否则,请获取连接的错误流。
  4. 无论您使用哪种流,读取直到流结束,并记录下来。
  5. 这将告诉你真实情况。

    我将补充说,没有身体的PUT是一件非常奇怪的事情。你确定你已经理解了这个要求吗? 411表示长度必需