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