当我需要以流方式处理响应时,我应该如何处理使用 Java 11 中包含的 HTTP 客户端挂起发送 HTTP 响应正文的服务器?
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(2))
.build();
HttpRequest httpRequest = HttpRequest.newBuilder(URI.create("http://example.com"))
.timeout(Duration.ofSeconds(5))
.build();
HttpResponse<Stream<String>> httpResponse = httpClient
.send(httpRequest, HttpResponse.BodyHandlers.ofLines());
Stream<String> responseLineStream = httpResponse.body();
responseLineStream.count();
Run Code Online (Sandbox Code Playgroud)
在上面的代码中:
BodyHandler,当收到状态行和报头时,就认为收到了响应。这意味着当代码执行时,在 7 秒内要么抛出异常,要么到达最后一行。但是,最后一行不受任何超时的限制。如果服务器停止发送响应正文,最后一行将永远阻塞。
在这种情况下,如何防止最后一行挂起?
RFC 3986指定URI 的主机组件是"不区分大小写".但是,它没有指定"不区分大小写"在UCS或UTF-8字符方面的含义.
RFC中给出的示例(例如" <HTTP://www.EXAMPLE.com/>等于<http://www.example.com/>")允许我们推断"不区分大小写"意味着至少表示字符AZ被认为等同于UTF-8字符集中它们之前的字符32,即AZ.但是,没有提到应如何处理该范围之外的字符.因此,鉴于非编码,非标准化的注册名称www.OLÉ.com,我看到RFC允许的三种可能的标准化形式:
所以问题是:哪个是正确的?如果是情况1.,什么定义哪些字符被认为是大写,哪些字符被认为是小写(哪些字符没有大小写)?