| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- // package http_worker -- веб-воркер бота
- package http_worker
- import (
- "context"
- "io"
- "net/http"
- "strings"
- "sync"
- "time"
- . "wartank/app/lev0/types"
- "wartank/pkg/components/arena_net/http_worker/net_stat"
- "wartank/pkg/kernel/kernel_log"
- . "wartank/pkg/kernel/kernel_types"
- )
- var (
- блок sync.Mutex
- )
- // ХттпВоркер -- объект сетевого исполнителя бота
- type ХттпВоркер struct {
- ботСеть ИБотСеть
- хттпКлиент *http.Client
- статистика *net_stat.СетьСтата
- лог ИЯдроЛог
- }
- // НовХттпВоркер -- возвращает веб-воркера бота
- func НовХттпВоркер(конт ИБотКонтекст) *ХттпВоркер {
- лог := kernel_log.НовЛоггер("ХттпВоркер")
- лог.Инфо("НовХттпВоркер()\n")
- ботСеть := конт.Получ("ботСеть").(ИБотСеть)
- хттпКлиент := конт.Получ("хттпКлиент").(*http.Client)
- сам := &ХттпВоркер{
- ботСеть: ботСеть,
- хттпКлиент: хттпКлиент,
- статистика: net_stat.НовСетьСтата(конт),
- лог: лог,
- }
- _ = ИХттпВоркер(сам)
- return сам
- }
- // Получ -- потокобезопасно возвращает список строк по ссылке
- func (сам *ХттпВоркер) Получ(strLink string) []string {
- блок.Lock()
- defer блок.Unlock()
- ctxCancel, fnCancel := context.WithTimeout(сам.ботСеть.Контекст(), time.Second*10)
- defer fnCancel()
- запрос, ош := http.NewRequestWithContext(ctxCancel, "GET", strLink, nil)
- сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при создании запроса, err=\n\t%v\n", ош)
- запрос.Header.Set("User-Agent", "Mozilla Firefox 106.1")
- ответ, ош := сам.хттпКлиент.Do(запрос)
- сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при выполнении GET-запроса, err=\n\t%v\n", ош)
- defer ответ.Body.Close()
- сам.лог.Паника(ответ.StatusCode != http.StatusOK, "ХттпВоркер.Получ(): code=%v, status=%v", ответ.StatusCode, ответ.Status)
- binData, ош := io.ReadAll(ответ.Body)
- сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при чтении тела ответа, err=\n\t%v\n", ош)
- сам.лог.Паника(len(binData) == 0, "ХттпВоркер.Получ(): пустое тело ответа")
- lenData := len(binData) + len(strLink)
- сам.статистика.AddByte(lenData)
- lstString := strings.Split(string(binData), "\n")
- сам.лог.Паника(len(lstString) == 0, "ХттпВоркер.Получ(): пустая строка ответа")
- return lstString
- }
|