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;
}