1616import java .nio .ByteBuffer ;
1717import java .sql .SQLException ;
1818import java .util .Map ;
19+ import java .util .Objects ;
1920import java .util .concurrent .ExecutorService ;
2021import java .util .concurrent .Executors ;
2122
@@ -232,13 +233,18 @@ private void requestChunk(int index) {
232233 }
233234
234235 private static class CdnLoader {
235- private final Socket socket ;
236- private final DataInputStream in ;
237- private final OutputStream out ;
238236 private final AudioUrl moreAudio ;
237+ private Socket socket ;
238+ private DataInputStream in ;
239+ private OutputStream out ;
239240
240241 CdnLoader (@ NotNull AudioUrl moreAudio ) throws IOException {
241242 this .moreAudio = moreAudio ;
243+
244+ populateSocket ();
245+ }
246+
247+ private synchronized void populateSocket () throws IOException {
242248 this .socket = moreAudio .createSocket ();
243249 this .in = new DataInputStream (socket .getInputStream ());
244250 this .out = socket .getOutputStream ();
@@ -251,11 +257,18 @@ public synchronized Response request(int chunk) throws IOException, CdnException
251257
252258 @ NotNull
253259 public synchronized Response request (int rangeStart , int rangeEnd ) throws IOException , CdnException {
260+ if (socket == null || socket .isClosed ())
261+ populateSocket ();
262+
254263 moreAudio .sendRequest (out , rangeStart , rangeEnd );
255264
256265 NetUtils .StatusLine sl = NetUtils .parseStatusLine (Utils .readLine (in ));
257- if (sl .statusCode != 206 )
266+ if (sl .statusCode == 408 ) {
267+ socket .close ();
268+ return request (rangeStart , rangeEnd );
269+ } else if (sl .statusCode != 206 ) {
258270 throw new IOException (sl .statusCode + ": " + sl .statusPhrase );
271+ }
259272
260273 Map <String , String > headers = NetUtils .parseHeaders (in );
261274 String contentLengthStr = headers .get ("Content-Length" );
@@ -266,6 +279,10 @@ public synchronized Response request(int rangeStart, int rangeEnd) throws IOExce
266279 byte [] buffer = new byte [contentLength ];
267280 in .readFully (buffer );
268281
282+ String connectionStr = headers .get ("Connection" );
283+ if (Objects .equals (connectionStr , "close" ))
284+ socket .close ();
285+
269286 return new Response (buffer , headers );
270287 }
271288
0 commit comments