code: func (c *Client) NewRequest(method string, requestUrl string, body io.Reader) (*http.Request, error) {
  	relativeUrl, err := url.Parse(requestUrl)
  	if err != nil {
  		return nil, err
  	}
  	u := c.BaseURL.ResolveReference(relativeUrl)
  
  	// NewRequest uses a new value object of body
  	req, err := http.NewRequest(method, u.String(), body)
  	if err != nil {
  		return nil, err
  	}
  
  	// parse and encode Querystring Values
  	values := req.URL.Query()
  	req.URL.RawQuery = values.Encode()
  	debug("Encoded url %+v", u)
  
  	myBody := &Body{body}
  
  	if body != nil {
  		// Detect Content-type
  		req.Header.Set("Content-Type", myBody.ContentType())
  	}
  
  	// Calculate the body hash
  	req.Header.Set("X-Ops-Content-Hash", myBody.Hash())
  
  	// don't have to check this works, signRequest only emits error when signing hash is not valid, and we baked that in
  	c.Auth.SignRequest(req)
  	return req, nil
  }
docs: // NewRequest returns a signed request  suitable for the chef server