BodyCodec 和 pipe 方法转发状态码

BodyCodec and pipe method forward status code

我想询问有关使用主体编解码器和管道方法进行流式处理的错误处理。

我正在让网关和存储服务通过 HTTP 进行通信。

用户可以向 GateWay 发送 GET 请求,GateWay 将请求转发给存储服务,存储服务用所需的文件进行响应。

问题是找不到文件。在这种情况下,用户会收到状态为 200 的响应和状态消息 OK。

网关服务似乎从未收到状态为 404 的响应(或至少在响应已发送之前未收到),但 HttpServerRequest 响应以状态 200 结束。

GateWay 服务是否可以将存储服务响应中的状态代码转发给用户????

谢谢

网关服务:

httpClientRequest.as(BodyCodec.pipe(request.response().setChunked(true))).rxSend()
    .subscribe(
        response -> {
            if (response.statusCode() != OK_STATUS) {
                routingContext.response().setStatusCode(response.statusCode()).end();
            }
        },
        error -> LOG.error("KO")
    );

存储服务:

var options = new OpenOptions().setRead(true).setCreate(false).setWrite(false);

request.pause();

fileSystem
    .rxOpen("pathToFile", options)
    .flatMapCompletable(asyncFile -> asyncFile.rxPipeTo(request.response()))
    .subscribe(
        () -> LOG.info("OK"),
        error -> {
              request.resume();
              routingContext.response()
                            .setStatusCode(404)
                            .setStatusMessage("File not found")
                            .end();
       }
    );

Communication schema

WebClientrxSend 返回的 Single 完成之前将响应字节推送到正文编解码器。这是设计使然,因为 WebClient 仅通过在将内容移交给用户之前缓冲内容来运行。

对于您的用例,最好使用原始 HttpClient

request.response().setChunked(true);
HttpClientRequest httpClientRequest = httpClient.get(port, host, requestURI);

httpClientRequest
  .handler(httpClientResponse -> {
    if (httpClientResponse.statusCode() != OK_STATUS) {
      routingContext.response().setStatusCode(httpClientResponse.statusCode()).end();
    } else {
      httpClientResponse.pipeTo(request.response(), ar -> {
        if (ar.failed()) {
          LOG.error("KO");
        }
      });
    }
  }).exceptionHandler(t -> handleConnectionFailure(t)).end();