onedrive: fix "unauthenticated: Unauthenticated" errors when downloading
Before this change we would pass the Authorization header on to the
download server. This is allowed according to the docs, but on some
onedrive servers this sometimes causes an error with the text
"unauthenticated: Unauthenticated".
This is a similar fix to
dedad9f071
onedrive: fix "unauthenticated: Unauthenticated" errors when uploading
See: https://forum.rclone.org/t/cryptcheck-on-encrypted-onedrive-personal-failed-with-unauthenticated-error/44581/
This commit is contained in:
parent
48262849df
commit
aee8d909b3
1 changed files with 28 additions and 0 deletions
|
@ -2254,9 +2254,23 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.Read
|
||||||
if o.fs.opt.AVOverride {
|
if o.fs.opt.AVOverride {
|
||||||
opts.Parameters = url.Values{"AVOverride": {"1"}}
|
opts.Parameters = url.Values{"AVOverride": {"1"}}
|
||||||
}
|
}
|
||||||
|
// Make a note of the redirect target as we need to call it without Auth
|
||||||
|
var redirectReq *http.Request
|
||||||
|
opts.CheckRedirect = func(req *http.Request, via []*http.Request) error {
|
||||||
|
if len(via) >= 10 {
|
||||||
|
return errors.New("stopped after 10 redirects")
|
||||||
|
}
|
||||||
|
req.Header.Del("Authorization") // remove Auth header
|
||||||
|
redirectReq = req
|
||||||
|
return http.ErrUseLastResponse
|
||||||
|
}
|
||||||
|
|
||||||
err = o.fs.pacer.Call(func() (bool, error) {
|
err = o.fs.pacer.Call(func() (bool, error) {
|
||||||
resp, err = o.fs.srv.Call(ctx, &opts)
|
resp, err = o.fs.srv.Call(ctx, &opts)
|
||||||
|
if redirectReq != nil {
|
||||||
|
// It is a redirect which we are expecting
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
return shouldRetry(ctx, resp, err)
|
return shouldRetry(ctx, resp, err)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -2267,6 +2281,20 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.Read
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if redirectReq != nil {
|
||||||
|
err = o.fs.pacer.Call(func() (bool, error) {
|
||||||
|
resp, err = o.fs.unAuth.Do(redirectReq)
|
||||||
|
return shouldRetry(ctx, resp, err)
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
if resp != nil {
|
||||||
|
if virus := resp.Header.Get("X-Virus-Infected"); virus != "" {
|
||||||
|
err = fmt.Errorf("server reports this file is infected with a virus - use --onedrive-av-override to download anyway: %s: %w", virus, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusOK && resp.ContentLength > 0 && resp.Header.Get("Content-Range") == "" {
|
if resp.StatusCode == http.StatusOK && resp.ContentLength > 0 && resp.Header.Get("Content-Range") == "" {
|
||||||
// Overwrite size with actual size since size readings from Onedrive is unreliable.
|
// Overwrite size with actual size since size readings from Onedrive is unreliable.
|
||||||
|
|
Loading…
Reference in a new issue