class_docstr: Stores artifacts in a remote artifact storage using HTTP requests
code: def log_artifacts(self, local_dir, artifact_path=None):
      local_dir = os.path.abspath(local_dir)
      for root, _, filenames in os.walk(local_dir):
          if root == local_dir:
              artifact_dir = artifact_path
          else:
              rel_path = os.path.relpath(root, local_dir)
              rel_path = relative_path_to_artifact_path(rel_path)
              artifact_dir = (
                  posixpath.join(artifact_path, rel_path)
                  if artifact_path
                  else rel_path
              )
          for f in filenames:
              self.log_artifact(os.path.join(root, f), artifact_dir)
  
imports: import logging
  import os
  import posixpath
  import requests
  from requests import HTTPError
  from mlflow.entities import FileInfo
  from mlflow.entities.multipart_upload import CreateMultipartUploadResponse, MultipartUploadCredential, MultipartUploadPart
  from mlflow.environment_variables import MLFLOW_ENABLE_PROXY_MULTIPART_UPLOAD, MLFLOW_MULTIPART_UPLOAD_CHUNK_SIZE, MLFLOW_MULTIPART_UPLOAD_MINIMUM_FILE_SIZE
  from mlflow.exceptions import MlflowException, _UnsupportedMultipartUploadException
  from mlflow.store.artifact.artifact_repo import ArtifactRepository, MultipartUploadMixin, verify_artifact_path
  from mlflow.store.artifact.cloud_artifact_repo import _complete_futures, _compute_num_chunks
  from mlflow.tracking._tracking_service.utils import _get_default_host_creds
  from mlflow.utils.file_utils import read_chunk, relative_path_to_artifact_path
  from mlflow.utils.mime_type_utils import _guess_mime_type
  from mlflow.utils.rest_utils import augmented_raise_for_status, http_request
  from mlflow.utils.uri import validate_path_is_safe
label_desc: Use image node_id 3 for calling the HttpArtifactRepository obj's underlying member method code with example usage: obj.log_artifacts(local_dir, artifact_path) without return types