package main import ( "fmt" "io/ioutil" "log" "net/http" "strings" ) // httpRequest fetches a "fuzzword" from the wordlistChannel and replaces the // string "FUZZ" in the given URL by the fetched fuzzword. A HTTP request to the // created url is then issued resulting in a response that is pushed into the // printChannel for printing. func httpRequest(channels channels, threadNr int) { for { // replace the first instance of "FUZZ" in the given url by the next // value from the wordlistChannel fuzzWord := <-channels.wordlistChannel requestURL := strings.Replace(url, "FUZZ", fuzzWord, 1) // make the http get request resp, err := http.Get(requestURL) if err != nil { if verbose == true { log.Println(err) } } else { defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { if verbose == true { log.Println(err) } } responseLines := len(strings.Split(string(body), "\n")) - 1 responseWords := len(strings.Split(string(body), " ")) responseChars := len(string(body)) // define the response var response = Response{ StatusCode: resp.StatusCode, ResponseLines: responseLines, ResponseWords: responseWords, ResponseChars: responseChars, FuzzWord: fuzzWord, } // insert the response into the print channel for further printing channels.printChannel <- response } } if channels.doneChannel != nil { channels.doneChannel <- threadNr } } func httpHandler(channels channels) { if verbose == true { log.Printf("%s Starting the http handlers", green("[i]")) } // handle one or more theads if threads <= 1 { log.Printf("%s 1 thread", yellow("[i]")) httpRequest(channels, 0) } else { if verbose == true { log.Printf("%s Starting %d threads...", yellow("[i]"), threads) } // 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(channels, i) } if verbose == true { log.Printf("%s Done starting %d threads", green("[i]"), threads) } for i := 0; i < threads; i++ { threadNum := <-channels.doneChannel if verbose == true { fmt.Printf("Thread %d done!\n", threadNum) } } } if verbose == true { log.Printf("%s Done starting the http handlers", boldGreen("[+]")) } }