func (this *Settings) Load(fileName string) error { file, e := ioutil.ReadFile(fileName); if e != nil { return e } e = json.Unmarshal(file, this); if e != nil { return e } return nil }
type Status struct { IsError bool IsWarning bool IsSuccess bool Duration *time.Duration Size int64 IsFinished bool Error *error FinishedAt *time.Time StartedAt *time.Time }
func StartThread(setts *settings.Settings, source *Source, c chan *Status){ iteration := setts.Threads.Iteration // key, value header := map[string]string{} for _, s := range setts.Request.Headers { keyValue := regexp.MustCompile("=").Split(s, -1) header[keyValue[0]] = keyValue[1] } sourceLen := len(*source) // URL url := setts.Remote.Protocol + "://" + setts.Remote.Host + ":" + strconv.Itoa(setts.Remote.Port) + setts.Request.Uri if iteration < 0 { iteration = sourceLen } index := -1 for ;iteration > 0; iteration-- { status := &Status{false, false, false, nil, 0, false, nil, nil, nil} index++ if index >= sourceLen { if setts.Request.Source.RestartOnEOF { index = 0 } else { index-- } } // var s *bytes.Buffer if strings.ToLower(setts.Request.Method) != "get" { s = bytes.NewBuffer((*source)[index]) } // HTTP req, err := http.NewRequest(setts.Request.Method, url, s); if err != nil { status.Error = &err status.IsError = true c <- status break } // for k,v := range header { req.Header.Set(k,v) } // startTime := time.Now() // res, err := http.DefaultClient.Do(req); if err != nil { status.Error = &err status.IsError = true c <- status break } endTime := time.Now() // status.FinishedAt = &endTime status.StartedAt = &startTime diff := endTime.Sub(startTime) // 3 (Error, Warning, Success) checkStatus(setts.Levels, res, diff, status) // ioutil.ReadAll(res.Body) res.Body.Close() // c <- status // , if setts.Threads.Delay > 0 { sleep := time.Duration(setts.Threads.Delay) time.Sleep(time.Millisecond * sleep) } } // status := &Status{false, false, false, nil, 0, true, nil, nil, nil} c <- status }
c := make(chan *Status, iteration * setts.Threads.Count) for i := 0; i < setts.Threads.Count; i++{ go StartThread(&setts, source, c) } for i := iteration * setts.Threads.Count; i>0 ; i-- { counter(<-c) } fmt.Println("Completed")
Source: https://habr.com/ru/post/187212/
All Articles