1717import org .springframework .core .io .buffer .DataBufferUtils ;
1818import org .springframework .http .MediaType ;
1919import org .springframework .http .client .reactive .ReactorClientHttpConnector ;
20- import org .springframework .web .reactive .function .client .ExchangeStrategies ;
2120import org .springframework .web .reactive .function .client .WebClient ;
2221import reactor .core .publisher .Mono ;
2322import reactor .netty .http .client .HttpClient ;
2625import java .io .FileInputStream ;
2726import java .io .FileOutputStream ;
2827import java .io .IOException ;
28+ import java .nio .file .Files ;
2929import java .nio .file .Path ;
30- import java .util .Comparator ;
31- import java .util .HashMap ;
32- import java .util .List ;
33- import java .util .Set ;
30+ import java .nio .file .Paths ;
31+ import java .util .*;
3432import java .util .stream .Collectors ;
3533import java .util .zip .ZipEntry ;
3634import java .util .zip .ZipInputStream ;
@@ -53,6 +51,7 @@ public class TerraformDownloader {
5351 private File tofuDownloadDirectory ;
5452 private File terraformDirectory ;
5553 private String userHomeDirectory ;
54+ private ObjectMapper objectMapper = new ObjectMapper ();
5655
5756 public TerraformDownloader () {
5857 try {
@@ -124,23 +123,16 @@ private void createDownloadTofuTempDirectory() throws IOException {
124123 private void getTerraformReleases (String terraformReleasesUrl ) throws IOException {
125124 log .info ("Downloading terraform releases list" );
126125 try {
127- WebClient webClient = WebClient .builder ()
128- .exchangeStrategies (ExchangeStrategies .builder ()
129- .codecs (configurer -> configurer .defaultCodecs ().maxInMemorySize (4 * 1024 * 1024 ))
130- .build ())
131- .baseUrl (terraformReleasesUrl )
132- .clientConnector (
133- new ReactorClientHttpConnector (
134- HttpClient .create ().proxyWithSystemProperties ())
135- )
136- .build ();
137-
138- this .terraformReleases = webClient .get ()
139- .accept (MediaType .APPLICATION_JSON )
140- .retrieve ()
141- .bodyToMono (TerraformResponse .class )
142- .block ();
143-
126+ Path path = Paths .get (FileUtils .getTempDirectory ().getAbsolutePath (), UUID .randomUUID ().toString ());
127+ String tmpdir = Files .createDirectories (path ).toFile ().getAbsolutePath () + "/terraform-releases.json" ;
128+ log .info ("Downloading terraform releases to {}" , tmpdir );
129+ File terraformReleasesFile = new File (tmpdir );
130+ downloadReleasesToFile (terraformReleasesUrl , terraformReleasesFile );
131+ log .info ("Downloaded terraform releases completed" );
132+ this .terraformReleases = objectMapper .readValue (FileUtils .readFileToString (new File (tmpdir ), "UTF-8" ), TerraformResponse .class );
133+ log .info ("Parsing terraform releases completed" );
134+ Files .deleteIfExists (terraformReleasesFile .toPath ());
135+ log .info ("Deleting temporary files completed" );
144136 } catch (Exception e ) {
145137 log .error ("Error fetching terraform releases {}" , e .getMessage ());
146138 }
@@ -151,34 +143,54 @@ private void getTerraformReleases(String terraformReleasesUrl) throws IOExceptio
151143
152144 private void getTofuReleases (String tofuReleasesUrl ) throws IOException {
153145 log .info ("Downloading tofu releases list" );
154- String tofuTemp = "" ;
155- try {
156- WebClient webClient = WebClient .builder ()
157- .exchangeStrategies (ExchangeStrategies .builder ()
158- .codecs (configurer -> configurer .defaultCodecs ().maxInMemorySize (15 * 1024 * 1024 ))
159- .build ())
160- .baseUrl (tofuReleasesUrl )
161- .clientConnector (
162- new ReactorClientHttpConnector (
163- HttpClient .create ().proxyWithSystemProperties ())
164- )
165- .build ();
166146
167- tofuTemp = webClient .get ()
168- .accept (MediaType .APPLICATION_JSON )
169- .retrieve ()
170- .bodyToMono (String .class )
171- .block ();
172- ObjectMapper objectMapper = new ObjectMapper ();
147+ Path path = Paths .get (FileUtils .getTempDirectory ().getAbsolutePath (), UUID .randomUUID ().toString ());
148+ String tmpdir = Files .createDirectories (path ).toFile ().getAbsolutePath () + "/tofu-releases.json" ;
149+ log .info ("Downloading tofu releases to {}" , tmpdir );
150+ File tofuReleasesFile = new File (tmpdir );
173151
174- this .tofuReleases = objectMapper .readValue (tofuTemp ,
152+ try {
153+ downloadReleasesToFile (tofuReleasesUrl , tofuReleasesFile );
154+ log .info ("Downloaded tofu releases completed" );
155+ this .tofuReleases = objectMapper .readValue (FileUtils .readFileToString (new File (tmpdir ), "UTF-8" ),
175156 objectMapper .getTypeFactory ().constructCollectionType (List .class , TofuRelease .class ));
157+
158+ log .info ("Parsing tofu releases completed" );
159+ Files .deleteIfExists (tofuReleasesFile .toPath ());
160+ log .info ("Deleting temporary tofu files completed" );
161+
176162 } catch (Exception e ) {
177- log .error ("Error fetching terraform releases {}" , e .getMessage ());
163+ log .error ("Error fetching tofu releases {}" , e .getMessage ());
178164 }
179165 log .info ("Found {} tofu releases" , this .tofuReleases .size ());
180166 }
181167
168+ private static void downloadReleasesToFile (String releasesUrl , File releasesFile ) {
169+ WebClient webClient = WebClient .builder ()
170+ .clientConnector (new ReactorClientHttpConnector (
171+ HttpClient .create ()
172+ .followRedirect (true )
173+ .proxyWithSystemProperties ()
174+ ))
175+ .defaultHeaders (h -> {
176+ h .add ("User-Agent" , "releases-downloader" );
177+ h .setAccept (List .of (MediaType .APPLICATION_JSON ));
178+ })
179+ .build ();
180+
181+ webClient .get ()
182+ .uri (releasesUrl )
183+ .retrieve ()
184+ .onStatus (
185+ status -> !status .is2xxSuccessful (),
186+ clientResponse -> clientResponse .createException ().flatMap (Mono ::error )
187+ )
188+ .bodyToFlux (DataBuffer .class )
189+ .as (dataBufferFlux -> DataBufferUtils .write (dataBufferFlux , releasesFile .toPath () ))
190+ .then ()
191+ .block ();
192+ }
193+
182194 private String downloadFileOrReturnPathIfAlreadyExists (String fileName , String zipReleaseUrl , String version ,
183195 boolean tofu ) throws IOException {
184196 String downloadPath = tofu ? TOFU_DOWNLOAD_DIRECTORY : TERRAFORM_DOWNLOAD_DIRECTORY ;
0 commit comments