web_worker.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // package web_worker -- веб-воркер бота
  2. package web_worker
  3. import (
  4. "context"
  5. "fmt"
  6. "io"
  7. "log"
  8. "net/http"
  9. "strings"
  10. "sync"
  11. "time"
  12. "wartank/pkg/components/scene_net/netstat"
  13. "wartank/pkg/types"
  14. )
  15. // ВебВоркер -- объект сетевого испонлителя бота
  16. type ВебВоркер struct {
  17. botNet types.ИБотСеть
  18. conn *http.Client
  19. статистика *netstat.NetStat
  20. block sync.Mutex
  21. }
  22. // НовВебВоркер -- возвращает веб-воркера бота
  23. func НовВебВоркер(botNet types.ИБотСеть, conn *http.Client) types.ИВебВоркер {
  24. сам := &ВебВоркер{
  25. botNet: botNet,
  26. conn: conn,
  27. статистика: netstat.NewNetStat(botNet),
  28. }
  29. return сам
  30. }
  31. // Получ -- потокобезопасно возвращает список строк по ссылке
  32. func (сам *ВебВоркер) Получ(strLink string) ([]string, error) {
  33. сам.block.Lock()
  34. defer сам.block.Unlock()
  35. // if strLink == "https://wartank.ru/production/Mine" {
  36. log.Printf("ВебВоркер.Получ(): link=%v\n", strLink)
  37. // }
  38. ctxCancel, fnCancel := context.WithTimeout(сам.botNet.Кнт(), time.Second*10)
  39. defer fnCancel()
  40. запрос, ош := http.NewRequestWithContext(ctxCancel, "GET", strLink, nil)
  41. if ош != nil {
  42. сам.статистика.IncErr()
  43. return nil, fmt.Errorf("ВебВоркер.Получ(): при создании запроса, err=\n\t%w", ош)
  44. }
  45. запрос.Header.Set("User-Agent", "Mozilla Firefox 94.1")
  46. ответ, ош := сам.conn.Do(запрос)
  47. if ош != nil {
  48. сам.статистика.IncErr()
  49. return nil, fmt.Errorf("ВебВоркер.Получ(): при выполнении GET-запроса, err=\n\t%w", ош)
  50. }
  51. defer ответ.Body.Close()
  52. if ответ.StatusCode != http.StatusOK {
  53. сам.статистика.IncErr()
  54. return nil, fmt.Errorf("ВебВоркер.Получ(): code=%v, status=%v", ответ.StatusCode, ответ.Status)
  55. }
  56. binData, ош := io.ReadAll(ответ.Body)
  57. if ош != nil {
  58. сам.статистика.IncErr()
  59. return nil, fmt.Errorf("ВебВоркер.Получ(): при чтении тела ответа, err=\n\t%w", ош)
  60. }
  61. if len(binData) == 0 {
  62. сам.статистика.IncErr()
  63. return nil, fmt.Errorf("ВебВоркер.Получ(): пустое тело ответа, err=\n\t%w", ош)
  64. }
  65. lenData := len(binData) + len(strLink)
  66. сам.статистика.AddByte(lenData)
  67. lstString := strings.Split(string(binData), "\n")
  68. if len(lstString) == 0 {
  69. сам.статистика.IncErr()
  70. return nil, fmt.Errorf("ВебВоркер.Получ(): lstString is empty")
  71. }
  72. return lstString, nil
  73. }