我正在使用Java(和Scala)开发和测试一个简单的客户端-服务器应用程序。
服务器基于com.sun.net.httpserver.HttpServer
,通过基本的RESTful接口使用POST和PUT操作允许上传文件。上传操作使用我们自己实现的摘要身份验证进行限制,在浏览器、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
响应,正如服务器日志所记录的那样。 “忽略”意味着它只发送了多个(4个)不含任何身份验证头的消息。
但是,更小的文件可以很好地工作,并且客户端会立即在www-authenticate
响应之后正确地发送具有适当挑战-响应的身份验证请求。
使用curl上传各种大小的文件都没有问题,因此没有问题。
因此,此时可以说:“您的客户端存在一些错误。” 好吧,我有点希望如此,但是我也尝试过一个开源的java RESTclient(也包装了apache httpclient),它的行为完全相同!我们尝试使用此客户端通过互联网进行测试,结果与描述的相同。因此,我希望我没有错过在Apache HttpClient中设置的重要内容,导致这种错误行为,并且开源RESTclient的开发人员也错过了它...有什么想法吗?谢谢!