Merge pull request #278 from deathbeam/fix-memory-leak

Fix OkHttp connection leaks on connection error
This commit is contained in:
Adam
2017-12-21 20:25:47 -05:00
committed by GitHub
9 changed files with 77 additions and 104 deletions

View File

@@ -33,7 +33,6 @@ import net.runelite.http.api.RuneliteAPI;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -65,11 +64,9 @@ public class AccountClient
.url(url) .url(url)
.build(); .build();
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
try (ResponseBody body = response.body())
{ {
InputStream in = body.byteStream(); InputStream in = response.body().byteStream();
return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), OAuthResponse.class); return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), OAuthResponse.class);
} }
catch (JsonParseException ex) catch (JsonParseException ex)
@@ -92,9 +89,7 @@ public class AccountClient
.url(url) .url(url)
.build(); .build();
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
try (ResponseBody body = response.body())
{ {
logger.debug("Sent logout request"); logger.debug("Sent logout request");
} }

View File

@@ -35,7 +35,6 @@ import okhttp3.MediaType;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -65,11 +64,9 @@ public class ConfigClient
.url(url) .url(url)
.build(); .build();
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
try (ResponseBody body = response.body())
{ {
InputStream in = body.byteStream(); InputStream in = response.body().byteStream();
return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), Configuration.class); return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), Configuration.class);
} }
catch (JsonParseException ex) catch (JsonParseException ex)

View File

@@ -32,7 +32,6 @@ import net.runelite.http.api.RuneliteAPI;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -55,11 +54,9 @@ public class HiscoreClient
.url(url) .url(url)
.build(); .build();
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
try (ResponseBody body = response.body())
{ {
InputStream in = body.byteStream(); InputStream in = response.body().byteStream();
return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), HiscoreResult.class); return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), HiscoreResult.class);
} }
catch (JsonParseException ex) catch (JsonParseException ex)
@@ -76,24 +73,22 @@ public class HiscoreClient
public SingleHiscoreSkillResult lookup(String username, HiscoreSkill skill, HiscoreEndpoint endpoint) throws IOException public SingleHiscoreSkillResult lookup(String username, HiscoreSkill skill, HiscoreEndpoint endpoint) throws IOException
{ {
HttpUrl.Builder builder = RuneliteAPI.getApiBase().newBuilder() HttpUrl.Builder builder = RuneliteAPI.getApiBase().newBuilder()
.addPathSegment("hiscore") .addPathSegment("hiscore")
.addPathSegment(endpoint.name()) .addPathSegment(endpoint.name())
.addPathSegment(skill.toString().toLowerCase()) .addPathSegment(skill.toString().toLowerCase())
.addQueryParameter("username", username); .addQueryParameter("username", username);
HttpUrl url = builder.build(); HttpUrl url = builder.build();
logger.debug("Built URI: {}", url); logger.debug("Built URI: {}", url);
Request request = new Request.Builder() Request request = new Request.Builder()
.url(url) .url(url)
.build(); .build();
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
try (ResponseBody body = response.body())
{ {
InputStream in = body.byteStream(); InputStream in = response.body().byteStream();
return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), SingleHiscoreSkillResult.class); return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), SingleHiscoreSkillResult.class);
} }
catch (JsonParseException ex) catch (JsonParseException ex)

View File

@@ -32,7 +32,6 @@ import net.runelite.http.api.RuneliteAPI;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -54,17 +53,15 @@ public class ItemClient
.url(url) .url(url)
.build(); .build();
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
if (!response.isSuccessful())
{ {
logger.debug("Error looking up item {}: {}", itemId, response.message()); if (!response.isSuccessful())
return null; {
} logger.debug("Error looking up item {}: {}", itemId, response.message());
return null;
}
try (ResponseBody body = response.body()) InputStream in = response.body().byteStream();
{
InputStream in = body.byteStream();
return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice.class); return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice.class);
} }
catch (JsonParseException ex) catch (JsonParseException ex)
@@ -76,28 +73,26 @@ public class ItemClient
public SearchResult search(String itemName) throws IOException public SearchResult search(String itemName) throws IOException
{ {
HttpUrl url = RuneliteAPI.getApiBase().newBuilder() HttpUrl url = RuneliteAPI.getApiBase().newBuilder()
.addPathSegment("item") .addPathSegment("item")
.addPathSegment("search") .addPathSegment("search")
.addQueryParameter("query", itemName) .addQueryParameter("query", itemName)
.build(); .build();
logger.debug("Built URI: {}", url); logger.debug("Built URI: {}", url);
Request request = new Request.Builder() Request request = new Request.Builder()
.url(url) .url(url)
.build(); .build();
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
if (!response.isSuccessful())
{ {
logger.debug("Error looking up item {}: {}", itemName, response.message()); if (!response.isSuccessful())
return null; {
} logger.debug("Error looking up item {}: {}", itemName, response.message());
return null;
}
try (ResponseBody body = response.body()) InputStream in = response.body().byteStream();
{
InputStream in = body.byteStream();
return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), SearchResult.class); return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), SearchResult.class);
} }
catch (JsonParseException ex) catch (JsonParseException ex)

View File

@@ -36,7 +36,6 @@ import okhttp3.MediaType;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -83,11 +82,9 @@ public class XteaClient
.url(url) .url(url)
.build(); .build();
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
try (ResponseBody body = response.body())
{ {
InputStream in = body.byteStream(); InputStream in = response.body().byteStream();
// CHECKSTYLE:OFF // CHECKSTYLE:OFF
return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), new TypeToken<List<XteaKey>>() { }.getType()); return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), new TypeToken<List<XteaKey>>() { }.getType());
// CHECKSTYLE:ON // CHECKSTYLE:ON
@@ -109,11 +106,9 @@ public class XteaClient
.url(url) .url(url)
.build(); .build();
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
try (ResponseBody body = response.body())
{ {
InputStream in = body.byteStream(); InputStream in = response.body().byteStream();
return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), XteaKey.class); return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), XteaKey.class);
} }
catch (JsonParseException ex) catch (JsonParseException ex)

View File

@@ -26,14 +26,17 @@ package net.runelite.http.service.hiscore;
import java.io.IOException; import java.io.IOException;
import net.runelite.http.api.RuneliteAPI; import net.runelite.http.api.RuneliteAPI;
import net.runelite.http.api.hiscore.*; import net.runelite.http.api.hiscore.HiscoreEndpoint;
import net.runelite.http.api.hiscore.HiscoreResult;
import net.runelite.http.api.hiscore.HiscoreSkill;
import net.runelite.http.api.hiscore.SingleHiscoreSkillResult;
import net.runelite.http.api.hiscore.Skill;
import net.runelite.http.service.util.HiscoreEndpointEditor; import net.runelite.http.service.util.HiscoreEndpointEditor;
import net.runelite.http.service.util.exception.InternalServerErrorException; import net.runelite.http.service.util.exception.InternalServerErrorException;
import net.runelite.http.service.util.exception.NotFoundException; import net.runelite.http.service.util.exception.NotFoundException;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody;
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord; import org.apache.commons.csv.CSVRecord;
@@ -41,7 +44,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("/hiscore") @RequestMapping("/hiscore")
@@ -66,24 +73,22 @@ public class HiscoreService
.url(url) .url(url)
.build(); .build();
Response okresponse = RuneliteAPI.CLIENT.newCall(okrequest).execute();
if (!okresponse.isSuccessful())
{
switch (HttpStatus.valueOf(okresponse.code()))
{
case NOT_FOUND:
throw new NotFoundException();
default:
throw new InternalServerErrorException("Error retrieving data from Jagex Hiscores: " + okresponse.message());
}
}
String responseStr; String responseStr;
try (ResponseBody body = okresponse.body()) try (Response okresponse = RuneliteAPI.CLIENT.newCall(okrequest).execute())
{ {
responseStr = body.string(); if (!okresponse.isSuccessful())
{
switch (HttpStatus.valueOf(okresponse.code()))
{
case NOT_FOUND:
throw new NotFoundException();
default:
throw new InternalServerErrorException("Error retrieving data from Jagex Hiscores: " + okresponse.message());
}
}
responseStr = okresponse.body().string();
} }
CSVParser parser = CSVParser.parse(responseStr, CSVFormat.DEFAULT); CSVParser parser = CSVParser.parse(responseStr, CSVFormat.DEFAULT);

View File

@@ -45,7 +45,6 @@ import net.runelite.http.api.item.SearchResult;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -487,16 +486,14 @@ public class ItemService
private <T> T fetchJson(Request request, Class<T> clazz) throws IOException private <T> T fetchJson(Request request, Class<T> clazz) throws IOException
{ {
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
if (!response.isSuccessful())
{ {
throw new IOException("Unsuccessful http response: " + response.message()); if (!response.isSuccessful())
} {
throw new IOException("Unsuccessful http response: " + response.message());
}
try (ResponseBody body = response.body()) InputStream in = response.body().byteStream();
{
InputStream in = body.byteStream();
return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), clazz); return RuneliteAPI.GSON.fromJson(new InputStreamReader(in), clazz);
} }
catch (JsonParseException ex) catch (JsonParseException ex)
@@ -513,16 +510,14 @@ public class ItemService
.url(httpUrl) .url(httpUrl)
.build(); .build();
Response response = RuneliteAPI.CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute())
if (!response.isSuccessful())
{ {
throw new IOException("Unsuccessful http response: " + response.message()); if (!response.isSuccessful())
} {
throw new IOException("Unsuccessful http response: " + response.message());
}
try (ResponseBody body = response.body()) return response.body().bytes();
{
return body.bytes();
} }
} }
} }

View File

@@ -34,7 +34,6 @@ import net.runelite.http.api.worlds.WorldResult;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@@ -53,12 +52,11 @@ public class WorldsService
.url(url) .url(url)
.build(); .build();
Response okresponse = RuneliteAPI.CLIENT.newCall(okrequest).execute();
byte[] b; byte[] b;
try (ResponseBody body = okresponse.body()) try (Response okresponse = RuneliteAPI.CLIENT.newCall(okrequest).execute())
{ {
b = body.bytes(); b = okresponse.body().bytes();
} }
List<World> worlds = new ArrayList<>(); List<World> worlds = new ArrayList<>();

View File

@@ -31,13 +31,11 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import net.runelite.http.api.RuneliteAPI; import net.runelite.http.api.RuneliteAPI;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
public class ConfigLoader public class ConfigLoader
{ {
private static final OkHttpClient CLIENT = RuneliteAPI.CLIENT;
private static final HttpUrl CONFIG_URL = HttpUrl.parse("http://oldschool.runescape.com/jav_config.ws"); // https redirects us to rs3 private static final HttpUrl CONFIG_URL = HttpUrl.parse("http://oldschool.runescape.com/jav_config.ws"); // https redirects us to rs3
public static final String CODEBASE = "codebase"; public static final String CODEBASE = "codebase";
@@ -53,7 +51,7 @@ public class ConfigLoader
.url(CONFIG_URL) .url(CONFIG_URL)
.build(); .build();
try (Response response = CLIENT.newCall(request).execute(); try (Response response = RuneliteAPI.CLIENT.newCall(request).execute();
BufferedReader in = new BufferedReader(new InputStreamReader(response.body().byteStream()))) BufferedReader in = new BufferedReader(new InputStreamReader(response.body().byteStream())))
{ {
String str; String str;