Java 协议冲突:块大小中出现意外的单个换行符

Java 协议冲突:块大小中出现意外的单个换行符,java,jersey,httpclient,Java,Jersey,Httpclient,第三方服务使用HttpClient(3.1)获取我通过Jersey(在tomcat上)提供的url。这是在把错误抛到主题上 以下是我为URL提供服务的方式: @Path("somepath") @GET @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response download(@Context UriInfo uriInfo) { try { URL url = // find the actual U

第三方服务使用HttpClient(3.1)获取我通过Jersey(在tomcat上)提供的url。这是在把错误抛到主题上

以下是我为URL提供服务的方式:

@Path("somepath")
@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response download(@Context UriInfo uriInfo)  {
    try {
        URL url = // find the actual URL (a file)
        InputStream stream = url.openStream();
        return Response.ok(stream).build();
    } catch (IOException e) {
        return Responses.notFound().build();
    }
}

有办法解决这个问题吗?

我最后做了这样的事情:

if (url.getScheme().equalsIgnoreCase("file")) {
  File file = new File(url.toURI());
  return Response.ok(file).header("Content-Length", file.length()).build();
} else {
  return Response.seeOther(url);
}
这适用于我的用例

一些注意事项:

  • 如果文件的大小很小(大约2G左右),只返回file对象就可以了,但是对于较大的文件就失败了。我假设由于整数溢出,以某种方式分块的长度编码会中断
  • 尝试返回StreamingOutput(在另一个问题中建议)也不适用于大文件
确保Jersey使用CRLF(
\r\n
)来终止线路,而不是裸线路馈送。您知道怎么做吗?(顺便说一句,我认为这是一个Tomcat问题)。