package main import ( "fmt" "log" "net/http" "strings" ) func main() { // pase the command line aguments registerFlags() // read the wordlist from a file wordlist, err := readWordlist(wordlist) if err != nil { log.Println(err) } // define a channel to store the wordlist in wordlistChannel := make(chan string) // define a channel in which the response gets written into from the go // routines printChannel := make(chan Response) // write the wordlist into a channel writeWordlistToChannel(wordlistChannel, wordlist) go func() { var i int for { // read a response from the printChannel for further usage response := <-printChannel // define a postfix: a string attached to the end of all printed // string set in the section filtering the status code cases var postfix string var prefix string // define what color should be used to print the individual status // codes var statusCode string switch response.StatusCode { case 200: // jump to the beginning of the line, clear the line, then print // the response prefix = "\r\033[K" statusCode = green(fmt.Sprintf("%d", response.StatusCode)) postfix = "\n" case 404: // print the status code, then clear the line and jump back to // the beginning statusCode = red(fmt.Sprintf("%d", response.StatusCode)) postfix = "\033[K\r" } // print the foo fmt.Printf("%s%.7d: %s %s%s", prefix, i, statusCode, response.FuzzWord, postfix) i++ } }() if threads > 1 { httpRequest(wordlistChannel, printChannel) } else { // loop over all the threads starting a go routine fetching a word from // the wordlistChannel, making the request and inserting the result into // the printChannel for i := 0; i < threads; i++ { go httpRequest(wordlistChannel, printChannel) } } } func httpRequest(wordlistChannel chan string, printChannel chan Response) { for { // replace the first instance of "FUZZ" in the given url by the next // value from the wordlistChannel fuzzWord := <-wordlistChannel requestURL := strings.Replace(url, "FUZZ", fuzzWord, 1) // make the http get request resp, err := http.Get("https://" + requestURL) if err != nil { log.Println(err) } // define the response var response = Response{ StatusCode: resp.StatusCode, FuzzWord: fuzzWord, } // insert the response into the print channel for further printing printChannel <- response } }