@@ -292,10 +292,7 @@ func loadSpecFromURL(v *viper.Viper, arg string) ([]byte, error) {
292292 req .Header .Set ("Bundle-Upload-Host" , fmt .Sprintf ("%s://%s" , req .URL .Scheme , req .URL .Host ))
293293 resp , err := httpClient .Do (req )
294294 if err != nil {
295- if strings .Contains (err .Error (), "x509" ) && httpClient == http .DefaultClient && canTryInsecure (v ) {
296- httpClient = & http.Client {Transport : & http.Transport {
297- TLSClientConfig : & tls.Config {InsecureSkipVerify : true },
298- }}
295+ if shouldRetryRequest (err ) {
299296 continue
300297 }
301298 return nil , errors .Wrap (err , "execute request" )
@@ -351,7 +348,17 @@ func parseSupportBundleFromDoc(doc []byte) (*troubleshootv1beta2.SupportBundle,
351348 return nil , errors .New ("spec was not parseable as a troubleshoot kind" )
352349}
353350
354- func canTryInsecure (v * viper.Viper ) bool {
351+ func shouldRetryRequest (err error ) bool {
352+ if strings .Contains (err .Error (), "x509" ) && httpClient == http .DefaultClient && canTryInsecure () {
353+ httpClient = & http.Client {Transport : & http.Transport {
354+ TLSClientConfig : & tls.Config {InsecureSkipVerify : true },
355+ }}
356+ return true
357+ }
358+ return false
359+ }
360+
361+ func canTryInsecure () bool {
355362 if ! isatty .IsTerminal (os .Stdout .Fd ()) {
356363 return false
357364 }
@@ -543,33 +550,40 @@ func uploadSupportBundle(r *troubleshootv1beta2.ResultRequest, archivePath strin
543550 return fmt .Errorf ("cannot upload content type %s" , contentType )
544551 }
545552
546- f , err := os .Open (archivePath )
547- if err != nil {
548- return errors .Wrap (err , "open file" )
549- }
550- defer f .Close ()
553+ for {
554+ f , err := os .Open (archivePath )
555+ if err != nil {
556+ return errors .Wrap (err , "open file" )
557+ }
558+ defer f .Close ()
551559
552- fileStat , err := f .Stat ()
553- if err != nil {
554- return errors .Wrap (err , "stat file" )
555- }
560+ fileStat , err := f .Stat ()
561+ if err != nil {
562+ return errors .Wrap (err , "stat file" )
563+ }
556564
557- req , err := http .NewRequest (r .Method , r .URI , f )
558- if err != nil {
559- return errors .Wrap (err , "create request" )
560- }
561- req .ContentLength = fileStat .Size ()
562- if contentType != "" {
563- req .Header .Set ("Content-Type" , contentType )
564- }
565+ req , err := http .NewRequest (r .Method , r .URI , f )
566+ if err != nil {
567+ return errors .Wrap (err , "create request" )
568+ }
569+ req .ContentLength = fileStat .Size ()
570+ if contentType != "" {
571+ req .Header .Set ("Content-Type" , contentType )
572+ }
565573
566- resp , err := httpClient .Do (req )
567- if err != nil {
568- return errors .Wrap (err , "execute request" )
569- }
574+ resp , err := httpClient .Do (req )
575+ if err != nil {
576+ if shouldRetryRequest (err ) {
577+ continue
578+ }
579+ return errors .Wrap (err , "execute request" )
580+ }
581+
582+ if resp .StatusCode >= 300 {
583+ return fmt .Errorf ("unexpected status code %d" , resp .StatusCode )
584+ }
570585
571- if resp .StatusCode >= 300 {
572- return fmt .Errorf ("unexpected status code %d" , resp .StatusCode )
586+ break
573587 }
574588
575589 // send redaction report
@@ -583,19 +597,26 @@ func uploadSupportBundle(r *troubleshootv1beta2.ResultRequest, archivePath strin
583597 return errors .Wrap (err , "get redaction report" )
584598 }
585599
586- req , err := http .NewRequest ("PUT" , r .RedactURI , bytes .NewReader (redactBytes ))
587- if err != nil {
588- return errors .Wrap (err , "create redaction report request" )
589- }
590- req .ContentLength = int64 (len (redactBytes ))
600+ for {
601+ req , err := http .NewRequest ("PUT" , r .RedactURI , bytes .NewReader (redactBytes ))
602+ if err != nil {
603+ return errors .Wrap (err , "create redaction report request" )
604+ }
605+ req .ContentLength = int64 (len (redactBytes ))
591606
592- resp , err := httpClient .Do (req )
593- if err != nil {
594- return errors .Wrap (err , "execute redaction request" )
595- }
607+ resp , err := httpClient .Do (req )
608+ if err != nil {
609+ if shouldRetryRequest (err ) {
610+ continue
611+ }
612+ return errors .Wrap (err , "execute redaction request" )
613+ }
596614
597- if resp .StatusCode >= 300 {
598- return fmt .Errorf ("unexpected redaction status code %d" , resp .StatusCode )
615+ if resp .StatusCode >= 300 {
616+ return fmt .Errorf ("unexpected redaction status code %d" , resp .StatusCode )
617+ }
618+
619+ break
599620 }
600621 }
601622
@@ -611,20 +632,26 @@ func getExpectedContentType(uploadURL string) string {
611632}
612633
613634func callbackSupportBundleAPI (r * troubleshootv1beta2.ResultRequest , archivePath string ) error {
614- req , err := http .NewRequest (r .Method , r .URI , nil )
615- if err != nil {
616- return errors .Wrap (err , "create request" )
617- }
635+ for {
636+ req , err := http .NewRequest (r .Method , r .URI , nil )
637+ if err != nil {
638+ return errors .Wrap (err , "create request" )
639+ }
618640
619- resp , err := httpClient .Do (req )
620- if err != nil {
621- return errors .Wrap (err , "execute request" )
622- }
641+ resp , err := httpClient .Do (req )
642+ if err != nil {
643+ if shouldRetryRequest (err ) {
644+ continue
645+ }
646+ return errors .Wrap (err , "execute request" )
647+ }
623648
624- if resp .StatusCode >= 300 {
625- return fmt .Errorf ("unexpected status code %d" , resp .StatusCode )
626- }
649+ if resp .StatusCode >= 300 {
650+ return fmt .Errorf ("unexpected status code %d" , resp .StatusCode )
651+ }
627652
653+ break
654+ }
628655 return nil
629656}
630657
0 commit comments