【发布时间】:2023-03-22 09:33:01
【问题描述】:
我正在使用 java(和 scala)开发和测试一个简单的客户端-服务器应用程序。
服务器基于com.sun.net.httpserver.HttpServer,允许通过基本的RESTful 接口使用POST 和PUT 操作上传文件。上传操作使用我们自己实现的Digest authentication进行限制,在浏览器、curl和Apache HttpClient中经过测试和工作。
上传客户端包装Apache HttpClient 4.1.2并通过http执行PUT操作以上传文件实体。文件的内容类型在标头中指定为application/xml,一次只上传一个文件。
在上传不同大小的文件时,可能会观察到一种奇怪的行为:
- 上传大小小于或等于 1.076.006 字节的文件 成功。
- 大小大于或等于 1.122.158 字节的文件
失败,
java.net.SocketException: Broken pipe。
(确切的临界大小未知,因为我手动创建了不同大小的文件以接近最大工作大小)
管道损坏的原因是,客户端以某种方式忽略了 www-authenticate-response 上传该大小的文件,正如服务器日志所记录的那样。 “忽略”意味着它只发送多 (4) 条根本不包含身份验证标头的消息。
但是较小的文件运行良好,并且客户端在www-authenticate-response 之后立即正确地发送具有正确质询-响应的身份验证请求。
上传可以在 curl 中处理各种大小的文件,所以没有问题。
因此,此时,您可以说:“您的客户端中存在一些错误。”好的,我希望如此,但是我也尝试了一个开源 java RESTclient(也包装了 apache httpclient),它的行为完全相同!
我们在互联网上使用此客户端进行了尝试,它也与描述的相同。所以现在,我只是希望我错过了在Apache HttpClient 中设置一些重要的东西,这会导致这种错误行为,而开源 RESTclient 的开发人员也错过了它......任何想法都会很棒!
【问题讨论】:
标签: java apache file-upload httpclient digest-authentication