| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // 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
- }
|