nymanjens / quizmaster

A web-app for conducting a quiz over the internet
Other
233 stars 33 forks source link

java.nio.charset.MalformedInputException: Input length = 1 #23

Open remedywilliams opened 4 months ago

remedywilliams commented 4 months ago

quiz.txt Tried an "all math" quiz, and got the following. Including the YAML I used (as .txt)

user@quiz:~/release/bin$ ./server
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/home/user/release/lib/com.google.inject.guice-4.2.3.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[info] p.a.d.DefaultDBApi - Database [default] initialized
[info] p.a.d.HikariCPConnectionPool - Creating Pool for datasource 'default'
[error] a.m.q.c.ConfigModule - Error when parsing /home/user/release/conf/quiz/quiz-config.yml:

java.nio.charset.MalformedInputException: Input length = 1
    at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:350)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:179)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
    at java.base/java.io.BufferedReader.read1(BufferedReader.java:210)
    at java.base/java.io.BufferedReader.read(BufferedReader.java:287)
    at java.base/java.io.Reader.read(Reader.java:229)
    at scala.io.BufferedSource.mkString(BufferedSource.scala:94)
    at app.models.quiz.config.ConfigModule.config(ConfigModule.scala:41)
    at app.models.quiz.config.ConfigModule$$FastClassByGuice$$399b65b8.invoke(<generated>)
    at com.google.inject.internal.ProviderMethod$FastClassProviderMethod.doProvision(ProviderMethod.java:264)
    at com.google.inject.internal.ProviderMethod.doProvision(ProviderMethod.java:173)
    at com.google.inject.internal.InternalProviderInstanceBindingImpl$CyclicFactory.provision(InternalProviderInstanceBindingImpl.java:185)
    at com.google.inject.internal.InternalProviderInstanceBindingImpl$CyclicFactory.get(InternalProviderInstanceBindingImpl.java:162)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:168)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:39)
    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:42)
    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:65)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:306)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:168)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:39)
    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:62)
    at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:213)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:111)
    at com.google.inject.Guice.createInjector(Guice.java:87)
    at com.google.inject.Guice.createInjector(Guice.java:78)
    at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:201)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:155)
    at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
    at play.core.server.ProdServerStart$.start(ProdServerStart.scala:53)
    at play.core.server.ProdServerStart$.main(ProdServerStart.scala:29)
[quiz.txt](https://github.com/user-attachments/files/16053980/quiz.txt)

    at play.core.server.ProdServerStart.main(ProdServerStart.scala)
nymanjens commented 4 months ago

The issue you're having is an encoding issue.

Your file has a few non-ASCII characters:

any of them might be causing this.

I checked the encoding of your file:

$ uchardet quiz.txt 
UTF-8

which is what I would expect.

The code that is reading this is:

scala.io.Source.fromFile(configLocation).mkString

This uses an implicit encoding, potentially the default encoding of the system that is running. It would probably be better to explicitly make this UTF-8.

As a workaround, it's probably easiest if you replace the unicode characters by ASCII characters. I think π is the most likely one to cause an issue