http_worker.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // package http_worker -- веб-воркер бота
  2. package http_worker
  3. import (
  4. "context"
  5. "io"
  6. "net/http"
  7. "strings"
  8. "sync"
  9. "time"
  10. "wartank/pkg/components/arena_net/http_worker/net_stat"
  11. "wartank/pkg/components/kernel/logger"
  12. "wartank/pkg/types"
  13. )
  14. var (
  15. блок sync.Mutex
  16. )
  17. // ХттпВоркер -- объект сетевого исполнителя бота
  18. type ХттпВоркер struct {
  19. botNet types.ИБотСеть
  20. conn *http.Client
  21. статистика *net_stat.СетьСтата
  22. лог types.ИЛоггер
  23. }
  24. // НовХттпВоркер -- возвращает веб-воркера бота
  25. func НовХттпВоркер(botNet types.ИБотСеть, conn *http.Client) *ХттпВоркер {
  26. лог := logger.НовЛоггер("ХттпВоркер")
  27. лог.Инфо("НовХттпВоркер()\n")
  28. сам := &ХттпВоркер{
  29. botNet: botNet,
  30. conn: conn,
  31. статистика: net_stat.НовСетьСтата(botNet),
  32. лог: лог,
  33. }
  34. _ = types.ИХттпВоркер(сам)
  35. return сам
  36. }
  37. // Получ -- потокобезопасно возвращает список строк по ссылке
  38. func (сам *ХттпВоркер) Получ(strLink string) []string {
  39. блок.Lock()
  40. defer блок.Unlock()
  41. ctxCancel, fnCancel := context.WithTimeout(сам.botNet.Контекст(), time.Second*10)
  42. defer fnCancel()
  43. запрос, ош := http.NewRequestWithContext(ctxCancel, "GET", strLink, nil)
  44. сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при создании запроса, err=\n\t%v\n", ош)
  45. запрос.Header.Set("User-Agent", "Mozilla Firefox 106.1")
  46. ответ, ош := сам.conn.Do(запрос)
  47. сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при выполнении GET-запроса, err=\n\t%v\n", ош)
  48. defer ответ.Body.Close()
  49. сам.лог.Паника(ответ.StatusCode != http.StatusOK, "ХттпВоркер.Получ(): code=%v, status=%v", ответ.StatusCode, ответ.Status)
  50. binData, ош := io.ReadAll(ответ.Body)
  51. сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при чтении тела ответа, err=\n\t%v\n", ош)
  52. сам.лог.Паника(len(binData) == 0, "ХттпВоркер.Получ(): пустое тело ответа")
  53. lenData := len(binData) + len(strLink)
  54. сам.статистика.AddByte(lenData)
  55. lstString := strings.Split(string(binData), "\n")
  56. сам.лог.Паника(len(lstString) == 0, "ХттпВоркер.Получ(): пустая строка ответа")
  57. return lstString
  58. }