classifier.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io/ioutil"
  6. "log"
  7. "net/http"
  8. "net/http/httputil"
  9. "regexp"
  10. "strings"
  11. )
  12. func classifierDecide(resp *http.Response) error {
  13. ProxyFlow.response = resp
  14. ProxyFlow.seniority++
  15. req := ProxyFlow.request
  16. switch {
  17. case resp.StatusCode == 401:
  18. log.Println("401: We don't want to store credentials")
  19. case resp.StatusCode > 399:
  20. buf := bytes.NewBufferString(BlockMessage)
  21. resp.Body = ioutil.NopCloser(buf)
  22. resp.Status = "403 Forbidden"
  23. resp.StatusCode = 403
  24. resp.Header["Content-Length"] = []string{fmt.Sprint(buf.Len())}
  25. resp.Header.Set("Content-Encoding", "none")
  26. log.Println("Filing inside bad class")
  27. feedRequest(req, "BAD")
  28. default:
  29. log.Println("Filing inside Good Class: ", resp.StatusCode)
  30. feedRequest(req, "GOOD")
  31. }
  32. return nil
  33. }
  34. func sanitizeHeaders(s string) string {
  35. re := regexp.MustCompile(`[a-zA-Z]{3,32}|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})`)
  36. matched := re.FindAllString(s, -1)
  37. return strings.ToLower(strings.Join(matched, " "))
  38. }
  39. func feedRequest(req *http.Request, class string) {
  40. feed := formatRequest(req)
  41. feed = sanitizeHeaders(feed)
  42. feedarray := strings.Fields(feed)
  43. if class == "BAD" {
  44. for _, token := range feedarray {
  45. ControPlane.BadTokens <- token
  46. }
  47. }
  48. if class == "GOOD" {
  49. for _, token := range feedarray {
  50. ControPlane.GoodTokens <- token
  51. }
  52. }
  53. }
  54. func formatRequest(req *http.Request) string {
  55. requestDump, err := httputil.DumpRequest(req, false)
  56. if err != nil {
  57. fmt.Println(err)
  58. }
  59. return fmt.Sprintf("%s\n", requestDump)
  60. }