11package fields
22
33import (
4+ "archive/zip"
5+ "bytes"
46 "context"
57 "encoding/json"
68 "errors"
79 "fmt"
10+ "io"
811 "io/ioutil"
912 "net/http"
1013 "net/url"
@@ -26,12 +29,7 @@ const (
2629
2730func LoadFields (ctx context.Context , baseURL , integration , dataStream , version string ) (Fields , error ) {
2831
29- packageURL , err := makePackageURL (baseURL , integration , version )
30- if err != nil {
31- return nil , err
32- }
33-
34- fieldsContent , err := getFieldsFiles (ctx , packageURL , dataStream )
32+ fieldsContent , err := getFieldsFiles (ctx , baseURL , integration , dataStream , version )
3533 if err != nil {
3634 return nil , err
3735 }
@@ -61,42 +59,92 @@ func makePackageURL(baseURL, integration, version string) (*url.URL, error) {
6159 return u , nil
6260}
6361
64- func getFieldsFiles (ctx context.Context , packageURL * url.URL , dataStream string ) ([]byte , error ) {
65- body , err := getFromURL (ctx , packageURL .String ())
62+ func makeDownloadURL (baseURL , donwloadPath string ) (* url.URL , error ) {
63+
64+ u , err := url .Parse (baseURL )
65+ if err != nil {
66+ return nil , err
67+ }
68+
69+ u .Path = path .Join (u .Path , donwloadPath )
70+ return u , nil
71+ }
72+
73+ func getFieldsFiles (ctx context.Context , baseURL , integration , dataStream , version string ) ([]byte , error ) {
74+ packageURL , err := makePackageURL (baseURL , integration , version )
6675 if err != nil {
6776 return nil , err
6877 }
6978
70- var assetsPayload struct {
71- Assets []string `json:"assets"`
79+ r , err := getFromURL (ctx , packageURL .String ())
80+ if err != nil {
81+ return nil , err
7282 }
7383
74- if err = json .Unmarshal (body , & assetsPayload ); err != nil {
84+ var downloadPayload struct {
85+ Download string `json:"download"`
86+ }
87+
88+ body , err := ioutil .ReadAll (r )
89+ if err = json .Unmarshal (body , & downloadPayload ); err != nil {
7590 return nil , err
7691 }
7792
78- fieldsFilesURL := make ([] string , 0 )
79- prefixFieldsPath := path . Join ( packageURL . Path , dataStreamSlug , dataStream , fieldsSlug )
80- for _ , assetPath := range assetsPayload . Assets {
81- if ! strings . HasPrefix ( assetPath , prefixFieldsPath ) {
82- continue
93+ downloadURL , err := makeDownloadURL ( baseURL , downloadPayload . Download )
94+ r , err = getFromURL ( ctx , downloadURL . String () )
95+ defer func ( r io. ReadCloser ) {
96+ if r != nil {
97+ _ = r . Close ()
8398 }
99+ }(r )
100+
101+ if err != nil {
102+ return nil , err
103+ }
84104
85- fieldsFilesURL = append (fieldsFilesURL , assetPath )
105+ zipContent , err := ioutil .ReadAll (r )
106+ if err != nil {
107+ return nil , err
86108 }
87109
110+ archive , err := zip .NewReader (bytes .NewReader (zipContent ), int64 (len (zipContent )))
111+ if err != nil {
112+ return nil , err
113+ }
114+
115+ prefixFieldsPath := path .Join (fmt .Sprintf ("%s-%s" , integration , version ), dataStreamSlug , dataStream , fieldsSlug )
116+
88117 var fieldsContent string
89- for _ , fieldsFileURL := range fieldsFilesURL {
90- packageURL .Path = fieldsFileURL
118+ for _ , z := range archive .File {
119+ if z .FileInfo ().IsDir () {
120+ continue
121+ }
91122
92- body , err := getFromURL (ctx , packageURL .String ())
123+ if ! strings .HasPrefix (z .Name , prefixFieldsPath ) {
124+ continue
125+ }
126+
127+ fieldsFileName := z .Name
128+ zr , err := z .Open ()
93129 if err != nil {
130+ if zr != nil {
131+ _ = zr .Close ()
132+ }
94133 return nil , err
95134 }
96135
97- key := strings .TrimSuffix (filepath .Base (fieldsFileURL ), filepath .Ext (fieldsFileURL ))
136+ fieldsFileContent , err := ioutil .ReadAll (zr )
137+ if err != nil {
138+ if zr != nil {
139+ _ = zr .Close ()
140+ }
141+ return nil , err
142+ }
143+
144+ _ = zr .Close ()
145+ key := strings .TrimSuffix (filepath .Base (fieldsFileName ), filepath .Ext (fieldsFileName ))
98146 keyEntry := fmt .Sprintf ("- key: %s\n fields:\n " , key )
99- for _ , line := range strings .Split (string (body ), "\n " ) {
147+ for _ , line := range strings .Split (string (fieldsFileContent ), "\n " ) {
100148 keyEntry += ` ` + line + "\n "
101149 }
102150
@@ -106,7 +154,7 @@ func getFieldsFiles(ctx context.Context, packageURL *url.URL, dataStream string)
106154 return []byte (fieldsContent ), nil
107155}
108156
109- func getFromURL (ctx context.Context , srcURL string ) ([] byte , error ) {
157+ func getFromURL (ctx context.Context , srcURL string ) (io. ReadCloser , error ) {
110158
111159 req , err := http .NewRequestWithContext (ctx , "GET" , srcURL , nil )
112160
@@ -116,18 +164,21 @@ func getFromURL(ctx context.Context, srcURL string) ([]byte, error) {
116164
117165 client := & http.Client {}
118166 resp , err := client .Do (req )
119-
120167 if err != nil {
168+ if resp .Body != nil {
169+ _ = resp .Body .Close ()
170+ }
121171 return nil , err
122172 }
123173
124- defer resp .Body .Close ()
125-
126174 if resp .StatusCode != http .StatusOK {
175+ if resp .Body != nil {
176+ _ = resp .Body .Close ()
177+ }
127178 return nil , ErrNotFound
128179 }
129180
130- return ioutil . ReadAll ( resp .Body )
181+ return resp .Body , nil
131182}
132183
133184func makeManifestURL (baseURL , integration , stream , version string ) (* url.URL , error ) {
0 commit comments