From 6af6415e7b2a58e9997f87d16f75f876ef40fa69 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Fri, 12 May 2023 17:07:34 +0200 Subject: [PATCH] feat: indicate if response will be streamable on routing.FindProviders --- routing/http/client/client_test.go | 6 +++--- routing/http/server/server.go | 10 ++++++++-- routing/http/server/server_test.go | 6 +++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/routing/http/client/client_test.go b/routing/http/client/client_test.go index 05ad997af..7551350d3 100644 --- a/routing/http/client/client_test.go +++ b/routing/http/client/client_test.go @@ -27,8 +27,8 @@ import ( type mockContentRouter struct{ mock.Mock } -func (m *mockContentRouter) FindProviders(ctx context.Context, key cid.Cid) (iter.ResultIter[types.ProviderResponse], error) { - args := m.Called(ctx, key) +func (m *mockContentRouter) FindProviders(ctx context.Context, key cid.Cid, stream bool) (iter.ResultIter[types.ProviderResponse], error) { + args := m.Called(ctx, key, stream) return args.Get(0).(iter.ResultIter[types.ProviderResponse]), args.Error(1) } func (m *mockContentRouter) ProvideBitswap(ctx context.Context, req *server.BitswapWriteProvideRequest) (time.Duration, error) { @@ -302,7 +302,7 @@ func TestClient_FindProviders(t *testing.T) { findProvsIter := iter.FromSlice(c.routerProvs) - router.On("FindProviders", mock.Anything, cid). + router.On("FindProviders", mock.Anything, cid, c.expStreamingResponse). Return(findProvsIter, c.routerErr) provsIter, err := client.FindProviders(ctx, cid) diff --git a/routing/http/server/server.go b/routing/http/server/server.go index d2c7f5221..1dd29277a 100644 --- a/routing/http/server/server.go +++ b/routing/http/server/server.go @@ -41,7 +41,9 @@ type FindProvidersAsyncResponse struct { } type ContentRouter interface { - FindProviders(ctx context.Context, key cid.Cid) (iter.ResultIter[types.ProviderResponse], error) + // FindProviders searches for peers who are able to provide a given key. Stream + // indicates whether or not this request will be responded as a stream. + FindProviders(ctx context.Context, key cid.Cid, stream bool) (iter.ResultIter[types.ProviderResponse], error) ProvideBitswap(ctx context.Context, req *BitswapWriteProvideRequest) (time.Duration, error) Provide(ctx context.Context, req *WriteProvideRequest) (types.ProviderResponse, error) } @@ -170,9 +172,11 @@ func (s *server) findProviders(w http.ResponseWriter, httpReq *http.Request) { var supportsNDJSON bool var supportsJSON bool + var streaming bool acceptHeaders := httpReq.Header.Values("Accept") if len(acceptHeaders) == 0 { handlerFunc = s.findProvidersJSON + streaming = false } else { for _, acceptHeader := range acceptHeaders { for _, accept := range strings.Split(acceptHeader, ",") { @@ -193,15 +197,17 @@ func (s *server) findProviders(w http.ResponseWriter, httpReq *http.Request) { if supportsNDJSON && !s.disableNDJSON { handlerFunc = s.findProvidersNDJSON + streaming = true } else if supportsJSON { handlerFunc = s.findProvidersJSON + streaming = false } else { writeErr(w, "FindProviders", http.StatusBadRequest, errors.New("no supported content types")) return } } - provIter, err := s.svc.FindProviders(httpReq.Context(), cid) + provIter, err := s.svc.FindProviders(httpReq.Context(), cid, streaming) if err != nil { writeErr(w, "FindProviders", http.StatusInternalServerError, fmt.Errorf("delegate error: %w", err)) return diff --git a/routing/http/server/server_test.go b/routing/http/server/server_test.go index 112858a63..104962487 100644 --- a/routing/http/server/server_test.go +++ b/routing/http/server/server_test.go @@ -33,7 +33,7 @@ func TestHeaders(t *testing.T) { cb, err := cid.Decode(c) require.NoError(t, err) - router.On("FindProviders", mock.Anything, cb). + router.On("FindProviders", mock.Anything, cb, false). Return(results, nil) resp, err := http.Get(serverAddr + ProvidePath + c) @@ -106,8 +106,8 @@ func TestResponse(t *testing.T) { type mockContentRouter struct{ mock.Mock } -func (m *mockContentRouter) FindProviders(ctx context.Context, key cid.Cid) (iter.ResultIter[types.ProviderResponse], error) { - args := m.Called(ctx, key) +func (m *mockContentRouter) FindProviders(ctx context.Context, key cid.Cid, stream bool) (iter.ResultIter[types.ProviderResponse], error) { + args := m.Called(ctx, key, stream) return args.Get(0).(iter.ResultIter[types.ProviderResponse]), args.Error(1) } func (m *mockContentRouter) ProvideBitswap(ctx context.Context, req *BitswapWriteProvideRequest) (time.Duration, error) {