mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 07:13:00 +00:00 
			
		
		
		
	socket leak fix
* fix socket leak in "DownloadRunnable" * in "DownloadInitializer" close the HTTP body after doing range-request checks * in "DownloadRunnableFallback" fix typo in comment * in "DownloadDialog" fix regression, using one thread for audios instead of subtitles
This commit is contained in:
		| @@ -773,7 +773,6 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck | ||||
|         // more download logic: select muxer, subtitle converter, etc. | ||||
|         switch (radioStreamsGroup.getCheckedRadioButtonId()) { | ||||
|             case R.id.audio_button: | ||||
|                 threads = 1;// use unique thread for subtitles due small file size | ||||
|                 kind = 'a'; | ||||
|                 selectedStream = audioStreamsAdapter.getItem(selectedAudioIndex); | ||||
|  | ||||
| @@ -808,6 +807,7 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck | ||||
|                 } | ||||
|                 break; | ||||
|             case R.id.subtitle_button: | ||||
|                 threads = 1;// use unique thread for subtitles due small file size | ||||
|                 kind = 's'; | ||||
|                 selectedStream = subtitleStreamsAdapter.getItem(selectedSubtitleIndex); | ||||
|  | ||||
|   | ||||
| @@ -28,11 +28,21 @@ public class DownloadInitializer extends Thread { | ||||
|         mConn = null; | ||||
|     } | ||||
|  | ||||
|     private static void safeClose(HttpURLConnection con) { | ||||
|         try { | ||||
|             con.getInputStream().close(); | ||||
|         } catch (Exception e) { | ||||
|             // nothing to do | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void run() { | ||||
|         if (mMission.current > 0) mMission.resetState(false, true, DownloadMission.ERROR_NOTHING); | ||||
|  | ||||
|         int retryCount = 0; | ||||
|         int httpCode = 204; | ||||
|  | ||||
|         while (true) { | ||||
|             try { | ||||
|                 if (mMission.blocks == null && mMission.current == 0) { | ||||
| @@ -43,11 +53,16 @@ public class DownloadInitializer extends Thread { | ||||
|                     for (int i = 0; i < mMission.urls.length && mMission.running; i++) { | ||||
|                         mConn = mMission.openConnection(mMission.urls[i], mId, -1, -1); | ||||
|                         mMission.establishConnection(mId, mConn); | ||||
|                         safeClose(mConn); | ||||
|  | ||||
|                         if (Thread.interrupted()) return; | ||||
|                         long length = Utility.getContentLength(mConn); | ||||
|  | ||||
|                         if (i == 0) mMission.length = length; | ||||
|                         if (i == 0) { | ||||
|                             httpCode = mConn.getResponseCode(); | ||||
|                             mMission.length = length; | ||||
|                         } | ||||
|  | ||||
|                         if (length > 0) finalLength += length; | ||||
|                         if (length < lowestSize) lowestSize = length; | ||||
|                     } | ||||
| @@ -68,13 +83,15 @@ public class DownloadInitializer extends Thread { | ||||
|                     // ask for the current resource length | ||||
|                     mConn = mMission.openConnection(mId, -1, -1); | ||||
|                     mMission.establishConnection(mId, mConn); | ||||
|                     safeClose(mConn); | ||||
|  | ||||
|                     if (!mMission.running || Thread.interrupted()) return; | ||||
|  | ||||
|                     httpCode = mConn.getResponseCode(); | ||||
|                     mMission.length = Utility.getContentLength(mConn); | ||||
|                 } | ||||
|  | ||||
|                 if (mMission.length == 0 || mConn.getResponseCode() == 204) { | ||||
|                 if (mMission.length == 0 || httpCode == 204) { | ||||
|                     mMission.notifyError(DownloadMission.ERROR_HTTP_NO_CONTENT, null); | ||||
|                     return; | ||||
|                 } | ||||
| @@ -92,6 +109,7 @@ public class DownloadInitializer extends Thread { | ||||
|                     // Open again | ||||
|                     mConn = mMission.openConnection(mId, mMission.length - 10, mMission.length); | ||||
|                     mMission.establishConnection(mId, mConn); | ||||
|                     safeClose(mConn); | ||||
|  | ||||
|                     if (!mMission.running || Thread.interrupted()) return; | ||||
|  | ||||
|   | ||||
| @@ -49,7 +49,6 @@ public class DownloadRunnable extends Thread { | ||||
|         } | ||||
|  | ||||
|         SharpStream f; | ||||
|         InputStream is = null; | ||||
|  | ||||
|         try { | ||||
|             f = mMission.storage.getStream(); | ||||
| @@ -114,16 +113,16 @@ public class DownloadRunnable extends Thread { | ||||
|  | ||||
|                 f.seek(mMission.offsets[mMission.current] + start); | ||||
|  | ||||
|                 is = mConn.getInputStream(); | ||||
|                 try (InputStream is = mConn.getInputStream()) { | ||||
|                     byte[] buf = new byte[DownloadMission.BUFFER_SIZE]; | ||||
|                     int len; | ||||
|  | ||||
|                 byte[] buf = new byte[DownloadMission.BUFFER_SIZE]; | ||||
|                 int len; | ||||
|  | ||||
|                 while (start < end && mMission.running && (len = is.read(buf, 0, buf.length)) != -1) { | ||||
|                     f.write(buf, 0, len); | ||||
|                     start += len; | ||||
|                     block.done += len; | ||||
|                     mMission.notifyProgress(len); | ||||
|                     while (start < end && mMission.running && (len = is.read(buf, 0, buf.length)) != -1) { | ||||
|                         f.write(buf, 0, len); | ||||
|                         start += len; | ||||
|                         block.done += len; | ||||
|                         mMission.notifyProgress(len); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 if (DEBUG && mMission.running) { | ||||
| @@ -143,12 +142,6 @@ public class DownloadRunnable extends Thread { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             if (is != null) is.close(); | ||||
|         } catch (Exception err) { | ||||
|             // nothing to do | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             f.close(); | ||||
|         } catch (Exception err) { | ||||
|   | ||||
| @@ -94,7 +94,7 @@ public class DownloadRunnableFallback extends Thread { | ||||
|                 mMission.notifyProgress(len); | ||||
|             } | ||||
|  | ||||
|             // if thread goes interrupted check if the last part mIs written. This avoid re-download the whole file | ||||
|             // if thread goes interrupted check if the last part is written. This avoid re-download the whole file | ||||
|             done = len == -1; | ||||
|         } catch (Exception e) { | ||||
|             dispose(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 kapodamy
					kapodamy