static az_result _az_http_policy_logging_append_http_response_msg()

in sdk/src/azure/core/az_http_policy_logging.c [124:208]


static az_result _az_http_policy_logging_append_http_response_msg(
    az_http_response* ref_response,
    int64_t duration_msec,
    az_http_request const* request,
    az_span* ref_log_msg)
{
  az_span http_response_string = AZ_SPAN_FROM_STR("HTTP Response (");
  _az_RETURN_IF_NOT_ENOUGH_SIZE(*ref_log_msg, az_span_size(http_response_string));
  az_span remainder = az_span_copy(*ref_log_msg, http_response_string);

  _az_RETURN_IF_FAILED(az_span_i64toa(remainder, duration_msec, &remainder));

  az_span ms_string = AZ_SPAN_FROM_STR("ms)");
  _az_RETURN_IF_NOT_ENOUGH_SIZE(remainder, az_span_size(ms_string));
  remainder = az_span_copy(remainder, ms_string);

  if (ref_response == NULL || az_span_size(ref_response->_internal.http_response) == 0)
  {
    az_span is_empty_string = AZ_SPAN_FROM_STR(" is empty");
    _az_RETURN_IF_NOT_ENOUGH_SIZE(remainder, az_span_size(is_empty_string));
    remainder = az_span_copy(remainder, is_empty_string);

    *ref_log_msg = az_span_slice(*ref_log_msg, 0, _az_span_diff(remainder, *ref_log_msg));
    return AZ_OK;
  }

  az_span colon_separator_string = AZ_SPAN_FROM_STR(" : ");
  _az_RETURN_IF_NOT_ENOUGH_SIZE(remainder, az_span_size(colon_separator_string));
  remainder = az_span_copy(remainder, colon_separator_string);

  az_http_response_status_line status_line = { 0 };
  _az_RETURN_IF_FAILED(az_http_response_get_status_line(ref_response, &status_line));
  _az_RETURN_IF_FAILED(az_span_u64toa(remainder, (uint64_t)status_line.status_code, &remainder));

  _az_RETURN_IF_NOT_ENOUGH_SIZE(remainder, az_span_size(status_line.reason_phrase) + 1);
  remainder = az_span_copy_u8(remainder, ' ');
  remainder = az_span_copy(remainder, status_line.reason_phrase);

  az_span new_line_tab_string = AZ_SPAN_FROM_STR("\n\t");

  az_result result = AZ_OK;
  az_span header_name = { 0 };
  az_span header_value = { 0 };
  while (az_result_succeeded(
      result = az_http_response_get_next_header(ref_response, &header_name, &header_value)))
  {
    int32_t required_length = az_span_size(new_line_tab_string) + az_span_size(header_name);
    if (az_span_size(header_value) > 0)
    {
      required_length += _az_LOG_LENGTHY_VALUE_MAX_LENGTH + az_span_size(colon_separator_string);
    }

    _az_RETURN_IF_NOT_ENOUGH_SIZE(remainder, required_length);

    remainder = az_span_copy(remainder, new_line_tab_string);
    remainder = az_span_copy(remainder, header_name);

    if (az_span_size(header_value) > 0)
    {
      remainder = az_span_copy(remainder, colon_separator_string);
      remainder = _az_http_policy_logging_copy_lengthy_value(remainder, header_value);
    }
  }

  // Response payload was invalid or corrupted in some way.
  if (result != AZ_ERROR_HTTP_END_OF_HEADERS)
  {
    return result;
  }

  az_span new_lines_string = AZ_SPAN_FROM_STR("\n\n");
  az_span arrow_separator_string = AZ_SPAN_FROM_STR(" -> ");
  int32_t required_length = az_span_size(new_lines_string) + az_span_size(arrow_separator_string);
  _az_RETURN_IF_NOT_ENOUGH_SIZE(remainder, required_length);

  remainder = az_span_copy(remainder, new_lines_string);
  remainder = az_span_copy(remainder, arrow_separator_string);

  az_span append_request = remainder;
  _az_RETURN_IF_FAILED(_az_http_policy_logging_append_http_request_msg(request, &append_request));

  *ref_log_msg = az_span_slice(
      *ref_log_msg, 0, _az_span_diff(remainder, *ref_log_msg) + az_span_size(append_request));
  return AZ_OK;
}