2023-01-04 12:06:13 +08:00
|
|
|
package internal
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
|
|
|
"github.com/chainreactors/logs"
|
2024-02-10 18:23:50 +08:00
|
|
|
"github.com/chainreactors/spray/pkg"
|
2024-07-17 01:40:30 +08:00
|
|
|
"io"
|
2024-08-26 00:04:44 +08:00
|
|
|
"net/url"
|
2023-02-08 19:17:42 +08:00
|
|
|
"os"
|
2023-01-04 12:06:13 +08:00
|
|
|
)
|
|
|
|
|
2024-08-26 00:04:44 +08:00
|
|
|
func Format(opts Option) {
|
2023-02-08 19:17:42 +08:00
|
|
|
var content []byte
|
|
|
|
var err error
|
2024-08-26 00:04:44 +08:00
|
|
|
if opts.Format == "stdin" {
|
2024-07-17 01:40:30 +08:00
|
|
|
content, err = io.ReadAll(os.Stdin)
|
2023-02-08 19:17:42 +08:00
|
|
|
} else {
|
2024-08-26 00:04:44 +08:00
|
|
|
content, err = os.ReadFile(opts.Format)
|
2023-02-08 19:17:42 +08:00
|
|
|
}
|
|
|
|
|
2023-01-04 12:06:13 +08:00
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
2024-08-26 00:04:44 +08:00
|
|
|
group := make(map[string][]*pkg.Baseline)
|
2023-01-04 12:06:13 +08:00
|
|
|
for _, line := range bytes.Split(bytes.TrimSpace(content), []byte("\n")) {
|
2024-02-10 18:23:50 +08:00
|
|
|
var result pkg.Baseline
|
2023-01-04 12:06:13 +08:00
|
|
|
err := json.Unmarshal(line, &result)
|
|
|
|
if err != nil {
|
|
|
|
logs.Log.Error(err.Error())
|
|
|
|
return
|
|
|
|
}
|
2024-08-26 00:04:44 +08:00
|
|
|
result.Url, err = url.Parse(result.UrlString)
|
|
|
|
if err != nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
group[result.Url.Host] = append(group[result.Url.Host], &result)
|
2023-01-04 12:06:13 +08:00
|
|
|
}
|
2024-08-26 00:04:44 +08:00
|
|
|
|
|
|
|
// 分组
|
|
|
|
|
|
|
|
for _, results := range group {
|
|
|
|
for _, result := range results {
|
|
|
|
if !opts.Fuzzy && result.IsFuzzy {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if !opts.NoColor {
|
|
|
|
logs.Log.Info(result.ColorString())
|
|
|
|
} else {
|
|
|
|
logs.Log.Info(result.String())
|
|
|
|
}
|
2023-02-08 19:17:42 +08:00
|
|
|
}
|
2023-01-04 12:06:13 +08:00
|
|
|
}
|
|
|
|
}
|