mirror of
https://github.com/rclone/rclone.git
synced 2024-11-07 17:14:44 +01:00
copyurl: fix copying files that return HTTP errors
This commit is contained in:
parent
e502be475a
commit
d0c65b4c5e
@ -1575,11 +1575,13 @@ func RcatSize(ctx context.Context, fdst fs.Fs, dstFileName string, in io.ReadClo
|
||||
func CopyURL(ctx context.Context, fdst fs.Fs, dstFileName string, url string) (dst fs.Object, err error) {
|
||||
client := fshttp.NewClient(fs.Config)
|
||||
resp, err := client.Get(url)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer fs.CheckClose(resp.Body, &err)
|
||||
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
|
||||
return nil, errors.Errorf("CopyURL failed: %s", resp.Status)
|
||||
}
|
||||
return RcatSize(ctx, fdst, dstFileName, resp.Body, resp.ContentLength, time.Now())
|
||||
}
|
||||
|
||||
|
@ -695,7 +695,11 @@ func TestCopyURL(t *testing.T) {
|
||||
fstest.CheckItems(t, r.Fremote)
|
||||
|
||||
// check when reading from regular HTTP server
|
||||
status := 0
|
||||
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if status != 0 {
|
||||
http.Error(w, "an error ocurred", status)
|
||||
}
|
||||
_, err := w.Write([]byte(contents))
|
||||
assert.NoError(t, err)
|
||||
})
|
||||
@ -708,6 +712,14 @@ func TestCopyURL(t *testing.T) {
|
||||
|
||||
fstest.CheckListingWithPrecision(t, r.Fremote, []fstest.Item{file1}, nil, fs.ModTimeNotSupported)
|
||||
|
||||
// Check an error is returned for a 404
|
||||
status = http.StatusNotFound
|
||||
o, err = operations.CopyURL(context.Background(), r.Fremote, "file1", ts.URL)
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "Not Found")
|
||||
assert.Nil(t, o)
|
||||
status = 0
|
||||
|
||||
// check when reading from unverified HTTPS server
|
||||
fs.Config.InsecureSkipVerify = true
|
||||
fshttp.ResetTransport()
|
||||
|
Loading…
Reference in New Issue
Block a user