Disable http keep-alive if we get a ProtocolException (bad status line) from the server.
This commit is contained in:
parent
f732e0b822
commit
5aa674daf4
|
@ -41,6 +41,7 @@ import java.io.BufferedWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStreamWriter;
|
import java.io.OutputStreamWriter;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.ProtocolException;
|
||||||
import java.net.Proxy;
|
import java.net.Proxy;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -151,12 +152,6 @@ public class HostConnection {
|
||||||
private OkHttpClient httpClient = null;
|
private OkHttpClient httpClient = null;
|
||||||
private static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json");
|
private static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json");
|
||||||
|
|
||||||
/**
|
|
||||||
* Workaround for connection issues with Kodi. If we get a protocol exception,
|
|
||||||
* disable conn pooling (disable keep-alive) and try again
|
|
||||||
*/
|
|
||||||
private boolean disableConnectionPooling = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new host connection
|
* Creates a new host connection
|
||||||
* @param hostInfo Host info object
|
* @param hostInfo Host info object
|
||||||
|
@ -433,7 +428,7 @@ public class HostConnection {
|
||||||
.post(RequestBody.create(MEDIA_TYPE_JSON, jsonRequest))
|
.post(RequestBody.create(MEDIA_TYPE_JSON, jsonRequest))
|
||||||
.build();
|
.build();
|
||||||
LogUtils.LOGD(TAG, "Sending request via OkHttp: " + jsonRequest);
|
LogUtils.LOGD(TAG, "Sending request via OkHttp: " + jsonRequest);
|
||||||
Response response = sendOkHttpRequest(request);
|
Response response = sendOkHttpRequest(client, request);
|
||||||
final T result = method.resultFromJson(parseJsonResponse(handleOkHttpResponse(response)));
|
final T result = method.resultFromJson(parseJsonResponse(handleOkHttpResponse(response)));
|
||||||
|
|
||||||
if ((handler != null) && (callback != null)) {
|
if ((handler != null) && (callback != null)) {
|
||||||
|
@ -484,14 +479,29 @@ public class HostConnection {
|
||||||
return httpClient;
|
return httpClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hack to circumvent a Protocol Exception that occurs when the server returns bogus Status Line
|
||||||
|
// http://forum.kodi.tv/showthread.php?tid=224288
|
||||||
|
private OkHttpClient getNewOkHttpClientNoKeepAlive() {
|
||||||
|
java.lang.System.setProperty("http.keepAlive", "false");
|
||||||
|
httpClient = null;
|
||||||
|
return getOkHttpClient();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send an OkHttp POST request
|
* Send an OkHttp POST request
|
||||||
* @param request Request to send
|
* @param request Request to send
|
||||||
* @throws ApiException
|
* @throws ApiException
|
||||||
*/
|
*/
|
||||||
private Response sendOkHttpRequest(Request request) throws ApiException {
|
private Response sendOkHttpRequest(final OkHttpClient client, final Request request) throws ApiException {
|
||||||
try {
|
try {
|
||||||
return httpClient.newCall(request).execute();
|
return client.newCall(request).execute();
|
||||||
|
} catch (ProtocolException e) {
|
||||||
|
LogUtils.LOGW(TAG, "Got a Protocol Exception when trying to send OkHttp request. " +
|
||||||
|
"Trying again without connection pooling to try to circunvent this", e);
|
||||||
|
// Hack to circumvent a Protocol Exception that occurs when the server returns bogus Status Line
|
||||||
|
// http://forum.kodi.tv/showthread.php?tid=224288
|
||||||
|
httpClient = getNewOkHttpClientNoKeepAlive();
|
||||||
|
throw new ApiException(ApiException.IO_EXCEPTION_WHILE_SENDING_REQUEST, e);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LogUtils.LOGW(TAG, "Failed to send OkHttp request.", e);
|
LogUtils.LOGW(TAG, "Failed to send OkHttp request.", e);
|
||||||
throw new ApiException(ApiException.IO_EXCEPTION_WHILE_SENDING_REQUEST, e);
|
throw new ApiException(ApiException.IO_EXCEPTION_WHILE_SENDING_REQUEST, e);
|
||||||
|
|
Loading…
Reference in New Issue