mirror of
https://github.com/projectdiscovery/nuclei.git
synced 2026-02-01 08:13:09 +08:00
108 lines
2.3 KiB
Go
108 lines
2.3 KiB
Go
package utils
|
|
|
|
import (
|
|
"net"
|
|
"strings"
|
|
|
|
"github.com/projectdiscovery/nuclei/v3/pkg/protocols/common/contextargs"
|
|
iputil "github.com/projectdiscovery/utils/ip"
|
|
urlutil "github.com/projectdiscovery/utils/url"
|
|
)
|
|
|
|
// JsonFields contains additional metadata fields for JSON output
|
|
type JsonFields struct {
|
|
Host string `json:"host,omitempty"`
|
|
Path string `json:"path,omitempty"`
|
|
Port string `json:"port,omitempty"`
|
|
Ip string `json:"ip,omitempty"`
|
|
Scheme string `json:"scheme,omitempty"`
|
|
URL string `json:"url,omitempty"`
|
|
}
|
|
|
|
// GetJsonFields returns the json fields for the request
|
|
func GetJsonFieldsFromURL(URL string) JsonFields {
|
|
parsed, err := urlutil.Parse(URL)
|
|
if err != nil {
|
|
return JsonFields{}
|
|
}
|
|
fields := JsonFields{
|
|
Port: parsed.Port(),
|
|
Scheme: parsed.Scheme,
|
|
URL: parsed.String(),
|
|
Path: parsed.Path,
|
|
}
|
|
|
|
host := parsed.Host
|
|
host, fields.Port = extractHostPort(host, fields.Port)
|
|
|
|
if fields.Port == "" {
|
|
fields.Port = "80"
|
|
if fields.Scheme == "https" {
|
|
fields.Port = "443"
|
|
}
|
|
}
|
|
if iputil.IsIP(host) {
|
|
fields.Ip = host
|
|
}
|
|
|
|
fields.Host = host
|
|
return fields
|
|
}
|
|
|
|
// GetJsonFieldsFromMetaInput returns the json fields for the request
|
|
func GetJsonFieldsFromMetaInput(ctx *contextargs.MetaInput) JsonFields {
|
|
input := ctx.Input
|
|
fields := JsonFields{
|
|
Ip: ctx.CustomIP,
|
|
}
|
|
parsed, err := urlutil.Parse(input)
|
|
if err != nil {
|
|
return fields
|
|
}
|
|
fields.Port = parsed.Port()
|
|
fields.Scheme = parsed.Scheme
|
|
fields.URL = parsed.String()
|
|
fields.Path = parsed.Path
|
|
|
|
host := parsed.Host
|
|
host, fields.Port = extractHostPort(host, fields.Port)
|
|
|
|
if fields.Port == "" {
|
|
fields.Port = "80"
|
|
if fields.Scheme == "https" {
|
|
fields.Port = "443"
|
|
}
|
|
}
|
|
if iputil.IsIP(host) {
|
|
fields.Ip = host
|
|
}
|
|
|
|
fields.Host = host
|
|
return fields
|
|
}
|
|
|
|
func extractHostPort(host, port string) (string, string) {
|
|
if !strings.Contains(host, ":") {
|
|
return host, port
|
|
}
|
|
if strings.HasPrefix(host, "[") {
|
|
if idx := strings.Index(host, "]:"); idx != -1 {
|
|
if port == "" {
|
|
port = host[idx+2:]
|
|
}
|
|
return host[1:idx], port
|
|
}
|
|
if strings.HasSuffix(host, "]") {
|
|
return host[1 : len(host)-1], port
|
|
}
|
|
return host, port
|
|
}
|
|
if h, p, err := net.SplitHostPort(host); err == nil {
|
|
if port == "" {
|
|
port = p
|
|
}
|
|
return h, port
|
|
}
|
|
return host, port
|
|
}
|