小编Mar*_*ter的帖子

如何使用 Java 的 HttpClient 在慢速流响应主体上超时

当我需要以流方式处理响应时,我应该如何处理使用 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)

在上面的代码中:

  • 如果在 2 秒内无法建立连接,则会抛出超时异常。
  • 如果在 5 秒内没有收到响应,则会抛出超时异常。通过实验,定时器在连接建立后启动,对于这种类型BodyHandler,当收到状态行和报头时,就认为收到了响应。

这意味着当代码执行时,在 7 秒内要么抛出异常,要么到达最后一行。但是,最后一行不受任何超时的限制。如果服务器停止发送响应正文,最后一行将永远阻塞。

在这种情况下,如何防止最后一行挂起?

java http java-http-client java-11

8
推荐指数
2
解决办法
265
查看次数

对于非英语字符,RFC 3986中"不区分大小写"的含义是什么?

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. 小写到www.olé.com然后百分比编码到www.ol%E9.com
  2. 小写只有AZ字符到www.olÉ.com然后百分比编码到www.ol%C9.com
  3. 百分比编码到www.OL%C9.com,然后将非百分比编码的部分小写到www.ol%C9.com,产生与2相同的结果.

所以问题是:哪个是正确的?如果是情况1.,什么定义哪些字符被认为是大写,哪些字符被认为是小写(哪些字符没有大小写)?

uri utf-8 ucs rfc3986

5
推荐指数
1
解决办法
754
查看次数

标签 统计

http ×1

java ×1

java-11 ×1

java-http-client ×1

rfc3986 ×1

ucs ×1

uri ×1

utf-8 ×1