Skip to content

Commit 48178fa

Browse files
committed
feat: update go-libipfs and switch gateway code to wrap offline errors with more general gateway ones
1 parent 4685809 commit 48178fa

5 files changed

Lines changed: 98 additions & 10 deletions

File tree

core/corehttp/gateway.go

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
package corehttp
22

33
import (
4+
"context"
5+
"errors"
46
"fmt"
57
"github.com/ipfs/go-blockservice"
8+
"github.com/ipfs/go-cid"
69
offline "github.com/ipfs/go-ipfs-exchange-offline"
710
offlineroute "github.com/ipfs/go-ipfs-routing/offline"
11+
"github.com/ipfs/go-libipfs/files"
812
"github.com/ipfs/go-namesys"
13+
iface "github.com/ipfs/interface-go-ipfs-core"
14+
"github.com/ipfs/interface-go-ipfs-core/path"
915
"github.com/ipfs/kubo/core/node"
1016
"github.com/libp2p/go-libp2p/core/routing"
17+
"io"
1118
"net"
1219
"net/http"
1320

@@ -145,9 +152,90 @@ func newGatewayAPI(n *core.IpfsNode) (gateway.API, error) {
145152
}
146153
}
147154

148-
return gateway.NewBlocksGateway(bserv, gateway.WithValueStore(vsRouting), gateway.WithNameSystem(nsys))
155+
gw, err := gateway.NewBlocksGateway(bserv, gateway.WithValueStore(vsRouting), gateway.WithNameSystem(nsys))
156+
if err != nil {
157+
return nil, err
158+
}
159+
return &offlineGatewayErrWrapper{gwimpl: gw}, nil
160+
}
161+
162+
type offlineGatewayErrWrapper struct {
163+
gwimpl gateway.API
164+
}
165+
166+
func offlineErrWrap(err error) error {
167+
if errors.Is(err, iface.ErrOffline) {
168+
return fmt.Errorf("%s : %w", err.Error(), gateway.ErrServiceUnavailable)
169+
}
170+
return err
171+
}
172+
173+
func (o *offlineGatewayErrWrapper) Get(ctx context.Context, path gateway.ImmutablePath) (gateway.ContentPathMetadata, files.Node, error) {
174+
md, n, err := o.gwimpl.Get(ctx, path)
175+
err = offlineErrWrap(err)
176+
return md, n, err
177+
}
178+
179+
func (o *offlineGatewayErrWrapper) GetRange(ctx context.Context, path gateway.ImmutablePath, ranges ...gateway.GetRange) (gateway.ContentPathMetadata, files.File, error) {
180+
md, n, err := o.gwimpl.GetRange(ctx, path, ranges...)
181+
err = offlineErrWrap(err)
182+
return md, n, err
183+
}
184+
185+
func (o *offlineGatewayErrWrapper) GetAll(ctx context.Context, path gateway.ImmutablePath) (gateway.ContentPathMetadata, files.Node, error) {
186+
md, n, err := o.gwimpl.GetAll(ctx, path)
187+
err = offlineErrWrap(err)
188+
return md, n, err
189+
}
190+
191+
func (o *offlineGatewayErrWrapper) GetBlock(ctx context.Context, path gateway.ImmutablePath) (gateway.ContentPathMetadata, files.File, error) {
192+
md, n, err := o.gwimpl.GetBlock(ctx, path)
193+
err = offlineErrWrap(err)
194+
return md, n, err
149195
}
150196

197+
func (o *offlineGatewayErrWrapper) Head(ctx context.Context, path gateway.ImmutablePath) (gateway.ContentPathMetadata, files.Node, error) {
198+
md, n, err := o.gwimpl.Head(ctx, path)
199+
err = offlineErrWrap(err)
200+
return md, n, err
201+
}
202+
203+
func (o *offlineGatewayErrWrapper) ResolvePath(ctx context.Context, path gateway.ImmutablePath) (gateway.ContentPathMetadata, error) {
204+
md, err := o.gwimpl.ResolvePath(ctx, path)
205+
err = offlineErrWrap(err)
206+
return md, err
207+
}
208+
209+
func (o *offlineGatewayErrWrapper) GetCAR(ctx context.Context, path gateway.ImmutablePath) (gateway.ContentPathMetadata, io.ReadCloser, <-chan error, error) {
210+
md, data, errCh, err := o.gwimpl.GetCAR(ctx, path)
211+
err = offlineErrWrap(err)
212+
return md, data, errCh, err
213+
}
214+
215+
func (o *offlineGatewayErrWrapper) IsCached(ctx context.Context, path path.Path) bool {
216+
return o.gwimpl.IsCached(ctx, path)
217+
}
218+
219+
func (o *offlineGatewayErrWrapper) GetIPNSRecord(ctx context.Context, c cid.Cid) ([]byte, error) {
220+
rec, err := o.gwimpl.GetIPNSRecord(ctx, c)
221+
err = offlineErrWrap(err)
222+
return rec, err
223+
}
224+
225+
func (o *offlineGatewayErrWrapper) ResolveMutable(ctx context.Context, path path.Path) (gateway.ImmutablePath, error) {
226+
imPath, err := o.gwimpl.ResolveMutable(ctx, path)
227+
err = offlineErrWrap(err)
228+
return imPath, err
229+
}
230+
231+
func (o *offlineGatewayErrWrapper) GetDNSLinkRecord(ctx context.Context, s string) (path.Path, error) {
232+
p, err := o.gwimpl.GetDNSLinkRecord(ctx, s)
233+
err = offlineErrWrap(err)
234+
return p, err
235+
}
236+
237+
var _ gateway.API = (*offlineGatewayErrWrapper)(nil)
238+
151239
var defaultPaths = []string{"/ipfs/", "/ipns/", "/api/", "/p2p/"}
152240

153241
var subdomainGatewaySpec = &gateway.Specification{

docs/examples/kubo-as-a-library/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ go 1.18
77
replace github.com/ipfs/kubo => ./../../..
88

99
require (
10-
github.com/ipfs/go-libipfs v0.6.1-0.20230228004237-36918f45f260
10+
github.com/ipfs/go-libipfs v0.6.1-0.20230307110602-8c1c4d026377
1111
github.com/ipfs/interface-go-ipfs-core v0.11.0
1212
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
1313
github.com/libp2p/go-libp2p v0.26.1
@@ -103,7 +103,7 @@ require (
103103
github.com/ipfs/go-namesys v0.7.0 // indirect
104104
github.com/ipfs/go-path v0.3.1 // indirect
105105
github.com/ipfs/go-peertaskqueue v0.8.1 // indirect
106-
github.com/ipfs/go-unixfs v0.4.3 // indirect
106+
github.com/ipfs/go-unixfs v0.4.4-0.20230301082657-5fd2773dcaaa // indirect
107107
github.com/ipfs/go-unixfsnode v1.5.2 // indirect
108108
github.com/ipfs/go-verifcid v0.0.2 // indirect
109109
github.com/ipld/edelweiss v0.2.0 // indirect

docs/examples/kubo-as-a-library/go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -569,8 +569,8 @@ github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2
569569
github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg=
570570
github.com/ipfs/go-ipns v0.3.0 h1:ai791nTgVo+zTuq2bLvEGmWP1M0A6kGTXUsgv/Yq67A=
571571
github.com/ipfs/go-ipns v0.3.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24=
572-
github.com/ipfs/go-libipfs v0.6.1-0.20230228004237-36918f45f260 h1:QRLcCoITO9ZQo2pvjmrfngqKhUKjPopBva3MVH62LT8=
573-
github.com/ipfs/go-libipfs v0.6.1-0.20230228004237-36918f45f260/go.mod h1:3OoEQs95UkqFEf65SbRDpiMwuzI+C/jTsYQaHfBbJXI=
572+
github.com/ipfs/go-libipfs v0.6.1-0.20230307110602-8c1c4d026377 h1:a5VELT+tlZJ1BoVW5bZULL41TYRnvAwPykL4fERVsJQ=
573+
github.com/ipfs/go-libipfs v0.6.1-0.20230307110602-8c1c4d026377/go.mod h1:99T3WhiWRs9vVm8Km/4ZygvULB/WyEotZcIs8hx9G7E=
574574
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
575575
github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk=
576576
github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A=
@@ -606,8 +606,8 @@ github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVzte
606606
github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU=
607607
github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw=
608608
github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o=
609-
github.com/ipfs/go-unixfs v0.4.3 h1:EdDc1sNZNFDUlo4UrVAvvAofVI5EwTnKu8Nv8mgXkWQ=
610-
github.com/ipfs/go-unixfs v0.4.3/go.mod h1:TSG7G1UuT+l4pNj91raXAPkX0BhJi3jST1FDTfQ5QyM=
609+
github.com/ipfs/go-unixfs v0.4.4-0.20230301082657-5fd2773dcaaa h1:X8DPpsI3xvdsNxrsHi+ji39rjIvfPna3+XD+iQehbNQ=
610+
github.com/ipfs/go-unixfs v0.4.4-0.20230301082657-5fd2773dcaaa/go.mod h1:TSG7G1UuT+l4pNj91raXAPkX0BhJi3jST1FDTfQ5QyM=
611611
github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s=
612612
github.com/ipfs/go-unixfsnode v1.5.2 h1:CvsiTt58W2uR5dD8bqQv+aAY0c1qolmXmSyNbPHYiew=
613613
github.com/ipfs/go-unixfsnode v1.5.2/go.mod h1:NlOebRwYx8lMCNMdhAhEspYPBD3obp7TE0LvBqHY+ks=

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ require (
4545
github.com/ipfs/go-ipld-git v0.1.1
4646
github.com/ipfs/go-ipld-legacy v0.1.1
4747
github.com/ipfs/go-ipns v0.3.0
48-
github.com/ipfs/go-libipfs v0.6.1-0.20230305054501-7af0fc6e1ec3
48+
github.com/ipfs/go-libipfs v0.6.1-0.20230307110602-8c1c4d026377
4949
github.com/ipfs/go-log v1.0.5
5050
github.com/ipfs/go-log/v2 v2.5.1
5151
github.com/ipfs/go-merkledag v0.9.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -591,8 +591,8 @@ github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2
591591
github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg=
592592
github.com/ipfs/go-ipns v0.3.0 h1:ai791nTgVo+zTuq2bLvEGmWP1M0A6kGTXUsgv/Yq67A=
593593
github.com/ipfs/go-ipns v0.3.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24=
594-
github.com/ipfs/go-libipfs v0.6.1-0.20230305054501-7af0fc6e1ec3 h1:ClmPrV+RRzVDFxfaghnRzfcg6b9JhDcOz+AcMcbGY4o=
595-
github.com/ipfs/go-libipfs v0.6.1-0.20230305054501-7af0fc6e1ec3/go.mod h1:fumWk4eRvPZx9VPWX7ucviIkqnmz0Gt5cLiBuU1e34I=
594+
github.com/ipfs/go-libipfs v0.6.1-0.20230307110602-8c1c4d026377 h1:a5VELT+tlZJ1BoVW5bZULL41TYRnvAwPykL4fERVsJQ=
595+
github.com/ipfs/go-libipfs v0.6.1-0.20230307110602-8c1c4d026377/go.mod h1:99T3WhiWRs9vVm8Km/4ZygvULB/WyEotZcIs8hx9G7E=
596596
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
597597
github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk=
598598
github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A=

0 commit comments

Comments
 (0)