12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- package main
- import (
- "bytes"
- "fmt"
- "io/ioutil"
- "log"
- "net/http"
- "net/http/httputil"
- "regexp"
- "strings"
- )
- func classifierDecide(resp *http.Response) error {
- ProxyFlow.response = resp
- ProxyFlow.seniority++
- req := ProxyFlow.request
- switch {
- case resp.StatusCode == 401:
- log.Println("401: We don't want to store credentials")
- case resp.StatusCode > 399:
- buf := bytes.NewBufferString(BlockMessage)
- resp.Body = ioutil.NopCloser(buf)
- resp.Status = "403 Forbidden"
- resp.StatusCode = 403
- resp.Header["Content-Length"] = []string{fmt.Sprint(buf.Len())}
- resp.Header.Set("Content-Encoding", "none")
- log.Println("Filing inside bad class")
- feedRequest(req, "BAD")
- default:
- log.Println("Filing inside Good Class: ", resp.StatusCode)
- feedRequest(req, "GOOD")
- }
- return nil
- }
- func sanitizeHeaders(s string) string {
- re := regexp.MustCompile(`[a-zA-Z]{3,32}|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})`)
- matched := re.FindAllString(s, -1)
- return strings.ToLower(strings.Join(matched, " "))
- }
- func feedRequest(req *http.Request, class string) {
- feed := formatRequest(req)
- feed = sanitizeHeaders(feed)
- feedarray := strings.Fields(feed)
- if class == "BAD" {
- for _, token := range feedarray {
- ControPlane.BadTokens <- token
- }
- }
- if class == "GOOD" {
- for _, token := range feedarray {
- ControPlane.GoodTokens <- token
- }
- }
- }
- func formatRequest(req *http.Request) string {
- requestDump, err := httputil.DumpRequest(req, false)
- if err != nil {
- fmt.Println(err)
- }
- return fmt.Sprintf("%s\n", requestDump)
- }
|