Sto usando HttpURLConnection
sulla falsariga di quanto segue:Prevenire metodo CONNECT non richiesti chiamate da 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;
Questo funziona bene, con l'URL definito da strURL
restituendo un'immagine BMP, e questo viene decodificato pronto per utilizzare con il codice precedente.
Ma per un utente in particolare, sebbene il codice funzioni correttamente per recuperare l'immagine bmp, sul server (un server node.js su heroku) è evidente che una richiesta CONNECT
viene inviata anche dal proprio dispositivo. Tale richiesta viene respinta automaticamente con una risposta 503, quindi non è un problema in quanto tale e il bmp viene comunque inviato al dispositivo, ma mi piacerebbe sapere perché vengono inviate quelle richieste CONNECT
e come fermarle . Sicuramente non ci dovrebbero essere nient'altro che le richieste GET
?
Ho provato this solution a quello che sembra essere un problema simile, ma per me non fa alcuna differenza.
Si noti che strURL
è a un server https e sto usando HttpURLConnection
(non Https
) - non sono sicuro se c'è un significato in questo.
Non sono sicuro al 100% che le richieste di CONNECT
derivino dalle chiamate precedenti, ma si verificano certamente nello stesso periodo di una richiesta GET
che consegna il bmp. Forse potrebbe essere generato dal sistema operativo in qualche modo, al di fuori del mio codice? Non sono sicuro.
In caso aiuta, un messaggio di esempio log dal Heroku, in risposta a una delle CONNECT
richieste, è la seguente:
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
EDIT: può anche essere di rilevanza che il dispositivo in questione in realtà fa due richieste GET indipendenti in breve tempo l'una dall'altra (richieste completamente separate e legittime), ma c'è sempre una sola richiesta CONNECT apparente (all'incirca alla stessa ora della coppia di richieste GET). Quindi non è come se ci fosse un CONNECT per ogni GET.
Questo è l'uso intenzionale di un proxy: http://stackoverflow.com/questions/15927079/how-to-use-httpsurlconnection-through-proxy-by-setproperty –
C'è un modo in cui un si può tentare l'uso di un proxy quando il mio codice non contiene elementi proxy in esso? – drmrbrewer
Non che io abbia mai sentito nominare. Sono d'accordo, non ha senso. E dal momento che è limitato a un piccolo sottoinsieme di client, e solo osservato in natura, è dannatamente misterioso. Sospetto un comportamento o un bug specifico della versione. Le richieste in avvicinamento ti dicono qualcosa sullo user agent? Oppure potresti aggiungere del codice per raccogliere informazioni sul sistema operativo e sull'hardware e trasmetterlo in un'intestazione personalizzata sulla richiesta GET? –