查看有关更新问题的更新
我正在使用AFNetworking
的{{1}}来处理我应用的服务电话。我的服务器使用HTTP摘要身份验证进行身份验证。服务调用返回401 HTTP错误,其响应中带有AFHTTPClient
标头作为这样的质询:
WWW-Authenticate
HTTP/1.1 401
WWW-Authenticate: Digest realm="user@myserver.com",
qop="auth",
nonce="059c37d0e654fdba9c606f35ce84741998"
Content-Type: text/html; charset=utf-8
方法永远不会在connection:didReceiveAuthenticationChallenge:
中调用,在这种情况下是AFURLConnectionOperation
,然后会在NSURLConnectionDelegate
中调用我的阻止集。相反,我只是在setAuthenticationChallengeBlock:
失败块中收到错误:Error Expected status code in (200-299), got 401
。
据我了解,这些是HTTP摘要身份验证的AFHTTPRequestOperation
标头中唯一必填字段。它与this example on Wikipedia中的响应非常相似。我没有任何实际的响应,因为我还没有向用户显示任何HTML。这有关系吗?我没有使用不透明字段,但这应该是可选的。我不支持“auth-int”保护质量。除此之外,我不会返回WWW-Authenticate
或Server
标头。这些都是必需的吗?
我在这里做错了什么?
更新:我现在正在客户端记录响应标头(Apple不提供简单打印我知道的纯文本响应的好方法)。上面显示的响应是在服务器上记录的。 Date
NSHTTPURLResponse
的结果是:
allHeaders
服务器实际包含{
"Alternate-Protocol" = "80:quic";
"Cache-Control" = private;
"Content-Type" = "text/html; charset=utf-8";
Date = "Mon, 09 Sep 2013 20:24:00 GMT";
Server = "Google Frontend";
"Transfer-Encoding" = Identity;
Vary = "Accept-Encoding";
"Www-Authenticate" = "Digest realm=\"user@myserver.com\",__ qop=\"auth\",__ nonce=\"f36dc1b8abc342d5c1cbad22a533d3868c\"";
}
和Server
标头,以及其他一些标头。该服务器是Google App Engine。
但问题似乎是我的Date
CR + LF由于某种原因被转换为\r\n
,这会混淆标头语法。调查为什么这是...
更新2:仅在__
中使用\n
结果。 HTTP要求是使用CR + LF + SPACE来划分标题内的行。所以现在我的问题变成了,如何在我的_
标题字符串中正确包含此CR + LF + SPACE以便正确编码?在服务器响应过程中,编码是否被更改,导致我得到的HttpServletResponse
字符?
这是创建响应的服务器代码:
_
最后一行是记录响应的内容,如上所示,此时格式正确。
回车public static void sendUnauthorizedResponse(HttpServletResponse resp, String realm, boolean isStale) throws IOException {
String s = ",\r\n ";
String header = "Digest realm=\"" + realm + "\"" + s + "qop=\"auth\"" + s + "nonce=\"" + createNonce() + "\"";
if (isStale) {
header += s + "stale=TRUE";
}
resp.setHeader("WWW-Authenticate", header);
resp.sendError(HttpServletResponse.SC_UNAUTHORIZED);
log.info("Sent 401 Unauthorized Response:\n" + resp.toString());
}
0x0D和换行符\r
0x0A都被更改为ASCII下划线\n
0x5F。
更新3 :我可以确认这不是客户问题,但必须由Google App Engine服务器引起。在海报工具中发布服务调用时,我得到相同的结果。
更新4 :删除CR + LF字符并在一行中包含逗号分隔属性似乎可以正常工作,但根据RFC 2047,行不应该更长超过75个字符,现在是:
“编码字”长度不得超过75个字符,包括“字符集”,“编码”,“编码文本”和分隔符。如果希望编码的文本多于75个字符的“编码字”,则可以使用多个“编码字”(由CRLF SPACE分隔)。
虽然对多行标题字段的长度没有限制,但包含一个或多个“编码字”的标题字段的每一行限制为76个字符。
所以我仍然需要弄清楚如何在我的标题字符串中正确放置CR + LF字符。
更新5:所以看起来the maximum characters allowed per line of an HTTP header is server dependent and likely in the thousands of bytes range,这应该足够_
标头。但是这仍然没有回答为什么我的标题字符串中的“\ r \ n”字符被转换为“__”的问题。这是Google App Engine中的错误吗?很难想象我是唯一一个使用CR + LF + SPACE来分隔HTTP响应中新行的标题属性的人。