mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-08-04 03:46:57 -04:00
* Support #2911. * update * update * update * update * update --------- Co-authored-by: Glavo <zjx001202@gmail.com>
This commit is contained in:
parent
90cfe3d0b7
commit
c0838468b1
@ -94,6 +94,7 @@ public abstract class FetchTask<T> extends Task<T> {
|
|||||||
break download;
|
break download;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<String> redirects = null;
|
||||||
try {
|
try {
|
||||||
beforeDownload(url);
|
beforeDownload(url);
|
||||||
|
|
||||||
@ -103,7 +104,9 @@ public abstract class FetchTask<T> extends Task<T> {
|
|||||||
if (checkETag) repository.injectConnection(conn);
|
if (checkETag) repository.injectConnection(conn);
|
||||||
|
|
||||||
if (conn instanceof HttpURLConnection) {
|
if (conn instanceof HttpURLConnection) {
|
||||||
conn = NetworkUtils.resolveConnection((HttpURLConnection) conn);
|
redirects = new ArrayList<>();
|
||||||
|
|
||||||
|
conn = NetworkUtils.resolveConnection((HttpURLConnection) conn, redirects);
|
||||||
int responseCode = ((HttpURLConnection) conn).getResponseCode();
|
int responseCode = ((HttpURLConnection) conn).getResponseCode();
|
||||||
|
|
||||||
if (responseCode == HttpURLConnection.HTTP_NOT_MODIFIED) {
|
if (responseCode == HttpURLConnection.HTTP_NOT_MODIFIED) {
|
||||||
@ -164,13 +167,13 @@ public abstract class FetchTask<T> extends Task<T> {
|
|||||||
} catch (FileNotFoundException ex) {
|
} catch (FileNotFoundException ex) {
|
||||||
failedURL = url;
|
failedURL = url;
|
||||||
exception = ex;
|
exception = ex;
|
||||||
Logging.LOG.log(Level.WARNING, "Failed to download " + url + ", not found", ex);
|
Logging.LOG.log(Level.WARNING, "Failed to download " + url + ", not found" + ((redirects == null || redirects.isEmpty()) ? "" : ", redirects: " + redirects), ex);
|
||||||
|
|
||||||
break; // we will not try this URL again
|
break; // we will not try this URL again
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
failedURL = url;
|
failedURL = url;
|
||||||
exception = ex;
|
exception = ex;
|
||||||
Logging.LOG.log(Level.WARNING, "Failed to download " + url + ", repeat times: " + (++repeat), ex);
|
Logging.LOG.log(Level.WARNING, "Failed to download " + url + ", repeat times: " + (++repeat) + ((redirects == null || redirects.isEmpty()) ? "" : ", redirects: " + redirects), ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,6 @@ import static org.jackhuang.hmcl.util.Pair.pair;
|
|||||||
import static org.jackhuang.hmcl.util.StringUtils.*;
|
import static org.jackhuang.hmcl.util.StringUtils.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author huangyuhui
|
* @author huangyuhui
|
||||||
*/
|
*/
|
||||||
public final class NetworkUtils {
|
public final class NetworkUtils {
|
||||||
@ -131,16 +130,20 @@ public final class NetworkUtils {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static HttpURLConnection resolveConnection(HttpURLConnection conn) throws IOException {
|
||||||
|
return resolveConnection(conn, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is a work-around that aims to solve problem when "Location" in
|
* This method is a work-around that aims to solve problem when "Location" in
|
||||||
* stupid server's response is not encoded.
|
* stupid server's response is not encoded.
|
||||||
*
|
*
|
||||||
* @see <a href="https://github.com/curl/curl/issues/473">Issue with libcurl</a>
|
* @see <a href="https://github.com/curl/curl/issues/473">Issue with libcurl</a>
|
||||||
* @param conn the stupid http connection.
|
* @param conn the stupid http connection.
|
||||||
* @return manually redirected http connection.
|
* @return manually redirected http connection.
|
||||||
* @throws IOException if an I/O error occurs.
|
* @throws IOException if an I/O error occurs.
|
||||||
*/
|
*/
|
||||||
public static HttpURLConnection resolveConnection(HttpURLConnection conn) throws IOException {
|
public static HttpURLConnection resolveConnection(HttpURLConnection conn, List<String> redirects) throws IOException {
|
||||||
int redirect = 0;
|
int redirect = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
conn.setUseCaches(false);
|
conn.setUseCaches(false);
|
||||||
@ -154,6 +157,9 @@ public final class NetworkUtils {
|
|||||||
String newURL = conn.getHeaderField("Location");
|
String newURL = conn.getHeaderField("Location");
|
||||||
conn.disconnect();
|
conn.disconnect();
|
||||||
|
|
||||||
|
if (redirects != null) {
|
||||||
|
redirects.add(newURL);
|
||||||
|
}
|
||||||
if (redirect > 20) {
|
if (redirect > 20) {
|
||||||
throw new IOException("Too much redirects");
|
throw new IOException("Too much redirects");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user