// package web_worker -- веб-воркер бота package web_worker import ( "context" "fmt" "io" "log" "net/http" "strings" "sync" "time" "wartank/pkg/components/scene_net/netstat" "wartank/pkg/types" ) // ВебВоркер -- объект сетевого испонлителя бота type ВебВоркер struct { botNet types.ИБотСеть conn *http.Client статистика *netstat.NetStat block sync.Mutex } // НовВебВоркер -- возвращает веб-воркера бота func НовВебВоркер(botNet types.ИБотСеть, conn *http.Client) types.ИВебВоркер { сам := &ВебВоркер{ botNet: botNet, conn: conn, статистика: netstat.NewNetStat(botNet), } return сам } // Получ -- потокобезопасно возвращает список строк по ссылке func (сам *ВебВоркер) Получ(strLink string) ([]string, error) { сам.block.Lock() defer сам.block.Unlock() // if strLink == "https://wartank.ru/production/Mine" { log.Printf("ВебВоркер.Получ(): link=%v\n", strLink) // } ctxCancel, fnCancel := context.WithTimeout(сам.botNet.Кнт(), time.Second*10) defer fnCancel() запрос, ош := http.NewRequestWithContext(ctxCancel, "GET", strLink, nil) if ош != nil { сам.статистика.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): при создании запроса, err=\n\t%w", ош) } запрос.Header.Set("User-Agent", "Mozilla Firefox 94.1") ответ, ош := сам.conn.Do(запрос) if ош != nil { сам.статистика.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): при выполнении GET-запроса, err=\n\t%w", ош) } defer ответ.Body.Close() if ответ.StatusCode != http.StatusOK { сам.статистика.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): code=%v, status=%v", ответ.StatusCode, ответ.Status) } binData, ош := io.ReadAll(ответ.Body) if ош != nil { сам.статистика.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): при чтении тела ответа, err=\n\t%w", ош) } if len(binData) == 0 { сам.статистика.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): пустое тело ответа, err=\n\t%w", ош) } lenData := len(binData) + len(strLink) сам.статистика.AddByte(lenData) lstString := strings.Split(string(binData), "\n") if len(lstString) == 0 { сам.статистика.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): lstString is empty") } return lstString, nil }