From da088a54c40d3e830448537bac099adb5dad8935 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Tue, 6 Jan 2026 19:20:09 +0100 Subject: [PATCH] Replace string concatenation in a loop by strings.Builder --- gobustergcs/gobustersgcs.go | 23 ++++++++++++++++------- gobusters3/gobusters3.go | 23 ++++++++++++++++------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/gobustergcs/gobustersgcs.go b/gobustergcs/gobustersgcs.go index 8c2c1eb..13411e6 100644 --- a/gobustergcs/gobustersgcs.go +++ b/gobustergcs/gobustersgcs.go @@ -162,7 +162,8 @@ func (s *GobusterGCS) ProcessWord(ctx context.Context, word string, progress *li return nil, nil // nolint:nilnil } - extraStr := "" + var extraStrBuilder strings.Builder + if s.options.ShowFiles { // get status var result map[string]interface{} @@ -178,7 +179,10 @@ func (s *GobusterGCS) ProcessWord(ctx context.Context, word string, progress *li if err != nil { return nil, fmt.Errorf("could not parse error json: %w", err) } - extraStr = fmt.Sprintf("Error: %s (%d)", gcsError.Error.Message, gcsError.Error.Code) + _, err = fmt.Fprintf(&extraStrBuilder, "Error: %s (%d)", gcsError.Error.Message, gcsError.Error.Code) + if err != nil { + return nil, fmt.Errorf("fmt.Fprintf to strings.Builder failed: %w", err) + } } else if v, exist := result["kind"]; exist && v == "storage#objects" { // https://cloud.google.com/storage/docs/json_api/v1/status-codes // bucket listing enabled @@ -187,18 +191,23 @@ func (s *GobusterGCS) ProcessWord(ctx context.Context, word string, progress *li if err != nil { return nil, fmt.Errorf("could not parse result json: %w", err) } - extraStr = "Bucket Listing enabled: " - for _, x := range gcsListing.Items { - extraStr += fmt.Sprintf("%s (%sb), ", x.Name, x.Size) + extraStrBuilder.WriteString("Bucket Listing enabled: ") + for i, x := range gcsListing.Items { + if i > 0 { + extraStrBuilder.WriteString(", ") + } + _, err := fmt.Fprintf(&extraStrBuilder, "%s (%sb), ", x.Name, x.Size) + if err != nil { + return nil, fmt.Errorf("fmt.Fprintf to strings.Builder failed: %w", err) + } } - extraStr = strings.TrimRight(extraStr, ", ") } } r := Result{ Found: found, BucketName: word, - Status: extraStr, + Status: extraStrBuilder.String(), } return r, nil diff --git a/gobusters3/gobusters3.go b/gobusters3/gobusters3.go index e0600d6..86c4c0f 100644 --- a/gobusters3/gobusters3.go +++ b/gobusters3/gobusters3.go @@ -160,7 +160,8 @@ func (s *GobusterS3) ProcessWord(ctx context.Context, word string, progress *lib return nil, nil // nolint:nilnil } - extraStr := "" + var extraStrBuilder strings.Builder + if s.options.ShowFiles { // get status if bytes.Contains(body, []byte("")) { @@ -170,7 +171,10 @@ func (s *GobusterS3) ProcessWord(ctx context.Context, word string, progress *lib return nil, fmt.Errorf("could not parse error xml: %w", err) } // https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList - extraStr = fmt.Sprintf("Error: %s (%s)", awsError.Message, awsError.Code) + _, err = fmt.Fprintf(&extraStrBuilder, "Error: %s (%s)", awsError.Message, awsError.Code) + if err != nil { + return nil, fmt.Errorf("fmt.Fprintf to strings.Builder failed: %w", err) + } } else if bytes.Contains(body, []byte(" 0 { + extraStrBuilder.WriteString(", ") + } + _, err := fmt.Fprintf(&extraStrBuilder, "%s (%db)", x.Key, x.Size) + if err != nil { + return nil, fmt.Errorf("fmt.Fprintf to strings.Builder failed: %w", err) + } } - extraStr = strings.TrimRight(extraStr, ", ") } } r := Result{ Found: found, BucketName: word, - Status: extraStr, + Status: extraStrBuilder.String(), } return r, nil