(w http.ResponseWriter, r *http.Request, link *model.Link, file model.Obj)
| 18 | ) |
| 19 | |
| 20 | func Proxy(w http.ResponseWriter, r *http.Request, link *model.Link, file model.Obj) error { |
| 21 | // if link.MFile != nil { |
| 22 | // attachHeader(w, file, link) |
| 23 | // http.ServeContent(w, r, file.GetName(), file.ModTime(), link.MFile) |
| 24 | // return nil |
| 25 | // } |
| 26 | |
| 27 | if link.Concurrency > 0 || link.PartSize > 0 { |
| 28 | attachHeader(w, file, link) |
| 29 | size := link.ContentLength |
| 30 | if size <= 0 { |
| 31 | size = file.GetSize() |
| 32 | } |
| 33 | rrf, _ := stream.GetRangeReaderFromLink(size, link) |
| 34 | if link.RangeReader == nil { |
| 35 | r = r.WithContext(context.WithValue(r.Context(), conf.RequestHeaderKey, r.Header)) |
| 36 | } |
| 37 | return net.ServeHTTP(w, r, file.GetName(), file.ModTime(), size, &model.RangeReadCloser{ |
| 38 | RangeReader: rrf, |
| 39 | }) |
| 40 | } |
| 41 | |
| 42 | if link.RangeReader != nil { |
| 43 | attachHeader(w, file, link) |
| 44 | size := link.ContentLength |
| 45 | if size <= 0 { |
| 46 | size = file.GetSize() |
| 47 | } |
| 48 | return net.ServeHTTP(w, r, file.GetName(), file.ModTime(), size, &model.RangeReadCloser{ |
| 49 | RangeReader: link.RangeReader, |
| 50 | }) |
| 51 | } |
| 52 | |
| 53 | //transparent proxy |
| 54 | header := net.ProcessHeader(r.Header, link.Header) |
| 55 | res, err := net.RequestHttp(r.Context(), r.Method, header, link.URL) |
| 56 | if err != nil { |
| 57 | return err |
| 58 | } |
| 59 | defer res.Body.Close() |
| 60 | |
| 61 | maps.Copy(w.Header(), res.Header) |
| 62 | w.WriteHeader(res.StatusCode) |
| 63 | if r.Method == http.MethodHead { |
| 64 | return nil |
| 65 | } |
| 66 | _, err = utils.CopyWithBuffer(w, &stream.RateLimitReader{ |
| 67 | Reader: res.Body, |
| 68 | Limiter: stream.ServerDownloadLimit, |
| 69 | Ctx: r.Context(), |
| 70 | }) |
| 71 | return err |
| 72 | } |
| 73 | func attachHeader(w http.ResponseWriter, file model.Obj, link *model.Link) { |
| 74 | fileName := file.GetName() |
| 75 | w.Header().Set("Content-Disposition", utils.GenerateContentDisposition(fileName)) |
no test coverage detected