github.com/chainreactors/fingers@v1.2.1/wappalyzer/fingerprint_headers.go (about)

     1  package wappalyzer
     2  
     3  import (
     4  	"github.com/chainreactors/fingers/common"
     5  	"strings"
     6  )
     7  
     8  // checkHeaders checks if the headers for a target match the fingerprints
     9  // and returns the matched IDs if any.
    10  func (engine *Wappalyze) checkHeaders(headers map[string]string) common.Frameworks {
    11  	technologies := engine.fingerprints.matchMapString(headers, headersPart)
    12  	return technologies
    13  }
    14  
    15  // normalizeHeaders normalizes the headers for the tech discovery on headers
    16  func (engine *Wappalyze) normalizeHeaders(headers map[string][]string) map[string]string {
    17  	normalized := make(map[string]string, len(headers))
    18  	data := getHeadersMap(headers)
    19  
    20  	for header, value := range data {
    21  		normalized[strings.ToLower(header)] = strings.ToLower(value)
    22  	}
    23  	return normalized
    24  }
    25  
    26  // GetHeadersMap returns a map[string]string of response headers
    27  func getHeadersMap(headersArray map[string][]string) map[string]string {
    28  	headers := make(map[string]string, len(headersArray))
    29  
    30  	builder := &strings.Builder{}
    31  	for key, value := range headersArray {
    32  		for i, v := range value {
    33  			builder.WriteString(v)
    34  			if i != len(value)-1 {
    35  				builder.WriteString(", ")
    36  			}
    37  		}
    38  		headerValue := builder.String()
    39  
    40  		headers[key] = headerValue
    41  		builder.Reset()
    42  	}
    43  	return headers
    44  }