【发布时间】:2016-01-27 00:44:38
【问题描述】:
我使用HttpURLConnection 的方式如下:
String strURL = "https://example.herokuapp.com";
Bitmap bmImage = null;
HttpURLConnection connection = null;
InputStream in = null;
showMessage(context.getString(R.string.message_preparing));
try {
int timeoutMS = 15000;
URL url = new URL(strURL);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setConnectTimeout(timeoutMS);
connection.setReadTimeout(timeoutMS);
connection.connect();
in = connection.getInputStream();
BitmapFactory.Options options = new BitmapFactory.Options();
bmImage = BitmapFactory.decodeStream(in, null, options);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null)
connection.disconnect();
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bmImage;
这很好用,strURL 定义的 url 返回一个 bmp 图像,并且被解码以供上述代码使用。
但特别是对于一个用户,虽然代码可以正常获取 bmp 图像,但在服务器(heroku 的 node.js 服务器)上,显然他们的设备也在发送CONNECT 请求。该请求会自动以 503 响应被拒绝,因此这不是问题,并且 bmp 仍会发送到他们的设备,但我想知道为什么要发送那些 CONNECT 请求,以及如何发送阻止他们。除了GET 请求之外应该什么都没有?
我已经尝试this solution 来解决类似的问题,但这对我来说没有任何区别。
请注意,strURL 是一个 https 服务器,我使用的是HttpURLConnection(不是Https)——不确定这是否有任何意义。
我也不能 100% 确定 CONNECT 请求源自上述调用,但它们肯定与传递 bmp 的 GET 请求同时发生。也许它可以由操作系统以某种方式在我的代码之外生成?不确定。
如果有帮助,heroku 响应 CONNECT 请求之一的示例日志消息如下:
Oct 27 14:14:25 example heroku/router: at=error code=H13 desc="Connection closed without response" method=CONNECT path="example.herokuapp.com:443" host=example.herokuapp.com request_id=353e623x-dec4-42x5-bcfb-452add02ecef fwd="111.22.333.4" dyno=web.1 connect=0ms service=1ms status=503 bytes=0
编辑:相关设备实际上在很短的时间内发出两个独立的 GET 请求(完全独立且合法的请求)也可能是相关的,但只有一个明显的 CONNECT 请求(大约相同时间作为 GET 请求对)。所以并不是每个 GET 都有一个 CONNECT。
【问题讨论】:
-
这是有意使用代理的样子:stackoverflow.com/questions/15927079/…
-
当我的代码中没有任何代理内容时,是否可以尝试使用代理?
-
我没听说过。我同意,这没有意义。而且由于它仅限于一小部分客户,并且只能在野外观察到,所以它非常神秘。我怀疑是特定于版本的行为或错误。即时请求是否告诉您有关用户代理的任何信息?或者您是否可以添加代码来收集有关操作系统和硬件的信息,并将其传递到 GET 请求的自定义标头中?
-
是的,已经有了这些信息:samsung、m0xx、GT-I9300、Android 4.3、启动器 com.hola.launcher。撇开启动器不谈,有很多其他用户使用完全相同的组合,没有任何奇怪的 CONNECT,还有很多使用该启动器的用户,同样没有任何 CONNECT。
-
远射,但要考虑的另一个变量是连接是否来自受限网络,这可能会强制通过代理进行出站连接。
标签: java android heroku httpurlconnection