code: func (client *Client) request(ctx context.Context, command Command) (json.RawMessage, error) {
  	params, err := client.Payload(command)
  	if err != nil {
  		return nil, err
  	}
  	signature, err := client.Sign(params)
  	if err != nil {
  		return nil, err
  	}
  	params.Add("signature", signature)
  
  	method := "GET"
  	query := params.Encode()
  	url := fmt.Sprintf("%s?%s", client.Endpoint, query)
  
  	var body io.Reader
  	// respect Internet Explorer limit of 2048
  	if len(url) > 2048 {
  		url = client.Endpoint
  		method = "POST"
  		body = strings.NewReader(query)
  	}
  
  	request, err := http.NewRequest(method, url, body)
  	if err != nil {
  		return nil, err
  	}
  	request = request.WithContext(ctx)
  	request.Header.Add("User-Agent", fmt.Sprintf("exoscale/egoscale (%v)", Version))
  
  	if method == "POST" {
  		request.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  		request.Header.Add("Content-Length", strconv.Itoa(len(query)))
  	}
  
  	resp, err := client.HTTPClient.Do(request)
  	if err != nil {
  		return nil, err
  	}
  	defer resp.Body.Close() // nolint: errcheck
  
  	contentType := resp.Header.Get("content-type")
  
  	if !strings.Contains(contentType, "application/json") {
  		return nil, fmt.Errorf(`body content-type response expected "application/json", got %q`, contentType)
  	}
  
  	text, err := client.parseResponse(resp, client.APIName(command))
  	if err != nil {
  		return nil, err
  	}
  
  	return text, nil
  }
docs: // request makes a Request while being close to the metal