curseforge-mc-1 | [mc-image-helper] 10:53:25.508 WARN : [f5d13d46-1, L:/172.23.0.2:52200 ! R:api.curseforge.com/54.230.228.118:443] The connection observed an error
curseforge-mc-1 | reactor.netty.http.client.PrematureCloseException: Connection prematurely closed BEFORE response
curseforge-mc-1 | [mc-image-helper] 10:53:25.520 ERROR : Invalid parameter provided for 'install-curseforge' command: Access to https://api.curseforge.com is forbidden or rate-limit has been exceeded. Ensure CF_API_KEY is set to a valid API key from https://console.curseforge.com/ or allow rate-limit to reset.
Same user then reported this type of failure, which seems to be a 403 not caught correctly:
curseforge-mc-1 | [mc-image-helper] 18:16:19.057 ERROR : Operator called default onErrorDropped
curseforge-mc-1 | me.itzg.helpers.http.FailedRequestException: HTTP request of https://api.curseforge.com/v1/mods/351441/files/4613538 failed with 403 Forbidden: Fetching object content
curseforge-mc-1 | at me.itzg.helpers.http.FetchBuilderBase.lambda$failedRequestMono$2(FetchBuilderBase.java:220)
curseforge-mc-1 | Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
curseforge-mc-1 | Assembly trace from producer [reactor.core.publisher.MonoMap] :
curseforge-mc-1 | reactor.core.publisher.Mono.checkpoint(Mono.java:2190)
curseforge-mc-1 | me.itzg.helpers.curseforge.CurseForgeApiClient.getModFileInfo(CurseForgeApiClient.java:223)
curseforge-mc-1 | Error has been observed at the following site(s):
curseforge-mc-1 | *__checkpoint() ⇢ at me.itzg.helpers.curseforge.CurseForgeApiClient.getModFileInfo(CurseForgeApiClient.java:223)
curseforge-mc-1 | *____checkpoint ⇢ Downloading file from modpack 351441:4613538
curseforge-mc-1 | |_ checkpoint() ⇢ at me.itzg.helpers.curseforge.CurseForgeInstaller.lambda$processModpack$15(CurseForgeInstaller.java:602)
curseforge-mc-1 | Original Stack Trace:
curseforge-mc-1 | at me.itzg.helpers.http.FetchBuilderBase.lambda$failedRequestMono$2(FetchBuilderBase.java:220)
curseforge-mc-1 | at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:132)
curseforge-mc-1 | at reactor.core.publisher.Operators$BaseFluxToMonoOperator.completePossiblyEmpty(Operators.java:2071)
curseforge-mc-1 | at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onComplete(FluxDefaultIfEmpty.java:134)
curseforge-mc-1 | at reactor.core.publisher.FluxHandle$HandleSubscriber.onComplete(FluxHandle.java:223)
curseforge-mc-1 | at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onComplete(FluxMap.java:275)
curseforge-mc-1 | at reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onComplete(FluxDoFinally.java:128)
curseforge-mc-1 | at reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.onNext(FluxHandleFuseable.java:211)
curseforge-mc-1 | at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
curseforge-mc-1 | at reactor.core.publisher.Operators$BaseFluxToMonoOperator.completePossiblyEmpty(Operators.java:2071)
curseforge-mc-1 | at reactor.core.publisher.MonoCollectList$MonoCollectListSubscriber.onComplete(MonoCollectList.java:118)
curseforge-mc-1 | at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260)
curseforge-mc-1 | at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144)
curseforge-mc-1 | at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:415)
curseforge-mc-1 | at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:445)
curseforge-mc-1 | at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:499)
curseforge-mc-1 | at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:800)
curseforge-mc-1 | at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:115)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
curseforge-mc-1 | at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:289)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
curseforge-mc-1 | at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
curseforge-mc-1 | at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
curseforge-mc-1 | at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
curseforge-mc-1 | at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
curseforge-mc-1 | at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1473)
curseforge-mc-1 | at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1336)
curseforge-mc-1 | at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1385)
curseforge-mc-1 | at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530)
curseforge-mc-1 | at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469)
curseforge-mc-1 | at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
curseforge-mc-1 | at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1407)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
curseforge-mc-1 | at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
curseforge-mc-1 | at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:918)
curseforge-mc-1 | at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
curseforge-mc-1 | at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
curseforge-mc-1 | at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
curseforge-mc-1 | at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
curseforge-mc-1 | at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
curseforge-mc-1 | at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:994)
curseforge-mc-1 | at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
curseforge-mc-1 | at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
curseforge-mc-1 | at java.base/java.lang.Thread.run(Unknown Source)
curseforge-mc-1 | [mc-image-helper] 18:16:19.069 ERROR : Invalid parameter provided for 'install-curseforge' command: Access to https://api.curseforge.com is forbidden or rate-limit has been exceeded. Ensure CF_API_KEY is set to a valid API key from https://console.curseforge.com/ or allow rate-limit to reset.
Discussed in Discord
Same user then reported this type of failure, which seems to be a 403 not caught correctly: