diff --git a/modules/lfs/http_client.go b/modules/lfs/http_client.go index f5ddd38b0..7ee2449b0 100644 --- a/modules/lfs/http_client.go +++ b/modules/lfs/http_client.go @@ -180,6 +180,10 @@ func (c *HTTPClient) performOperation(ctx context.Context, objects []Pointer, dc } } else { link, ok := object.Actions["download"] + if !ok { + // no actions block in response, try legacy response schema + link, ok = object.Links["download"] + } if !ok { log.Debug("%+v", object) return errors.New("missing action 'download'") diff --git a/modules/lfs/http_client_test.go b/modules/lfs/http_client_test.go index 7431132f7..ec90f5375 100644 --- a/modules/lfs/http_client_test.go +++ b/modules/lfs/http_client_test.go @@ -59,6 +59,17 @@ func lfsTestRoundtripHandler(req *http.Request) *http.Response { }, }, } + } else if strings.Contains(url, "legacy-batch-request-download") { + batchResponse = &BatchResponse{ + Transfer: "dummy", + Objects: []*ObjectResponse{ + { + Links: map[string]*Link{ + "download": {}, + }, + }, + }, + } } else if strings.Contains(url, "valid-batch-request-upload") { batchResponse = &BatchResponse{ Transfer: "dummy", @@ -229,6 +240,11 @@ func TestHTTPClientDownload(t *testing.T) { endpoint: "https://unknown-actions-map.io", expectederror: "missing action 'download'", }, + // case 11 + { + endpoint: "https://legacy-batch-request-download.io", + expectederror: "", + }, } for n, c := range cases { diff --git a/modules/lfs/shared.go b/modules/lfs/shared.go index 80f4fed00..675d2328b 100644 --- a/modules/lfs/shared.go +++ b/modules/lfs/shared.go @@ -47,6 +47,7 @@ type BatchResponse struct { type ObjectResponse struct { Pointer Actions map[string]*Link `json:"actions,omitempty"` + Links map[string]*Link `json:"_links,omitempty"` Error *ObjectError `json:"error,omitempty"` }