2014-09-23 62 views
2

看起来像NSUrlSession /任务行为已更改与iOS8。我的应用程序使用AFNetworking层来管理后台下载任务。 它向后端(java/dropwizard)发送一个GET请求,该请求通过HTTP 302与AWS S3位置重定向进行响应。 在调用完成处理程序时,出现错误域:@“NSURLErrorDomain”“在此服务器上未找到请求的URL。” 我确认资源确实存在于指定的S3 URL位置。iOS8和AFNetworking /使用HTTP的NSHTTPSession 302

花了很长时间之后,我意识到问题可能与以下事实有关:应该包含在对我的后端的初始请求中的HTTP标头“授权”现在也包含在重定向的AWS S3资源请求中。我不认为这是iOS7的情况。* 显然,当包含“授权”标头时(使用curl确认),S3请求失败。

我试图为setTaskWillPerformHTTPRedirectionBlock定义一个处理程序,这样我就可以发出一个新的请求而不会触犯标题。不幸的是我的处理程序没有被调用。

我会apreciate任何建议/想法的人可能有这个。

回答

0

同样的问题在这里。在具有背景NSURLSessionConfiguration的会话中,

- (void)URLSession:(NSURLSession *)session 
      task:(NSURLSessionTask *)task 
willPerformHTTPRedirection:(NSHTTPURLResponse *)response 
    newRequest:(NSURLRequest *)request 
completionHandler:(void (^)(NSURLRequest *))completionHandler; 

从不调用委托方法。从苹果文档:

此方法仅适用于默认和短暂会话中的任务。后台会话中的任务会自动遵循重定向。

好。那么问题是NSURLSession正在转发Authorization跨主机名在重定向,你没有办法改变它。除了停止重定向到S3(和Azure)外,对我而言,这听起来像是一个安全问题。这个问题似乎是在iOS8中引入的,因为我看到有相反问题的人,其中Authorization标题在重定向中丢失,从iOS 8发布之前的日期开始。

解决它的一种(丑陋的)方法是将标题更改为自定义,例如,如果您控制发生重定向的后端,则可以使用Authorization_。 S3将忽略该标题。但是,你仍然在泄漏证书...