diff --git a/build.sbt b/build.sbt index 18f132a..25d0e11 100644 --- a/build.sbt +++ b/build.sbt @@ -4,7 +4,7 @@ import org.scalajs.linker.interface.ModuleSplitStyle import scala.sys.process.* -lazy val projectVersion = "2.3.2" +lazy val projectVersion = "2.3.3" lazy val organizationName = "ru.trett" lazy val scala3Version = "3.7.4" lazy val circeVersion = "0.14.15" diff --git a/scripts/local-docker/docker-compose.yml b/scripts/local-docker/docker-compose.yml index c4ebbec..e6f9bc4 100644 --- a/scripts/local-docker/docker-compose.yml +++ b/scripts/local-docker/docker-compose.yml @@ -24,7 +24,7 @@ services: - host.docker.internal:host-gateway server: - image: server:2.3.2 + image: server:2.3.3 container_name: rss_server restart: always depends_on: diff --git a/server/src/main/scala/ru/trett/rss/server/services/ChannelService.scala b/server/src/main/scala/ru/trett/rss/server/services/ChannelService.scala index 2d9d4f9..63aac7e 100644 --- a/server/src/main/scala/ru/trett/rss/server/services/ChannelService.scala +++ b/server/src/main/scala/ru/trett/rss/server/services/ChannelService.scala @@ -20,6 +20,7 @@ import ru.trett.rss.server.repositories.ChannelRepository import java.time.OffsetDateTime import scala.concurrent.duration.DurationInt import scala.jdk.CollectionConverters.* +import org.http4s.Status class ChannelService(channelRepository: ChannelRepository, client: Client[IO])(using loggerFactory: LoggerFactory[IO] @@ -70,23 +71,26 @@ class ChannelService(channelRepository: ChannelRepository, client: Client[IO])(u } channel <- client - .get(url) { response => - response.body.compile.to(Array).flatMap { bytes => - Resource - .fromAutoCloseable( - IO(new XmlReader(new java.io.ByteArrayInputStream(bytes))) - ) - .use { reader => - parse(reader, link).handleErrorWith { error => - logger.error(error)( - s"Failed to parse the feed: $link" - ) *> IO.none - } - } + .get[Option[Channel]](url) { + case Status.Successful(r) => { + r.body + .through(fs2.io.toInputStream) + .evalMap(is => { + Resource + .fromAutoCloseable(IO.blocking(new XmlReader(is))) + .use { reader => parse(reader, link) } + }) + .compile + .last + .map(_.flatten) } - } - .handleErrorWith { error => - logger.error(error)(s"Failed to get channel: $link") *> IO.none + case r => + r.as[String] + .map(b => + logger.error( + s"Request failed with status ${r.status.code} and body $b" + ) + ) *> IO.pure(None) } } yield channel