From ecc22867330b34d8a94ec558d42e65a3d3bc07e3 Mon Sep 17 00:00:00 2001 From: Moises Macia Date: Fri, 10 Jul 2026 22:51:02 +0000 Subject: [PATCH] stop atom parsing at feed tag close --- lib/feed_reader/formats/atom.ex | 1 + lib/feed_reader/formats/atom/handler.ex | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/feed_reader/formats/atom.ex b/lib/feed_reader/formats/atom.ex index a936588..5e9ecca 100644 --- a/lib/feed_reader/formats/atom.ex +++ b/lib/feed_reader/formats/atom.ex @@ -17,6 +17,7 @@ defmodule FeedReader.Formats.Atom do limits: XMLResourceLimits.new(opts), frames: [], feed: nil, + root_closed: false, error: nil } diff --git a/lib/feed_reader/formats/atom/handler.ex b/lib/feed_reader/formats/atom/handler.ex index 2f25bb3..83316dc 100644 --- a/lib/feed_reader/formats/atom/handler.ex +++ b/lib/feed_reader/formats/atom/handler.ex @@ -91,10 +91,10 @@ defmodule FeedReader.Formats.Atom.Handler do defp close_element(%{name: "feed"}, feed, %{feed: nil} = state) do state = %{state | feed: feed} state.event_sink.({:feed, Atom.normalize_feed(state, state.opts)}) - {:ok, state} + halt_at_root(state) end - defp close_element(%{name: "feed"}, _feed, state), do: {:ok, state} + defp close_element(%{name: "feed"}, _feed, state), do: halt_at_root(state) defp close_element(frame, value, %{frames: [parent | rest]} = state) do children = Map.update(parent.children, frame.name, value, &(List.wrap(&1) ++ [value])) @@ -104,6 +104,9 @@ defmodule FeedReader.Formats.Atom.Handler do defp close_element(_frame, _value, state), do: {:ok, state} + defp halt_at_root(%{frames: []} = state), do: {:halt, %{state | root_closed: true}} + defp halt_at_root(state), do: {:ok, state} + defp render(frame) do attrs = Enum.map_join(frame.attrs, " ", fn {key, value} -> ~s(#{key}="#{value}") end) opening = if attrs == "", do: "<#{frame.name}>", else: "<#{frame.name} #{attrs}>"