Check if host works first before assigning random host

This commit is contained in:
Ben Sarmiento
2024-01-27 00:27:28 +01:00
parent 49b524ada6
commit 4bb0234d8f
4 changed files with 32 additions and 36 deletions

View File

@@ -79,7 +79,7 @@ func (dl *Downloader) DownloadFile(directory, torrentName, fileName string, resp
}
if cfg.ShouldServeFromRclone() {
if cfg.ShouldVerifyDownloadLink() {
if !torMgr.Api.CanFetchFirstByte(unrestrict.Download) {
if !dl.client.CanFetchFirstByte(unrestrict.Download) {
log.Warnf("File %s is not available", fileName)
http.Error(resp, "File is not available", http.StatusNotFound)
return
@@ -123,7 +123,7 @@ func (dl *Downloader) DownloadLink(fileName, link string, resp http.ResponseWrit
}
if cfg.ShouldServeFromRclone() {
if cfg.ShouldVerifyDownloadLink() {
if !torMgr.Api.CanFetchFirstByte(unrestrict.Download) {
if !dl.client.CanFetchFirstByte(unrestrict.Download) {
log.Warnf("File %s is not available", fileName)
http.Error(resp, "File is not available", http.StatusNotFound)
return

View File

@@ -198,11 +198,12 @@ func (r *HTTPClient) replaceHostIfNeeded(req *http.Request) {
break
}
}
if !found {
r.log.Debug("Not found, assigning random IPv6 host")
// random IPv6 host
if !found && !r.CanFetchFirstByte(req.URL.String()) {
req.Host = r.ipv6Hosts[rand.Intn(len(r.ipv6Hosts))]
req.URL.Host = req.Host
r.log.Debugf("Host is not a valid IPv6 host, assigning a random IPv6 host: %s", req.Host)
} else {
r.ipv6Hosts = append(r.ipv6Hosts, req.Host)
}
}
@@ -267,3 +268,28 @@ func backoffFunc(attempt int) time.Duration {
}
return time.Duration(backoff) * time.Second
}
func (r *HTTPClient) CanFetchFirstByte(url string) bool {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return false
}
req.Header.Set("Range", "bytes=0-0")
resp, err := r.client.Do(req)
if err != nil {
return false
}
defer resp.Body.Close()
// If server supports partial content
if resp.StatusCode/100 == 2 {
buffer := make([]byte, 1)
_, err = resp.Body.Read(buffer)
if err == nil {
return true
}
}
return false
}

View File

@@ -308,7 +308,7 @@ func (rd *RealDebrid) UnrestrictLink(link string, checkFirstByte bool) (*Downloa
return nil, fmt.Errorf("undecodable response: %v", err)
}
if checkFirstByte && !rd.CanFetchFirstByte(response.Download) {
if checkFirstByte && !rd.client.CanFetchFirstByte(response.Download) {
return nil, fmt.Errorf("can't fetch first byte")
}

View File

@@ -1,30 +0,0 @@
package realdebrid
import (
"net/http"
)
func (rd *RealDebrid) CanFetchFirstByte(url string) bool {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return false
}
req.Header.Set("Range", "bytes=0-0")
resp, err := rd.client.Do(req)
if err != nil {
return false
}
defer resp.Body.Close()
// If server supports partial content
if resp.StatusCode/100 == 2 {
buffer := make([]byte, 1)
_, err = resp.Body.Read(buffer)
if err == nil {
return true
}
}
return false
}