CR + LF在HTTP响应头中更改为__

时间:2013-09-07 00:12:38

标签: google-app-engine http-headers http-status-code-401 digest-authentication java-server

查看有关更新问题的更新

我正在使用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-AuthenticateServer标头。这些都是必需的吗?

我在这里做错了什么?

更新:我现在正在客户端记录响应标头(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响应中新行的标题属性的人。

0 个答案:

没有答案