// package http_worker -- веб-воркер бота package http_worker import ( "context" "io" "net/http" "strings" "sync" "time" "wartank/pkg/components/arena_net/http_worker/net_stat" . "wartank/pkg/kernel/kernel_types" "wartank/pkg/kernel/logger" . "wartank/server/lev0/types" ) var ( блок sync.Mutex ) // ХттпВоркер -- объект сетевого исполнителя бота type ХттпВоркер struct { botNet ИБотСеть conn *http.Client статистика *net_stat.СетьСтата лог ИЛоггер } // НовХттпВоркер -- возвращает веб-воркера бота func НовХттпВоркер(botNet ИБотСеть, conn *http.Client) *ХттпВоркер { лог := logger.НовЛоггер("ХттпВоркер") лог.Инфо("НовХттпВоркер()\n") сам := &ХттпВоркер{ botNet: botNet, conn: conn, статистика: net_stat.НовСетьСтата(botNet), лог: лог, } _ = ИХттпВоркер(сам) return сам } // Получ -- потокобезопасно возвращает список строк по ссылке func (сам *ХттпВоркер) Получ(strLink string) []string { блок.Lock() defer блок.Unlock() ctxCancel, fnCancel := context.WithTimeout(сам.botNet.Контекст(), 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") ответ, ош := сам.conn.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 }