code: func (c *client) getRaw(ctx context.Context, urlPath string, query url.Values) (http.Header, []byte, error) {
  	u := fmt.Sprintf("%s/%s", strings.TrimSuffix(c.BaseURL, "/"), strings.TrimPrefix(urlPath, "/"))
  	if query != nil {
  		u = fmt.Sprintf("%s?%s", u, query.Encode())
  	}
  	r, err := ctxhttp.Get(ctx, c.Client, u)
  	if err != nil {
  		return http.Header{}, []byte{}, transient.Tag.Apply(err)
  	}
  
  	defer r.Body.Close()
  	body, err := ioutil.ReadAll(r.Body)
  	if err != nil {
  		return r.Header, []byte{}, errors.Annotate(err, "could not read response body").Err()
  	}
  
  	switch r.StatusCode {
  	case http.StatusOK:
  		return r.Header, bytes.TrimPrefix(body, jsonPrefix), nil
  
  	case http.StatusTooManyRequests:
  		logging.Errorf(ctx, "Gitiles quota error.\nResponse headers: %v\nResponse body: %s",
  			r.Header, body)
  		return r.Header, body, status.Errorf(codes.ResourceExhausted, "insufficient Gitiles quota")
  
  	case http.StatusNotFound:
  		return r.Header, body, status.Errorf(codes.NotFound, "not found")
  
  	default:
  		logging.Errorf(ctx, "gitiles: unexpected HTTP %d response.\nResponse headers: %v\nResponse body: %s",
  			r.StatusCode,
  			r.Header, body)
  		return r.Header, body, status.Errorf(codes.Internal, "unexpected HTTP %d from Gitiles", r.StatusCode)
  	}
  }
docs: // getRaw makes a raw HTTP get request and returns the header and body returned.
  //
  // In case of errors, getRaw translates the generic HTTP errors to grpc errors.