mirror of https://github.com/Xhofe/alist
				
				
				
			
		
			
				
	
	
		
			74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
package fs
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"io"
 | 
						|
	"net/http"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/alist-org/alist/v3/internal/net"
 | 
						|
	"github.com/alist-org/alist/v3/pkg/http_range"
 | 
						|
 | 
						|
	"github.com/alist-org/alist/v3/internal/model"
 | 
						|
	"github.com/alist-org/alist/v3/pkg/utils"
 | 
						|
	"github.com/alist-org/alist/v3/server/common"
 | 
						|
	"github.com/pkg/errors"
 | 
						|
)
 | 
						|
 | 
						|
func getFileStreamFromLink(ctx context.Context, file model.Obj, link *model.Link) (*model.FileStream, error) {
 | 
						|
	var rc io.ReadCloser
 | 
						|
	var err error
 | 
						|
	mimetype := utils.GetMimeType(file.GetName())
 | 
						|
	if link.RangeReadCloser.RangeReader != nil {
 | 
						|
		rc, err = link.RangeReadCloser.RangeReader(http_range.Range{Length: -1})
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
	} else if link.ReadSeekCloser != nil {
 | 
						|
		rc = link.ReadSeekCloser
 | 
						|
	} else if link.Concurrency != 0 || link.PartSize != 0 {
 | 
						|
		down := net.NewDownloader(func(d *net.Downloader) {
 | 
						|
			d.Concurrency = link.Concurrency
 | 
						|
			d.PartSize = link.PartSize
 | 
						|
		})
 | 
						|
		req := &net.HttpRequestParams{
 | 
						|
			URL:       link.URL,
 | 
						|
			Range:     http_range.Range{Length: -1},
 | 
						|
			Size:      file.GetSize(),
 | 
						|
			HeaderRef: link.Header,
 | 
						|
		}
 | 
						|
		rc, err = down.Download(ctx, req)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		//TODO: add accelerator
 | 
						|
		req, err := http.NewRequest(http.MethodGet, link.URL, nil)
 | 
						|
		if err != nil {
 | 
						|
			return nil, errors.Wrapf(err, "failed to create request for %s", link.URL)
 | 
						|
		}
 | 
						|
		for h, val := range link.Header {
 | 
						|
			req.Header[h] = val
 | 
						|
		}
 | 
						|
		res, err := common.HttpClient().Do(req)
 | 
						|
		if err != nil {
 | 
						|
			return nil, errors.Wrapf(err, "failed to get response for %s", link.URL)
 | 
						|
		}
 | 
						|
		mt := res.Header.Get("Content-Type")
 | 
						|
		if mt != "" && strings.ToLower(mt) != "application/octet-stream" {
 | 
						|
			mimetype = mt
 | 
						|
		}
 | 
						|
		rc = res.Body
 | 
						|
	}
 | 
						|
	// if can't get mimetype, use default application/octet-stream
 | 
						|
	if mimetype == "" {
 | 
						|
		mimetype = "application/octet-stream"
 | 
						|
	}
 | 
						|
	stream := &model.FileStream{
 | 
						|
		Obj:        file,
 | 
						|
		ReadCloser: rc,
 | 
						|
		Mimetype:   mimetype,
 | 
						|
	}
 | 
						|
	return stream, nil
 | 
						|
}
 |