http - jdk.incubator.httpclient URI 查询字符串在包含编码的保留字符时被截断

标签 http character-encoding uri java-9

new URI(string) 解析的 URI 字符串示例,在查询字符串中包含编码的保留字符“#”(%23):

http://localhost:34455/ldp-test-43272e5c-1e3f-4bb8-8541-fa5ea6d6567a?predicate=http%3A%2F%2Fwww.w3.org%2Fns%2Foa%23hasBody

然后将 URI 对象简单地传递给 HttpRequest.newBuilder(uri)

这是日志,第一个条目显示服务器处理的请求字符串被截断,但响应和请求 URI 显示完整的字符串:

127.0.0.1 - - [22/Feb/2018:10:30:51 +0000] "GET /ldp-test-43272e5c-
1e3f-4bb8-8541-fa5ea6d6567a?predicate=http://www.w3.org/ns/oa 
HTTP/1.1" 200 3 "-" "-" 64

INFO  [2018-02-22 10:30:51,137] cool.pandora.ldpclient.LdpClientImpl: 
request URI is http://localhost:34455/ldp-test-43272e5c-1e3f-4bb8-
8541-fa5ea6d6567a?
predicate=http%3A%2F%2Fwww.w3.org%2Fns%2Foa%23hasBody

INFO  [2018-02-22 10:30:51,141] cool.pandora.ldpclient.LdpClientImpl: 
response URI is http://localhost:34455/ldp-test-43272e5c-1e3f-4bb8-
8541-fa5ea6d6567a?
predicate=http%3A%2F%2Fwww.w3.org%2Fns%2Foa%23hasBody

INFO  [2018-02-22 10:30:51,141] cool.pandora.ldpclient.LdpClientImpl: 
http version is HTTP_1_1

INFO  [2018-02-22 10:30:51,141] cool.pandora.ldpclient.LdpClientImpl: 
status code is 200

INFO  [2018-02-22 10:30:51,141] cool.pandora.ldpclient.LdpClientImpl: 
final request URI is http://localhost:34455/ldp-test-43272e5c-1e3f-
4bb8-8541-fa5ea6d6567a?
predicate=http%3A%2F%2Fwww.w3.org%2Fns%2Foa%23hasBody

INFO  [2018-02-22 10:30:51,141] cool.pandora.ldpclient.LdpClientImpl: 
Content Length is[3]

这似乎是 jdk.incubator.http 中的错误而不是在 URI 中。

我不清楚在 Exchange 中是否发生了额外的 URI 字符串构建或构造,但如果查询字符串在某处被解码而没有重新编码,这将是我的第一个猜测。

也许有人可以独立验证这一点?

此外,我认为这不是服务器实现,因为使用 curl 的相同请求 URI(在非测试实例上)有效。

172.18.0.1 - - [22/Feb/2018:09:22:31 +0000] "GET /test10?
predicate=http%3A%2F%2Fwww.w3.org%2Fns%2Foa%23hasBody HTTP/1.1" 200 
795 "-" "curl/7.55.1" 35

最佳答案

感谢您报告此问题。这确实是 JDK HTTP Client 代码中的一个错误。已归档以下 JIRA 以对其进行跟踪: https://bugs.openjdk.java.net/browse/JDK-8198716

关于http - jdk.incubator.httpclient URI 查询字符串在包含编码的保留字符时被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48925823/

相关文章:

Java HEAD/GET 请求与 Linux 请求

java - Tomcat文本文件编码

python - 如何处理编码不清楚的字符串

Ansible:如何在 uri 模块中注册变量?

java - 在 Java 中验证直径 URI 的方法?

PHP如何响应HTTP请求并继续处理?

Git 智能 HTTP 协议(protocol)无法在推送时执行服务器端 Hook

angular - HTTP 拦截器使用 Angular 2、4、6、7、8、9 TypeScript 在请求失败时获取状态 0

java - 处理 unicode �,如何摆脱?安卓/java

java - android.net.Uri 权限或路径不明确