11package fields
22
33import (
4+ "archive/zip"
45 "context"
6+ "crypto/sha256"
7+ "encoding/hex"
58 "encoding/json"
69 "errors"
710 "fmt"
11+ "github.com/elastic/elastic-integration-corpus-generator-tool/internal/settings"
12+ "io"
813 "io/ioutil"
914 "net/http"
1015 "net/url"
16+ "os"
1117 "path"
1218 "path/filepath"
1319 "strings"
@@ -26,12 +32,7 @@ const (
2632
2733func LoadFields (ctx context.Context , baseURL , integration , dataStream , version string ) (Fields , error ) {
2834
29- packageURL , err := makePackageURL (baseURL , integration , version )
30- if err != nil {
31- return nil , err
32- }
33-
34- fieldsContent , err := getFieldsFiles (ctx , packageURL , dataStream )
35+ fieldsContent , err := getFieldsFiles (ctx , baseURL , integration , dataStream , version )
3536 if err != nil {
3637 return nil , err
3738 }
@@ -61,42 +62,99 @@ func makePackageURL(baseURL, integration, version string) (*url.URL, error) {
6162 return u , nil
6263}
6364
64- func getFieldsFiles (ctx context.Context , packageURL * url.URL , dataStream string ) ([]byte , error ) {
65- body , err := getFromURL (ctx , packageURL .String ())
65+ func makeDownloadURL (baseURL , donwloadPath string ) (* url.URL , error ) {
66+
67+ u , err := url .Parse (baseURL )
6668 if err != nil {
6769 return nil , err
6870 }
6971
70- var assetsPayload struct {
71- Assets []string `json:"assets"`
72+ u .Path = path .Join (u .Path , donwloadPath )
73+ return u , nil
74+ }
75+
76+ func getFieldsFiles (ctx context.Context , baseURL , integration , dataStream , version string ) ([]byte , error ) {
77+ packageURL , err := makePackageURL (baseURL , integration , version )
78+ if err != nil {
79+ return nil , err
7280 }
7381
74- if err = json .Unmarshal (body , & assetsPayload ); err != nil {
82+ r , err := getFromURL (ctx , packageURL .String ())
83+ if err != nil {
7584 return nil , err
7685 }
7786
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
83- }
87+ var downloadPayload struct {
88+ Download string `json:"download"`
89+ }
8490
85- fieldsFilesURL = append (fieldsFilesURL , assetPath )
91+ body , err := ioutil .ReadAll (r )
92+ if err = json .Unmarshal (body , & downloadPayload ); err != nil {
93+ return nil , err
8694 }
8795
96+ downloadURL , err := makeDownloadURL (baseURL , downloadPayload .Download )
97+ r , err = getFromURL (ctx , downloadURL .String ())
98+ if err != nil {
99+ return nil , err
100+ }
101+
102+ h := sha256 .New ()
103+ h .Write ([]byte (downloadURL .String ()))
104+ prefix := hex .EncodeToString (h .Sum (nil ))
105+
106+ packageTempDir , err := os .MkdirTemp (settings .CacheDir (), prefix )
107+ if err != nil {
108+ return nil , err
109+ }
110+ packageArchive := path .Join (packageTempDir , "package.zip" )
111+ f , err := os .Create (packageArchive )
112+ if err != nil {
113+ return nil , err
114+ }
115+
116+ _ , err = io .Copy (f , r )
117+ _ = f .Close ()
118+ if err != nil {
119+
120+ return nil , err
121+ }
122+
123+ archive , err := zip .OpenReader (packageArchive )
124+ if err != nil {
125+ return nil , err
126+ }
127+ defer func () {
128+ _ = archive .Close ()
129+ }()
130+
131+ prefixFieldsPath := path .Join (fmt .Sprintf ("%s-%s" , integration , version ), dataStreamSlug , dataStream , fieldsSlug )
132+
88133 var fieldsContent string
89- for _ , fieldsFileURL := range fieldsFilesURL {
90- packageURL .Path = fieldsFileURL
134+ for _ , z := range archive .File {
135+ if z .FileInfo ().IsDir () {
136+ continue
137+ }
138+
139+ if ! strings .HasPrefix (z .Name , prefixFieldsPath ) {
140+ continue
141+ }
91142
92- body , err := getFromURL (ctx , packageURL .String ())
143+ fieldsFileName := z .Name
144+ zr , err := z .Open ()
93145 if err != nil {
94146 return nil , err
95147 }
96148
97- key := strings .TrimSuffix (filepath .Base (fieldsFileURL ), filepath .Ext (fieldsFileURL ))
149+ fieldsFileContent , err := ioutil .ReadAll (zr )
150+ if err != nil {
151+ return nil , err
152+ }
153+
154+ _ = zr .Close ()
155+ key := strings .TrimSuffix (filepath .Base (fieldsFileName ), filepath .Ext (fieldsFileName ))
98156 keyEntry := fmt .Sprintf ("- key: %s\n fields:\n " , key )
99- for _ , line := range strings .Split (string (body ), "\n " ) {
157+ for _ , line := range strings .Split (string (fieldsFileContent ), "\n " ) {
100158 keyEntry += ` ` + line + "\n "
101159 }
102160
@@ -106,7 +164,7 @@ func getFieldsFiles(ctx context.Context, packageURL *url.URL, dataStream string)
106164 return []byte (fieldsContent ), nil
107165}
108166
109- func getFromURL (ctx context.Context , srcURL string ) ([] byte , error ) {
167+ func getFromURL (ctx context.Context , srcURL string ) (io. ReadCloser , error ) {
110168
111169 req , err := http .NewRequestWithContext (ctx , "GET" , srcURL , nil )
112170
@@ -116,18 +174,25 @@ func getFromURL(ctx context.Context, srcURL string) ([]byte, error) {
116174
117175 client := & http.Client {}
118176 resp , err := client .Do (req )
119-
120177 if err != nil {
178+ defer func (r io.ReadCloser ) {
179+ if r != nil {
180+ _ = r .Close ()
181+ }
182+ }(resp .Body )
121183 return nil , err
122184 }
123185
124- defer resp .Body .Close ()
125-
126186 if resp .StatusCode != http .StatusOK {
187+ defer func (r io.ReadCloser ) {
188+ if r != nil {
189+ _ = r .Close ()
190+ }
191+ }(resp .Body )
127192 return nil , ErrNotFound
128193 }
129194
130- return ioutil . ReadAll ( resp .Body )
195+ return resp .Body , nil
131196}
132197
133198func makeManifestURL (baseURL , integration , stream , version string ) (* url.URL , error ) {
0 commit comments