forked from TrueCloudLab/restic
rest: improve handling of HTTP2 goaway
The HTTP client can only retry HTTP2 requests after receiving a GOAWAY response if it can rewind the body. As we use a custom data type, explicitly provide an implementation of `GetBody`.
This commit is contained in:
parent
55ff4e046e
commit
8828c76f92
2 changed files with 19 additions and 0 deletions
13
changelog/unreleased/pull-5018
Normal file
13
changelog/unreleased/pull-5018
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
Bugfix: Improve HTTP2 support for rest backend
|
||||||
|
|
||||||
|
If rest-server tried to gracefully shut down an HTTP2 connection still used by the client,
|
||||||
|
this could result in the following error.
|
||||||
|
|
||||||
|
```
|
||||||
|
http2: Transport: cannot retry err [http2: Transport received Server's graceful shutdown GOAWAY] after Request.Body was written; define Request.GetBody to avoid this error
|
||||||
|
```
|
||||||
|
|
||||||
|
This has been fixed.
|
||||||
|
|
||||||
|
https://github.com/restic/restic/pull/5018
|
||||||
|
https://forum.restic.net/t/receiving-http2-goaway-messages-with-windows-restic-v0-17-0/8367
|
|
@ -143,6 +143,12 @@ func (b *Backend) Save(ctx context.Context, h backend.Handle, rd backend.RewindR
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.WithStack(err)
|
return errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
req.GetBody = func() (io.ReadCloser, error) {
|
||||||
|
if err := rd.Rewind(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return io.NopCloser(rd), nil
|
||||||
|
}
|
||||||
req.Header.Set("Content-Type", "application/octet-stream")
|
req.Header.Set("Content-Type", "application/octet-stream")
|
||||||
req.Header.Set("Accept", ContentTypeV2)
|
req.Header.Set("Accept", ContentTypeV2)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue