AZ_NODISCARD az_result az_http_request_set_query_parameter()

in sdk/src/azure/core/az_http_request.c [66:119]


AZ_NODISCARD az_result az_http_request_set_query_parameter(
    az_http_request* ref_request,
    az_span name,
    az_span value,
    bool is_value_url_encoded)
{
  _az_PRECONDITION_NOT_NULL(ref_request);
  _az_PRECONDITION_VALID_SPAN(name, 1, false);
  _az_PRECONDITION_VALID_SPAN(value, 1, false);

  // name or value can't be empty
  _az_PRECONDITION(az_span_size(name) > 0 && az_span_size(value) > 0);

  int32_t const initial_url_length = ref_request->_internal.url_length;
  az_span url_remainder = az_span_slice_to_end(ref_request->_internal.url, initial_url_length);

  // Adding query parameter. Adding +2 to required length to include extra required symbols `=`
  // and `?` or `&`.
  int32_t required_length = 2 + az_span_size(name)
      + (is_value_url_encoded ? az_span_size(value) : _az_span_url_encode_calc_length(value));

  _az_RETURN_IF_NOT_ENOUGH_SIZE(url_remainder, required_length);

  // Append either '?' or '&'
  uint8_t separator = '&';
  if (ref_request->_internal.query_start == 0)
  {
    separator = '?';

    // update QPs starting position when it's 0
    ref_request->_internal.query_start = initial_url_length + 1;
  }

  url_remainder = az_span_copy_u8(url_remainder, separator);
  url_remainder = az_span_copy(url_remainder, name);

  // Append equal sym
  url_remainder = az_span_copy_u8(url_remainder, '=');

  // Parameter value
  if (is_value_url_encoded)
  {
    az_span_copy(url_remainder, value);
  }
  else
  {
    int32_t encoding_size = 0;
    _az_RETURN_IF_FAILED(_az_span_url_encode(url_remainder, value, &encoding_size));
  }

  ref_request->_internal.url_length += required_length;

  return AZ_OK;
}