@@ -8,7 +8,7 @@ import { randomUUID } from 'crypto';
88import { execFile } from 'child_process' ;
99import { BinaryInfo , InternalServerOptions } from '../../types' ;
1010import { lockFile , waitForLock } from './FileLock' ;
11- import { getInternalEnvVariable } from '../constants' ;
11+ import { getInternalEnvVariable , MySQLCDNArchivesBaseURL , MySQLCDNDownloadsBaseURL } from '../constants' ;
1212
1313function handleTarExtraction ( filepath : string , extractedPath : string ) : Promise < void > {
1414 return new Promise ( ( resolve , reject ) => {
@@ -25,12 +25,7 @@ function getFileDownloadURLRedirect(url: string): Promise<string> {
2525 const options : https . RequestOptions = {
2626 headers : {
2727 'accept' : '*/*' ,
28- 'connection' : 'keep-alive' ,
29- "user-agent" : 'mysql-memory-server-js-net/1.0.0' ,
30- // Not too sure why, but the request fails without dummy headers
31- // For the request to work, these headers have been added
32- "hello" : "hello" ,
33- "world" : "world"
28+ 'connection' : 'keep-alive'
3429 }
3530 }
3631
@@ -294,14 +289,16 @@ export function downloadBinary(binaryInfo: BinaryInfo, options: InternalServerOp
294289 //The code below only runs if the lock has been acquired by us
295290
296291 let downloadTries = 0 ;
292+ let useDownloadsURL = false ;
297293
298294 do {
295+ const downloadURL = binaryInfo . hostedByOracle ? `${ useDownloadsURL ? MySQLCDNDownloadsBaseURL : MySQLCDNArchivesBaseURL } ${ url } ` : await getFileDownloadURLRedirect ( url )
299296 try {
300297 downloadTries ++ ;
301- logger . log ( `Starting download for MySQL version ${ version } from ${ url } .` )
302- await downloadFromCDN ( url , archivePath , logger )
303- logger . log ( `Finished downloading MySQL version ${ version } from ${ url } . Now starting binary extraction.` )
304- await extractBinary ( url , archivePath , extractedPath , binaryInfo , logger )
298+ logger . log ( `Starting download for MySQL version ${ version } from ${ downloadURL } .` )
299+ await downloadFromCDN ( downloadURL , archivePath , logger )
300+ logger . log ( `Finished downloading MySQL version ${ version } from ${ downloadURL } . Now starting binary extraction.` )
301+ await extractBinary ( downloadURL , archivePath , extractedPath , binaryInfo , logger )
305302 logger . log ( `Finished extraction for version ${ version } ` )
306303 break
307304 } catch ( e ) {
@@ -315,14 +312,22 @@ export function downloadBinary(binaryInfo: BinaryInfo, options: InternalServerOp
315312 logger . error ( 'An error occurred while deleting extractedPath and/or archivePath:' , e )
316313 }
317314
318- if ( e ?. includes ?.( 'status code 404' ) ) {
319- try {
320- await releaseFunction ( )
321- } catch ( e ) {
322- logger . error ( 'An error occurred while releasing lock after receiving a 404 error on download. The error was:' , e )
315+ // If we got a 404 error while downloading a binary from Oracle and have not retried with the Downloads URL yet
316+ // then retry with the Downloads URL. Otherwise, reject.
317+ if ( e ?. includes ( 'status code 404' ) ) {
318+ if ( binaryInfo . hostedByOracle && useDownloadsURL === false ) {
319+ useDownloadsURL = true ;
320+ downloadTries --
321+ continue
322+ } else {
323+ try {
324+ await releaseFunction ( )
325+ } catch ( e ) {
326+ logger . error ( 'An error occurred while releasing lock after receiving a 404 error on download. The error was:' , e )
327+ } finally {
328+ return reject ( `Binary download for MySQL version ${ binaryInfo . version } returned status code 404 at URL ${ downloadURL } . Aborting download.` )
329+ }
323330 }
324-
325- return reject ( `Binary download for MySQL version ${ binaryInfo . version } returned status code 404. Aborting download.` )
326331 }
327332
328333 if ( downloadTries > options . downloadRetries ) {
@@ -349,19 +354,21 @@ export function downloadBinary(binaryInfo: BinaryInfo, options: InternalServerOp
349354 return resolve ( binaryPath )
350355 } else {
351356 let downloadTries = 0 ;
357+ let useDownloadsURL = false ;
352358
353359 do {
360+ const downloadURL = binaryInfo . hostedByOracle ? `${ useDownloadsURL ? MySQLCDNDownloadsBaseURL : MySQLCDNArchivesBaseURL } ${ url } ` : await getFileDownloadURLRedirect ( url )
354361 const uuid = randomUUID ( )
355362 const zipFilepath = `${ dirpath } /${ uuid } .${ fileExtension } `
356363 logger . log ( 'Binary filepath:' , zipFilepath )
357364 const extractedPath = `${ dirpath } /${ uuid } `
358365
359366 try {
360367 downloadTries ++
361- logger . log ( `Starting download for MySQL version ${ version } from ${ url } .` )
362- await downloadFromCDN ( url , zipFilepath , logger )
363- logger . log ( `Finished downloading MySQL version ${ version } from ${ url } . Now starting binary extraction.` )
364- const binaryPath = await extractBinary ( url , zipFilepath , extractedPath , binaryInfo , logger )
368+ logger . log ( `Starting download for MySQL version ${ version } from ${ downloadURL } .` )
369+ await downloadFromCDN ( downloadURL , zipFilepath , logger )
370+ logger . log ( `Finished downloading MySQL version ${ version } from ${ downloadURL } . Now starting binary extraction.` )
371+ const binaryPath = await extractBinary ( downloadURL , zipFilepath , extractedPath , binaryInfo , logger )
365372 logger . log ( `Finished extraction for version ${ version } ` )
366373 return resolve ( binaryPath )
367374 } catch ( e ) {
@@ -375,8 +382,16 @@ export function downloadBinary(binaryInfo: BinaryInfo, options: InternalServerOp
375382 logger . error ( 'An error occurred while deleting extractedPath and/or archivePath:' , e )
376383 }
377384
378- if ( e ?. includes ?.( 'status code 404' ) ) {
379- return reject ( `Binary download for MySQL version ${ version } returned status code 404. Aborting download.` )
385+ // If we got a 404 error while downloading a binary from Oracle and have not retried with the Downloads URL yet
386+ // then retry with the Downloads URL. Otherwise, reject.
387+ if ( e ?. includes ( 'status code 404' ) ) {
388+ if ( binaryInfo . hostedByOracle && useDownloadsURL === false ) {
389+ useDownloadsURL = true ;
390+ downloadTries --
391+ continue
392+ } else {
393+ return reject ( `Binary download for MySQL version ${ binaryInfo . version } returned status code 404 at URL ${ downloadURL } . Aborting download.` )
394+ }
380395 }
381396
382397 if ( downloadTries > options . downloadRetries ) {
0 commit comments