   returned. When the `header` results in an empty list, `message` gets updated
   by removing the header.
   """
-  @spec pop_header_back(t, header) :: {value | nil, t}
-  @spec pop_header_back(t, header, any) :: {value | any, t}
+  @spec pop_header_back(t, header) :: {multiple_value | nil, t}
+  @spec pop_header_back(t, header, any) :: {multiple_value | any, t}
   def pop_header_back(message, header, default \\ nil) do
     {values, new_headers} = Map.pop(message.headers, header, [])
     case Enum.reverse(values) do

  If `header` is present in `message`, then the last value is returned.
  Otherwise, `default` is returned (which is `nil` unless specified otherwise).
  """
  @spec get_header_back(t, header) :: value | nil
  @spec get_header_back(t, header, any) :: value | any
  def get_header_back(message, header, default \\ nil) do
    case get_header(message, header, nil) do
      nil -> default

  of `header` front.  If `header` is not present in `message`, or it is an empty
  list, `initial` is inserted as the single value of `header`.
  """
  @spec update_header_front(t, header, value | nil,
                            (multiple_value -> multiple_value)) :: t
  def update_header_front(message, header, initial \\ nil, fun)
      when is_function(fun, 1) do
    update_header(message, header, List.wrap(initial),
