![](/img/trans.png)
[英]Android's HttpURLConnection throws EOFException on HEAD requests
[英]Android EOFException when using HttpURLConnection headers
我使用自定义授权标头签署我的http请求:
String key="client="+USER+",hash="+sha1(STR, API_KEY)+",timestamp="+t.toString();
如果有人对sha1方法感兴趣: http : //pastebin.com/HRFXQ4Bk密钥字符串用作标题:
URL url = new URL(sb.toString());
HttpURLConnection conn = null;
conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Authorization", key);
conn.setRequestMethod("GET");
InputStreamReader in = new InputStreamReader(conn.getInputStream());
当我尝试获得响应时,我得到以下错误:
10-28 18:25:40.111:E / error(6855):java.io.EOFException 10-28 18:25:40.111:E / error(6855):at libcore.io.Streams.readAsciiLine(Streams.java: 203)10-28 18:25:40.111:E / error(6855):at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:579)10-28 18:25:40.111:E / error(6855) :at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:827)10-28 18:25:40.111:E / error(6855):at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283 )10-28 18:25:40.111:E / error(6855):at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
在我的服务器上,此请求未记录任何访问权限。 但是,当我删除auth标头时,根据服务器日志建立与我的服务器的连接。
那么auth头如何影响请求呢? 使用标题时为什么没有连接?
BTW像一个标题
conn.setRequestProperty("Authorization", "FOOBAR");
然而,由于授权标头与要求不匹配,因此被拒绝:
10-29 08:12:07.235:E / error(23663):java.net.ConnectException:无法连接到api.myserver.net(端口1337):连接失败:ECONNREFUSED(连接被拒绝)10-29 08:12 :07.235:E / error(23663):at libcore.io.IoBridge.connect(IoBridge.java:114)10-29 08:12:07.235:E / error(23663):at java.net.PlainSocketImpl.connect( PlainSocketImpl.java:192)10-29 08:12:07.235:E / error(23663):at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
我的webservice要求标题具有以下格式
match(/client=([^,]*),hash=([^,]*),timestamp=([^,]*)/);
所以这个例外与最初的例外不同。 当我删除标题并禁用我的webservice上的授权时,连接按预期工作。 所以问题似乎与自定义授权标头有关。 有任何想法吗?
看起来它可能是根据这个某些Android版本中的问题的问题 。
尝试将conn.setRequestProperty("Connection", "close")
到您的请求中。
首先,检查您的URL是否包含意外的换行符('\\ n'或'\\ r \\ n'),如果有,您将在读取响应时获得EOFException。 新行将中继HTTP包,服务器认为客户端有更多数据要发送,因此没有响应。 每次阅读响应的尝试都会立即获得EOF。
确保您的请求有效后,请尝试其他人提供的解决方案。
当我将Android应用程序的后端从Asp更改为PHP时,我开始发现问题。
我解决了它在我的PHP页面上添加以下行:
header("Connection: close");
可能仅仅是因为您的服务器响应在这种情况下并不完全正确。
我的服务器使用的是python SimpleHTTPServer,我错误地假设我需要做的就是表明成功如下:
self.send_response(200)
它发送初始响应标题行,服务器和日期标题,但使流处于您能够发送其他标题的状态。 HTTP需要在标题之后添加一个新行以表示它们已完成。 当你尝试使用HttpURLConnection获取结果体InputStream或响应代码等时,如果这个新行不存在,那么它会抛出EOFException(这实际上是合理的,考虑它)。 一些HTTP客户端确实接受了短响应,并报告了成功结果代码,这导致我可能不公平地将手指指向HttpURLConnection。
我改变了我的服务器来做这件事:
self.send_response(200)
self.send_header("Content-Length", "0")
self.end_headers()
该代码不再有EOFException。 “连接:关闭”解决方案可能会在某些可能解决此问题的服务器上触发某些行为(例如,确保响应在关闭之前有效)但python SimpleHTTPServer不是这种情况,根本原因是我的错。
注意:Android之前的Froyo(2.2)存在一些与保持连接有关的错误,但我不认为这是其中之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.