Skip to content

Commit 0554c2a

Browse files
authored
Merge pull request #278 from replicatedhq/divolgin/insecure
Retry http requests on x509 errors if allowed
2 parents 09dc6b5 + 1087eb6 commit 0554c2a

File tree

1 file changed

+77
-50
lines changed

1 file changed

+77
-50
lines changed

cmd/troubleshoot/cli/run.go

Lines changed: 77 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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

613634
func 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

Comments
 (0)