http_worker.go 2.7 KB

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