From 6136f095eca4f2000e61229abafabf3054aba8c5 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 25 Jul 2018 14:06:30 +0200 Subject: [PATCH] Made sure to close okhttp responses properly to avoid resource leaks --- src/main/java/ctbrec/recorder/Chaturbate.java | 39 +++++---- .../ctbrec/recorder/download/HlsDownload.java | 86 +++++++++++-------- 2 files changed, 71 insertions(+), 54 deletions(-) diff --git a/src/main/java/ctbrec/recorder/Chaturbate.java b/src/main/java/ctbrec/recorder/Chaturbate.java index b030006e..ebb11a3d 100644 --- a/src/main/java/ctbrec/recorder/Chaturbate.java +++ b/src/main/java/ctbrec/recorder/Chaturbate.java @@ -38,18 +38,21 @@ public class Chaturbate { .addHeader("X-Requested-With", "XMLHttpRequest") .build(); Response response = client.execute(req); - if(response.isSuccessful()) { - String content = response.body().string(); - LOG.debug("Raw stream info: {}", content); - Moshi moshi = new Moshi.Builder().build(); - JsonAdapter adapter = moshi.adapter(StreamInfo.class); - StreamInfo streamInfo = adapter.fromJson(content); - return streamInfo; - } else { - int code = response.code(); - String message = response.message(); + try { + if(response.isSuccessful()) { + String content = response.body().string(); + LOG.debug("Raw stream info: {}", content); + Moshi moshi = new Moshi.Builder().build(); + JsonAdapter adapter = moshi.adapter(StreamInfo.class); + StreamInfo streamInfo = adapter.fromJson(content); + return streamInfo; + } else { + int code = response.code(); + String message = response.message(); + throw new IOException("Server responded with " + code + " - " + message + " headers: [" + response.headers() + "]"); + } + } finally { response.close(); - throw new IOException("Server responded with " + code + " - " + message + " headers: [" + response.headers() + "]"); } } @@ -83,10 +86,14 @@ public class Chaturbate { LOG.trace("Loading master playlist {}", streamInfo.url); Request req = new Request.Builder().url(streamInfo.url).build(); Response response = client.execute(req); - InputStream inputStream = response.body().byteStream(); - PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8); - Playlist playlist = parser.parse(); - MasterPlaylist master = playlist.getMasterPlaylist(); - return master; + try { + InputStream inputStream = response.body().byteStream(); + PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8); + Playlist playlist = parser.parse(); + MasterPlaylist master = playlist.getMasterPlaylist(); + return master; + } finally { + response.close(); + } } } diff --git a/src/main/java/ctbrec/recorder/download/HlsDownload.java b/src/main/java/ctbrec/recorder/download/HlsDownload.java index 339973ca..5aeb3f55 100644 --- a/src/main/java/ctbrec/recorder/download/HlsDownload.java +++ b/src/main/java/ctbrec/recorder/download/HlsDownload.java @@ -146,55 +146,63 @@ public class HlsDownload implements Download { URL segmentsUrl = new URL(segments); Request request = new Request.Builder().url(segmentsUrl).addHeader("connection", "keep-alive").build(); Response response = client.execute(request); - InputStream inputStream = response.body().byteStream(); - PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8); - Playlist playlist = parser.parse(); - if(playlist.hasMediaPlaylist()) { - MediaPlaylist mediaPlaylist = playlist.getMediaPlaylist(); - LiveStreamingPlaylist lsp = new LiveStreamingPlaylist(); - lsp.seq = mediaPlaylist.getMediaSequenceNumber(); - lsp.targetDuration = mediaPlaylist.getTargetDuration(); - List tracks = mediaPlaylist.getTracks(); - for (TrackData trackData : tracks) { - String uri = trackData.getUri(); - if(!uri.startsWith("http")) { - String _url = segmentsUrl.toString(); - _url = _url.substring(0, _url.lastIndexOf('/') + 1); - String segmentUri = _url + uri; - lsp.totalDuration += trackData.getTrackInfo().duration; - lsp.lastSegDuration = trackData.getTrackInfo().duration; - lsp.segments.add(segmentUri); + try { + InputStream inputStream = response.body().byteStream(); + PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8); + Playlist playlist = parser.parse(); + if(playlist.hasMediaPlaylist()) { + MediaPlaylist mediaPlaylist = playlist.getMediaPlaylist(); + LiveStreamingPlaylist lsp = new LiveStreamingPlaylist(); + lsp.seq = mediaPlaylist.getMediaSequenceNumber(); + lsp.targetDuration = mediaPlaylist.getTargetDuration(); + List tracks = mediaPlaylist.getTracks(); + for (TrackData trackData : tracks) { + String uri = trackData.getUri(); + if(!uri.startsWith("http")) { + String _url = segmentsUrl.toString(); + _url = _url.substring(0, _url.lastIndexOf('/') + 1); + String segmentUri = _url + uri; + lsp.totalDuration += trackData.getTrackInfo().duration; + lsp.lastSegDuration = trackData.getTrackInfo().duration; + lsp.segments.add(segmentUri); + } } + return lsp; } - return lsp; + return null; + } finally { + response.close(); } - return null; } private String parseMaster(String url, int streamUrlIndex) throws IOException, ParseException, PlaylistException { Request request = new Request.Builder().url(url).addHeader("connection", "keep-alive").build(); Response response = client.execute(request); - InputStream inputStream = response.body().byteStream(); + try { + InputStream inputStream = response.body().byteStream(); - PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8); - Playlist playlist = parser.parse(); - if(playlist.hasMasterPlaylist()) { - MasterPlaylist master = playlist.getMasterPlaylist(); - PlaylistData bestQuality = null; - if(streamUrlIndex >= 0 && streamUrlIndex < master.getPlaylists().size()) { - bestQuality = master.getPlaylists().get(streamUrlIndex); - } else { - bestQuality = master.getPlaylists().get(master.getPlaylists().size()-1); - } - String uri = bestQuality.getUri(); - if(!uri.startsWith("http")) { - String masterUrl = url; - String baseUri = masterUrl.substring(0, masterUrl.lastIndexOf('/') + 1); - String segmentUri = baseUri + uri; - return segmentUri; + PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8); + Playlist playlist = parser.parse(); + if(playlist.hasMasterPlaylist()) { + MasterPlaylist master = playlist.getMasterPlaylist(); + PlaylistData bestQuality = null; + if(streamUrlIndex >= 0 && streamUrlIndex < master.getPlaylists().size()) { + bestQuality = master.getPlaylists().get(streamUrlIndex); + } else { + bestQuality = master.getPlaylists().get(master.getPlaylists().size()-1); + } + String uri = bestQuality.getUri(); + if(!uri.startsWith("http")) { + String masterUrl = url; + String baseUri = masterUrl.substring(0, masterUrl.lastIndexOf('/') + 1); + String segmentUri = baseUri + uri; + return segmentUri; + } } + return null; + } finally { + response.close(); } - return null; } public static class LiveStreamingPlaylist { @@ -238,6 +246,8 @@ public class HlsDownload implements Download { break; } catch(Exception e) { LOG.error("Error while downloading segment. Retrying " + i, e); + } finally { + response.close(); } } return false;