Skip to content

cf: PrematureCloseException incorrectly reported as API key forbidden or rate limit #484

Open
@itzg

Description

@itzg

Discussed in Discord

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    Status

    To do

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions