// 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 stat *netstat.NetStat block sync.Mutex } // НовВебВоркер -- возвращает веб-воркера бота func НовВебВоркер(botNet types.ИБотСеть, conn *http.Client) types.ИВебВоркер { сам := &ВебВоркер{ botNet: botNet, conn: conn, stat: 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() req, err := http.NewRequestWithContext(ctxCancel, "GET", strLink, nil) if err != nil { сам.stat.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): при создании запроса, err=\n\t%w", err) } req.Header.Set("User-Agent", "Mozilla Firefox 94.1") httpResp, err := сам.conn.Do(req) if err != nil { сам.stat.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): при выполнении GET-запроса, err=\n\t%w", err) } defer httpResp.Body.Close() if httpResp.StatusCode != http.StatusOK { сам.stat.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): code=%v, status=%v", httpResp.StatusCode, httpResp.Status) } binData, err := io.ReadAll(httpResp.Body) if err != nil { сам.stat.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): при чтении тела ответа, err=\n\t%w", err) } if len(binData) == 0 { сам.stat.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): пустое тело ответа, err=\n\t%w", err) } lenData := len(binData) + len(strLink) сам.stat.AddByte(lenData) lstString := strings.Split(string(binData), "\n") if len(lstString) == 0 { сам.stat.IncErr() return nil, fmt.Errorf("ВебВоркер.Получ(): lstString is empty") } return lstString, nil }