mts*_*tsz 4 java apache file-upload httpclient digest-authentication
我正在使用java(和scala)开发和测试一个简单的直接客户端 - 服务器应用程序.
该服务器是基于com.sun.net.httpserver.HttpServer并允许文件上传通过使用POST和PUT操作的基本RESTful接口.使用我们自己实现的摘要式身份验证限制上传操作,经过测试并在浏览器中工作,卷曲和Apache HttpClient.
在上传客户端包裹Apache HttpClient 4.1.2并执行放完了HTTP操作来上传文件的实体.文件的内容类型application/xml在标题中指定,一次只上载一个文件.
上传不同大小的文件时,可能会出现奇怪的行为:
java.net.SocketException: Broken pipe.(确切的临界尺寸未知,因为我手动创建了不同尺寸的文件以接近最大工作尺寸)
管道损坏的原因是,客户端以某种方式忽略了www-authenticate响应的上传文件,如服务器日志所记录的那样."忽略"意味着它只发送多个(4)消息,根本不包含认证头.但是较小的文件运行良好,并且客户端在响应之后立即正确地发送具有适当质询 - 响应的身份验证请求www-authenticate.
上传工作卷曲与各种大小的文件,所以没有问题.
所以在这一点上,人们可以说:"你的客户端存在一些错误." 好吧,我有点希望如此,但我也尝试过一个开源的java RESTclient(也包装apache httpclient),它有完全相同的行为!
我们通过互联网使用这个客户端尝试了它,它也和描述的相同.所以现在,我只是希望我错过了设置一些重要的Apache HttpClient导致这种错误行为的东西,而开源RESTclient的开发者也错过了它......任何想法都可能会很棒!
很可能是导致这种情况的几个因素的组合
(1)当发送具有不包含认证头的请求的大型请求实体时,您的客户端很可能不使用"expect-continue"握手.
(2)服务器早期检测到请求未达到预期,而不是读取和丢弃完整的请求主体,它以401状态提前响应并在其结束时关闭连接.在我看来,这是服务器方面的HTTP协议违规.
(3)虽然一些HTTP代理可以处理早期响应,但Apache HttpClient不能由于Java阻塞I/O的限制(执行线程可以从阻塞套接字读取或写入,但不能同时读取或写入).
有多种方法可以解决这个问题,"期望 - 继续"握手是最简单,最自然的握手.或者,可以执行简单的HEAD或GET请求以在执行大的POST或PUT请求之前强制进行HTTP身份验证.HttpClient能够在同一逻辑HTTP会话中为后续请求重用身份验证数据.
| 归档时间: |
|
| 查看次数: |
2815 次 |
| 最近记录: |