http_worker.go 2.9 KB

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