diff --git a/go.mod b/go.mod index c2ae3fc0..a02c3fe6 100644 --- a/go.mod +++ b/go.mod @@ -33,6 +33,7 @@ require ( github.com/multiformats/go-multicodec v0.9.2 github.com/multiformats/go-multihash v0.2.3 github.com/multiformats/go-varint v0.1.0 + github.com/quic-go/quic-go v0.50.1 github.com/spf13/afero v1.12.0 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 @@ -62,6 +63,7 @@ require ( github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.7.1 // indirect github.com/go-sql-driver/mysql v1.9.3 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect @@ -78,6 +80,7 @@ require ( github.com/paulmach/orb v0.11.1 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/prometheus/procfs v0.16.1 // indirect + github.com/quic-go/qpack v0.5.1 // indirect github.com/segmentio/asm v1.2.0 // indirect github.com/sethvargo/go-retry v0.3.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect diff --git a/go.sum b/go.sum index 9a680dcf..a2b7882c 100644 --- a/go.sum +++ b/go.sum @@ -538,6 +538,8 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0= github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -989,6 +991,8 @@ golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/pkg/client/spaceblobadd.go b/pkg/client/spaceblobadd.go index 4f354016..045e61bf 100644 --- a/pkg/client/spaceblobadd.go +++ b/pkg/client/spaceblobadd.go @@ -11,6 +11,7 @@ import ( "time" "github.com/multiformats/go-multihash" + "github.com/quic-go/quic-go/http3" blobcap "github.com/storacha/go-libstoracha/capabilities/blob" httpcap "github.com/storacha/go-libstoracha/capabilities/http" spaceblobcap "github.com/storacha/go-libstoracha/capabilities/space/blob" @@ -58,11 +59,31 @@ func (s *SpaceBlobAddConfig) PrecomputedSizePtr() *uint64 { return s.precomputedSizePtr } +type http3ClientWithFallback struct { + h3 http.RoundTripper + fallback http.RoundTripper +} + +func (p *http3ClientWithFallback) RoundTrip(req *http.Request) (*http.Response, error) { + if req.URL.Scheme == "https" { + resp, err := p.h3.RoundTrip(req) + if err == nil { + log.Infow("server supports http3", "url", req.URL.String()) + return resp, nil + } + log.Warnw("server doesn't support http3, using fallback (http2/1)", "error", err, "url", req.URL.String()) + } + return p.fallback.RoundTrip(req) +} + // NewSpaceBlobAddConfig creates a new SpaceBlobAddConfig with the given options. func NewSpaceBlobAddConfig(options ...SpaceBlobAddOption) *SpaceBlobAddConfig { cfg := &SpaceBlobAddConfig{ putClient: &http.Client{ - Transport: otelhttp.NewTransport(http.DefaultTransport), + Transport: otelhttp.NewTransport(&http3ClientWithFallback{ + h3: &http3.Transport{}, + fallback: http.DefaultTransport, + }), }, } for _, opt := range options {