lib/meilisearch/middleware/headers.ex

defmodule Meilisearch.Middleware.Headers do
  @moduledoc """
  Middleware for dealing with Meilisearch request headers.
  Ensures there is exactly one Content-Type: application/json header
  and adds the User-Agent header.
  """
  @behaviour Tesla.Middleware

  @impl Tesla.Middleware
  def call(env, next, _options) do
    env
    |> Tesla.put_header("user-agent", Meilisearch.qualified_version())
    |> ensure_single_content_type()
    |> Tesla.run(next)
  end

  # Ensure there is exactly one Content-Type: application/json header
  defp ensure_single_content_type(%Tesla.Env{headers: headers} = env) do
    # Filter out all headers that are not content-type
    filtered_headers = Enum.filter(headers, fn {header, _value} -> 
      String.downcase(header) != "content-type"
    end)
    
    # Create a new environment with only non-content-type headers
    env = %{env | headers: filtered_headers}
    
    # Add a single content-type header
    Tesla.put_header(env, "content-type", "application/json")
  end
end