func()

in msihttpclient/msihttpclient.go [110:165]


func (client *msiHttpClient) issueRequest(operation string, url string, headers map[string]string, payload *bytes.Buffer) (int, []byte, error) {
	// add query parameter for vmId
	modifiedUrl, err := client.addVmIdQueryParameterToUrl(url)
	if err != nil {
		return -1, nil, errorhelper.AddStackToError(err)
	}
	request, err := http.NewRequest(operation, modifiedUrl, nil)
	if payload != nil && payload.Len() != 0 {
		request, err = http.NewRequest(operation, modifiedUrl, payload)
	}

	// Initialize and refresh msi as required
	err = client.refreshMsiAuthentication()
	if err != nil {
		return -1, nil, errorhelper.AddStackToError(err)
	}
	// Add authorization if required
	client.setMsiAuthenticationHeader(request)

	// add headers
	for key, value := range headers {
		request.Header.Set(key, value)
	}

	res, err := client.httpClient.Do(request)
	if err == nil && httputil.IsSuccessStatusCode(res.StatusCode) {
		// no need to retry
	} else if err == nil && res != nil {
		for i := 1; client.retryBehavior(res.StatusCode, i); i++ {
			// Initialize as refresh msi as required
			err = client.refreshMsiAuthentication()
			if err != nil {
				return -1, nil, errorhelper.AddStackToError(err)
			}
			// Add authorization if required
			client.setMsiAuthenticationHeader(request)
			res, err = client.httpClient.Do(request)
			if err != nil {
				break
			}
		}
	}

	if err != nil {
		return -1, nil, errorhelper.AddStackToError(err)
	}

	body, err := ioutil.ReadAll(res.Body)
	res.Body.Close()
	code := res.StatusCode
	if err != nil {
		return -1, nil, errorhelper.AddStackToError(err)
	}

	return code, body, nil
}