2017-12-01 8 views
-2

상태 및로드 타임에 대해 http/s 엔드 포인트를 확인하는 코드 조각이 있습니다. 그런 다음 최상위 레벨 페이지 1 레벨 1 레벨을 검사 할 때마다 페이지가 참조하는 모든 항목이 200을로드하는지 확인하십시오. net/http vs curl - curl is not는 어디에서 시간 초과됩니까?

은 (내가 50 최상위 페이지를 확인하고, 각 최상위 페이지 8 개 링크의 평균이)

는 좀 goroutines (25)와 waitgroup을 통해 최고 수준의 페이지를 확인. 레벨 1 페이지에서 나는 다른 gouroutines + waitgroup을 시도한 다음 곧장 forloop (그냥 비교)를 시도했다.

이 레벨 1 페이지에서 "머리글 대기 중 CLient.Timeout 초과"오류가 많이 발생합니다. 그런 URL을 가져 와서 컬링으로 즉시 다시 시도하면, 완벽하게로드됩니다 (말림으로)

헤더의 시간 초과 페이지는 js, png, gif, html이 섞여 있습니다. 내가 수동으로 그것을 말아 때 완벽하게 작동하지만, 어떻게 든 이동에서 큰 시간을 실패하는 일반 물건.

다음은 페이지 내용을 가져 오기 위해 호출하는 함수입니다.

func (t Target) getContents(timeout int64) (string, string, string) { 
    var contents []byte 
    statusCode := "0" 
    errorLabel := "no_error" 

    tr := &http.Transport{ 
     TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 
     //  Dial: (&net.Dialer{ 
     //   Timeout: 15 * time.Second, 
     //   KeepAlive: 15 * time.Second, 
     //  }).Dial, 
     TLSHandshakeTimeout: 10 * time.Second, 
     ResponseHeaderTimeout: 10 * time.Second, 
     ExpectContinueTimeout: 1 * time.Second, 
    } 

    client := &http.Client{Transport: tr, Timeout: time.Duration(timeout) * time.Second} 

    url := t.getPageURL() 
    req, err := http.NewRequest("GET", url, nil) 
    if err != nil { 
     log.Error("Error while creating the request| ", err) 
     errorLabel = "cant_create_request" 
    } else { 
     //req.Header.Add("cache-control", "no-cache") 
     if t.Agent != "" { 
      req.Header.Set("User-Agent", t.Agent) 
     } 
     if t.SourceIP != "" { 
      req.Header.Set("X-Forwarded-For", t.SourceIP) 
     } 
     if t.Host != "" { 
      req.Header.Set("Host", t.Host) 
      req.Host = t.Host 
     } 
     response, err := client.Do(req) 
     if err != nil { 
      log.Error("Error while doing the request| ", err.Error()) 
      errorLabel = "cant_do_request" 
     } else { 
      defer response.Body.Close() 
      statusCode = strconv.Itoa(response.StatusCode) 
      contents, err = ioutil.ReadAll(response.Body) 
      if err != nil { 
       log.Error("Error while reading the response| ", err) 
       errorLabel = "cant_read_response" 

      } 
     } 
    } 
    return string(contents), statusCode, errorLabel 
} 
+2

여기까지가는 것은 충분하지 않지만 ipv6 네트워크가 깨진 경우에는 이와 같이 작동합니다. 어쨌든 다이얼러에서'DualStack'을 활성화시켜야합니다. 그러면이 문제를 해결할 수 있습니다. – JimB

+2

아, 그리고 연결을 누설하게 될'http.Transport'를 버리지 마십시오. – JimB

+1

내 사회자가 내 의견을 삭제 한 것으로 보입니다. 예, 사무실 네트워크가 잘못 구성되어 희생되었습니다. "적절한"위치에 배치되면 수출업자는 더 이상 시간 초과하지 않습니다. –

답변

0

이는 대답보다 더 많은 코멘트를해야하지만 언급 :(

은 어쩌면 당신은 각 요청에 TR 및 클라이언트를 정의하지하려고한다 충분하지 않은 점을 가지고있다.

대상에서 많은 병렬 요청을 동시에 실행하면 대상 서버와 클라이언트 시스템에 따라 문제가 발생할 수 있으며 이는 단일 테스트 요청이 정상적인 이유를 설명합니다.

마지막으로, 저는 아닙니다. 전문가가 되라.하지만 니가해야한다고 생각해. 무효은/다른 무기 호와 같은 경우

req, err := http.NewRequest("GET", url, nil) 
if err != nil { 
    log.Error("Error while creating the request| ", err) 
    errorLabel = "cant_create_request" 
} else { 
    ... 
} 
return string(contents), statusCode, errorLabel 

그것이 있어야하지 :

req, err := http.NewRequest("GET", url, nil) 
if err != nil { 
    log.Error("Error while creating the request| ", err) 
    return string(contents), statusCode, "cant_create_request" //return nil instead ? 
} 
... 
return string(contents), statusCode, errorLabel 

에 많은 "수준이 경우"읽기 오류가 발생하기 쉬운 어렵다.