SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:47.820 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.821 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.821 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.825 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/appmanifest.json. 2025-09-19 14:12:47.825 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/appmanifest.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:47.827 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.827 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/appmanifest.json. 2025-09-19 14:12:47.827 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.829 [eventLoopGroupProxy-7-1 @call-handler#26] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:47.832 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.833 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.833 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.834 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.834 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/appmanifest.json. 2025-09-19 14:12:47.834 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.837 [eventLoopGroupProxy-7-1 @call-handler#29] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:47.839 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.839 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.839 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/appmanifest.json 2025-09-19 14:12:47.842 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/appmanifest.json to class kotlinx.io.Source 2025-09-19 14:12:47.878 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/app.html 2025-09-19 14:12:47.878 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/app.html. 2025-09-19 14:12:47.879 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/app.html 2025-09-19 14:12:47.882 [eventLoopGroupProxy-7-1 @call-handler#34] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:47.886 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/app.html 2025-09-19 14:12:47.887 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/app.html 2025-09-19 14:12:47.887 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/app.html 2025-09-19 14:12:47.888 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/app.html. 2025-09-19 14:12:47.888 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/app.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:47.888 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/app.html 2025-09-19 14:12:47.888 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/app.html. 2025-09-19 14:12:47.888 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/app.html 2025-09-19 14:12:47.890 [eventLoopGroupProxy-7-1 @call-handler#40] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:47.892 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/app.html 2025-09-19 14:12:47.893 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/app.html 2025-09-19 14:12:47.893 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/app.html 2025-09-19 14:12:47.893 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.893 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/index.json. 2025-09-19 14:12:47.893 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/index.json 2025-09-19 14:12:47.895 [eventLoopGroupProxy-7-1 @call-handler#43] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:47.897 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.897 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/index.json 2025-09-19 14:12:47.897 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.897 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/index.json. 2025-09-19 14:12:47.898 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/index.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:47.898 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.898 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/index.json. 2025-09-19 14:12:47.898 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/index.json 2025-09-19 14:12:47.900 [eventLoopGroupProxy-7-1 @call-handler#49] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:47.901 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.901 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/index.json 2025-09-19 14:12:47.901 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.902 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.902 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/index.json. 2025-09-19 14:12:47.902 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/index.json 2025-09-19 14:12:47.904 [eventLoopGroupProxy-7-1 @call-handler#52] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:47.905 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.905 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/index.json 2025-09-19 14:12:47.905 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.905 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/index.json. 2025-09-19 14:12:47.906 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/index.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:47.906 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.906 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/index.json. 2025-09-19 14:12:47.906 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/index.json 2025-09-19 14:12:47.908 [eventLoopGroupProxy-7-1 @call-handler#58] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:47.909 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.909 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/index.json 2025-09-19 14:12:47.910 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.910 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.910 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/index.json. 2025-09-19 14:12:47.910 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/index.json 2025-09-19 14:12:47.912 [eventLoopGroupProxy-7-1 @call-handler#61] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:47.914 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.915 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/index.json 2025-09-19 14:12:47.915 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/index.json 2025-09-19 14:12:47.915 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/index.json to class kotlinx.io.Source WARN: http://localhost:42767/resources/index.json Navigation link to grade1/grade1.json SHOULD contain an icon DEBUG: http://localhost:42767/resources/index.json Skipping link as it has already been visited: http://localhost:42767/resources/index.json 2025-09-19 14:12:48.337 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.337 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/grade1.json. 2025-09-19 14:12:48.337 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.339 [eventLoopGroupProxy-7-1 @call-handler#66] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.340 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.341 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.341 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.341 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/grade1.json. 2025-09-19 14:12:48.341 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/grade1.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:48.341 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.341 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/grade1.json. 2025-09-19 14:12:48.341 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.342 [eventLoopGroupProxy-7-1 @call-handler#72] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.344 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.344 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.344 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.344 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.344 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/grade1.json. 2025-09-19 14:12:48.344 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.345 [eventLoopGroupProxy-7-1 @call-handler#75] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.346 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.346 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.346 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.346 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/grade1.json to class kotlinx.io.Source DEBUG: http://localhost:42767/resources/grade1/grade1.json Validating Opds Publication: title "Lesson 001" and identifier: http://example.app/id/lesson001 2025-09-19 14:12:48.355 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.355 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:48.355 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.357 [eventLoopGroupProxy-7-1 @call-handler#80] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.358 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.358 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.358 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.359 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:48.359 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:48.359 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.359 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:48.359 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.360 [eventLoopGroupProxy-7-1 @call-handler#86] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.362 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.362 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.362 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.362 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.362 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:48.362 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.363 [eventLoopGroupProxy-7-1 @call-handler#89] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.366 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.367 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.367 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.367 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:48.367 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:48.367 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.367 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:48.367 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.369 [eventLoopGroupProxy-7-1 @call-handler#95] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.370 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.370 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.370 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.438 [eventLoopGroupProxy-7-2 @call-handler#99] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) DEBUG: http://localhost:42767/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:42767/resources/grade1/grade1.json 2025-09-19 14:12:48.479 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.479 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:48.480 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.481 [eventLoopGroupProxy-7-1 @call-handler#103] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.483 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.483 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.483 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.484 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:48.484 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/lesson001/lesson001.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:48.484 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.484 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:48.484 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.486 [eventLoopGroupProxy-7-1 @call-handler#109] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.487 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.487 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.487 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.488 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.488 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:48.488 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.489 [eventLoopGroupProxy-7-1 @call-handler#112] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.490 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.491 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.491 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.491 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/lesson001/lesson001.json to class kotlinx.io.Source DEBUG: http://localhost:42767/resources/grade1/lesson001/lesson001.json Validating Opds Publication: title "Lesson 001" and identifier: https://example.app/id/lesson001 2025-09-19 14:12:48.556 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.556 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:48.556 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.558 [eventLoopGroupProxy-7-1 @call-handler#117] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.561 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.561 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.561 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.562 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:48.562 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:48.564 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.564 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:48.565 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.566 [eventLoopGroupProxy-7-1 @call-handler#123] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.568 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.568 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.568 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/cover.png 2025-09-19 14:12:48.569 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.569 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:48.569 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.570 [eventLoopGroupProxy-7-1 @call-handler#126] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.572 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.572 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.572 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.572 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:48.572 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:48.573 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.573 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:48.573 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.574 [eventLoopGroupProxy-7-1 @call-handler#132] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.575 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.575 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.575 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.578 [eventLoopGroupProxy-7-3 @call-handler#136] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.582 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:48.582 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/audio.ogg. 2025-09-19 14:12:48.582 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:48.583 [eventLoopGroupProxy-7-1 @call-handler#140] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, audio.ogg] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.586 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:48.586 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:48.586 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:48.587 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/audio.ogg. 2025-09-19 14:12:48.587 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/lesson001/audio.ogg to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:48.588 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:48.588 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/audio.ogg. 2025-09-19 14:12:48.588 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:48.589 [eventLoopGroupProxy-7-1 @call-handler#146] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, audio.ogg] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.590 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:48.591 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:48.591 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:48.591 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:48.591 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/video.mp4. 2025-09-19 14:12:48.591 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:48.592 [eventLoopGroupProxy-7-1 @call-handler#149] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, video.mp4] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.594 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:48.594 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:48.594 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:48.594 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/video.mp4. 2025-09-19 14:12:48.594 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/lesson001/video.mp4 to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:48.603 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:48.604 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/video.mp4. 2025-09-19 14:12:48.604 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:48.605 [eventLoopGroupProxy-7-1 @call-handler#155] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, video.mp4] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.606 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:48.606 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:48.606 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:48.607 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/script.js 2025-09-19 14:12:48.607 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/script.js. 2025-09-19 14:12:48.607 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/script.js 2025-09-19 14:12:48.608 [eventLoopGroupProxy-7-1 @call-handler#158] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, script.js] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.609 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/script.js 2025-09-19 14:12:48.609 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/script.js 2025-09-19 14:12:48.609 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/script.js 2025-09-19 14:12:48.609 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/script.js. 2025-09-19 14:12:48.609 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/lesson001/script.js to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:48.609 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/script.js 2025-09-19 14:12:48.609 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/script.js. 2025-09-19 14:12:48.609 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/script.js 2025-09-19 14:12:48.611 [eventLoopGroupProxy-7-1 @call-handler#164] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, script.js] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.612 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/script.js 2025-09-19 14:12:48.612 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/script.js 2025-09-19 14:12:48.612 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/script.js DEBUG: http://localhost:42767/resources/grade1/lesson001/lesson001.json Skipping link as it has already been visited: http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:48.612 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.612 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:48.612 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.613 [eventLoopGroupProxy-7-1 @call-handler#167] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.614 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.614 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.614 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.614 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:48.614 [Test worker @coroutine#16] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:42767/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:48.615 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.615 [Test worker @coroutine#16] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:42767/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:48.615 [Test worker @coroutine#16] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.616 [eventLoopGroupProxy-7-1 @call-handler#173] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:48.617 [Test worker @coroutine#16] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.617 [Test worker @coroutine#16] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:42767/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:48.617 [Test worker @coroutine#16] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:42767/resources/grade1/lesson001/lesson001.html DEBUG: http://localhost:42767/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:42767/resources/grade1/lesson001/lesson001.html DEBUG: http://localhost:42767/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:42767/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:49.626 [eventLoopGroupProxy-6-3] WARN i.n.u.c.AbstractEventExecutor - A task raised an exception. Task: io.netty.channel.AbstractChannel$AbstractUnsafe$8@e60cf42 java.util.concurrent.RejectedExecutionException: event executor terminated at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:1005) at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:388) at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:381) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:907) at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:873) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:863) at io.netty.channel.DefaultChannelPipeline.destroyUp(DefaultChannelPipeline.java:816) at io.netty.channel.DefaultChannelPipeline.destroy(DefaultChannelPipeline.java:801) at io.netty.channel.DefaultChannelPipeline.access$700(DefaultChannelPipeline.java:45) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelUnregistered(DefaultChannelPipeline.java:1411) at io.netty.channel.DefaultChannelPipeline.fireChannelUnregistered(DefaultChannelPipeline.java:780) at io.netty.channel.AbstractChannel$AbstractUnsafe$8.run(AbstractChannel.java:692) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:141) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:507) at io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:182) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1073) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:840) 2025-09-19 14:12:49.626 [eventLoopGroupProxy-6-1] WARN i.n.u.c.AbstractEventExecutor - A task raised an exception. Task: io.netty.channel.AbstractChannel$AbstractUnsafe$8@56e80abc java.util.concurrent.RejectedExecutionException: event executor terminated at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:1005) at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:388) at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:381) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:907) at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:873) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:863) at io.netty.channel.DefaultChannelPipeline.destroyUp(DefaultChannelPipeline.java:816) at io.netty.channel.DefaultChannelPipeline.destroy(DefaultChannelPipeline.java:801) at io.netty.channel.DefaultChannelPipeline.access$700(DefaultChannelPipeline.java:45) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelUnregistered(DefaultChannelPipeline.java:1411) at io.netty.channel.DefaultChannelPipeline.fireChannelUnregistered(DefaultChannelPipeline.java:780) at io.netty.channel.AbstractChannel$AbstractUnsafe$8.run(AbstractChannel.java:692) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:141) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:507) at io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:182) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1073) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:840) 2025-09-19 14:12:49.626 [eventLoopGroupProxy-6-2] WARN i.n.u.c.AbstractEventExecutor - A task raised an exception. Task: io.netty.channel.AbstractChannel$AbstractUnsafe$8@141f36d3 java.util.concurrent.RejectedExecutionException: event executor terminated at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:1005) at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:388) at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:381) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:907) at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:873) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:863) at io.netty.channel.DefaultChannelPipeline.destroyUp(DefaultChannelPipeline.java:816) at io.netty.channel.DefaultChannelPipeline.destroy(DefaultChannelPipeline.java:801) at io.netty.channel.DefaultChannelPipeline.access$700(DefaultChannelPipeline.java:45) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelUnregistered(DefaultChannelPipeline.java:1411) at io.netty.channel.DefaultChannelPipeline.fireChannelUnregistered(DefaultChannelPipeline.java:780) at io.netty.channel.AbstractChannel$AbstractUnsafe$8.run(AbstractChannel.java:692) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:141) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:507) at io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:182) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1073) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:840) Test running on port 38663 2025-09-19 14:12:50.645 [Test worker] INFO io.ktor.server.Application - Autoreload is disabled because the development mode is off. 2025-09-19 14:12:50.646 [Test worker] INFO io.ktor.server.Application - Application started in 0.001 seconds. 2025-09-19 14:12:50.649 [DefaultDispatcher-worker-11 @coroutine#177] INFO io.ktor.server.Application - Responding at http://0.0.0.0:38663 2025-09-19 14:12:50.650 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/appmanifest.json 2025-09-19 14:12:50.650 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/appmanifest.json. 2025-09-19 14:12:50.650 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/appmanifest.json 2025-09-19 14:12:50.663 [eventLoopGroupProxy-10-1 @call-handler#183] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.669 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/appmanifest.json 2025-09-19 14:12:50.669 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/appmanifest.json 2025-09-19 14:12:50.673 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/appmanifest.json ERROR: http://localhost:38663/resources/appmanifest.json Link to http://localhost:38663/resources/appmanifest.json: No last-modified or etag header found 2025-09-19 14:12:50.674 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/appmanifest.json. 2025-09-19 14:12:50.674 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/appmanifest.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:50.674 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/appmanifest.json 2025-09-19 14:12:50.674 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/appmanifest.json. 2025-09-19 14:12:50.674 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/appmanifest.json 2025-09-19 14:12:50.678 [eventLoopGroupProxy-10-1 @call-handler#189] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.683 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/appmanifest.json 2025-09-19 14:12:50.685 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/appmanifest.json 2025-09-19 14:12:50.686 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/appmanifest.json 2025-09-19 14:12:50.686 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/appmanifest.json to class kotlinx.io.Source 2025-09-19 14:12:50.718 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/app.html 2025-09-19 14:12:50.719 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/app.html. 2025-09-19 14:12:50.719 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/app.html 2025-09-19 14:12:50.737 [eventLoopGroupProxy-10-1 @call-handler#194] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.748 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/app.html 2025-09-19 14:12:50.749 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/app.html 2025-09-19 14:12:50.749 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/app.html ERROR: http://localhost:38663/resources/appmanifest.json Link to http://localhost:38663/resources/app.html: No last-modified or etag header found 2025-09-19 14:12:50.749 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/app.html. 2025-09-19 14:12:50.749 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/app.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:50.750 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/index.json 2025-09-19 14:12:50.750 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/index.json. 2025-09-19 14:12:50.750 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/index.json 2025-09-19 14:12:50.752 [eventLoopGroupProxy-10-1 @call-handler#200] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.755 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/index.json 2025-09-19 14:12:50.755 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/index.json 2025-09-19 14:12:50.756 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/index.json ERROR: http://localhost:38663/resources/appmanifest.json Link to http://localhost:38663/resources/index.json: No last-modified or etag header found 2025-09-19 14:12:50.757 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/index.json. 2025-09-19 14:12:50.757 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/index.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:50.760 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/index.json 2025-09-19 14:12:50.760 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/index.json. 2025-09-19 14:12:50.760 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/index.json 2025-09-19 14:12:50.763 [eventLoopGroupProxy-10-1 @call-handler#206] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.771 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/index.json 2025-09-19 14:12:50.771 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/index.json 2025-09-19 14:12:50.771 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/index.json ERROR: http://localhost:38663/resources/appmanifest.json Link to http://localhost:38663/resources/index.json: No last-modified or etag header found 2025-09-19 14:12:50.772 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/index.json. 2025-09-19 14:12:50.772 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/index.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:50.772 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/index.json 2025-09-19 14:12:50.773 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/index.json. 2025-09-19 14:12:50.773 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/index.json 2025-09-19 14:12:50.777 [eventLoopGroupProxy-10-1 @call-handler#212] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.783 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/index.json 2025-09-19 14:12:50.783 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/index.json 2025-09-19 14:12:50.783 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/index.json 2025-09-19 14:12:50.783 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/index.json to class kotlinx.io.Source WARN: http://localhost:38663/resources/index.json Navigation link to grade1/grade1.json SHOULD contain an icon DEBUG: http://localhost:38663/resources/index.json Skipping link as it has already been visited: http://localhost:38663/resources/index.json 2025-09-19 14:12:50.931 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/grade1.json 2025-09-19 14:12:50.931 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/grade1.json. 2025-09-19 14:12:50.931 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/grade1.json 2025-09-19 14:12:50.933 [eventLoopGroupProxy-10-1 @call-handler#217] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.940 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/grade1.json 2025-09-19 14:12:50.940 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/grade1.json 2025-09-19 14:12:50.940 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/grade1.json ERROR: http://localhost:38663/resources/index.json Link to http://localhost:38663/resources/grade1/grade1.json: No last-modified or etag header found 2025-09-19 14:12:50.940 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/grade1.json. 2025-09-19 14:12:50.940 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/grade1.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:50.941 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/grade1.json 2025-09-19 14:12:50.941 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/grade1.json. 2025-09-19 14:12:50.941 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/grade1.json 2025-09-19 14:12:50.942 [eventLoopGroupProxy-10-1 @call-handler#223] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.947 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/grade1.json 2025-09-19 14:12:50.947 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/grade1.json 2025-09-19 14:12:50.947 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/grade1.json 2025-09-19 14:12:50.948 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/grade1.json to class kotlinx.io.Source DEBUG: http://localhost:38663/resources/grade1/grade1.json Validating Opds Publication: title "Lesson 001" and identifier: http://example.app/id/lesson001 2025-09-19 14:12:50.949 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/lesson001/cover.png 2025-09-19 14:12:50.949 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:50.949 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/lesson001/cover.png 2025-09-19 14:12:50.951 [eventLoopGroupProxy-10-1 @call-handler#228] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.953 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/lesson001/cover.png 2025-09-19 14:12:50.953 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/lesson001/cover.png 2025-09-19 14:12:50.953 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/lesson001/cover.png ERROR: http://localhost:38663/resources/grade1/grade1.json Link to http://localhost:38663/resources/grade1/lesson001/cover.png: No last-modified or etag header found 2025-09-19 14:12:50.953 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:50.953 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:50.958 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:50.958 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:50.958 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:50.959 [eventLoopGroupProxy-10-1 @call-handler#234] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.963 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:50.963 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:50.963 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/lesson001/lesson001.html ERROR: http://localhost:38663/resources/grade1/grade1.json Link to http://localhost:38663/resources/grade1/lesson001/lesson001.html: No last-modified or etag header found 2025-09-19 14:12:50.963 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:50.964 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:50.979 [eventLoopGroupProxy-10-2 @call-handler#241] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) DEBUG: http://localhost:38663/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:38663/resources/grade1/grade1.json 2025-09-19 14:12:50.989 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:50.989 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:50.989 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:50.994 [eventLoopGroupProxy-10-1 @call-handler#245] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:50.999 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:50.999 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:50.999 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/lesson001/lesson001.json ERROR: http://localhost:38663/resources/grade1/grade1.json Link to http://localhost:38663/resources/grade1/lesson001/lesson001.json: No last-modified or etag header found 2025-09-19 14:12:50.999 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:50.999 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/lesson001/lesson001.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:51.000 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:51.000 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:51.000 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:51.002 [eventLoopGroupProxy-10-1 @call-handler#251] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:51.009 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:51.009 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:51.009 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:51.009 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/lesson001/lesson001.json to class kotlinx.io.Source DEBUG: http://localhost:38663/resources/grade1/lesson001/lesson001.json Validating Opds Publication: title "Lesson 001" and identifier: https://example.app/id/lesson001 2025-09-19 14:12:51.115 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/lesson001/cover.png 2025-09-19 14:12:51.115 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:51.115 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/lesson001/cover.png 2025-09-19 14:12:51.117 [eventLoopGroupProxy-10-1 @call-handler#256] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:51.122 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/lesson001/cover.png 2025-09-19 14:12:51.122 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/lesson001/cover.png 2025-09-19 14:12:51.122 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/lesson001/cover.png ERROR: http://localhost:38663/resources/grade1/lesson001/lesson001.json Link to http://localhost:38663/resources/grade1/lesson001/cover.png: No last-modified or etag header found 2025-09-19 14:12:51.123 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:51.123 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:51.123 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:51.123 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:51.123 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:51.125 [eventLoopGroupProxy-10-1 @call-handler#262] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:51.126 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:51.126 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:51.126 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/lesson001/lesson001.html ERROR: http://localhost:38663/resources/grade1/lesson001/lesson001.json Link to http://localhost:38663/resources/grade1/lesson001/lesson001.html: No last-modified or etag header found 2025-09-19 14:12:51.126 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:51.126 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:51.141 [eventLoopGroupProxy-10-3 @call-handler#269] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:51.149 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:51.152 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/audio.ogg. 2025-09-19 14:12:51.152 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:51.154 [eventLoopGroupProxy-10-1 @call-handler#273] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, audio.ogg] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:51.156 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:51.156 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:51.156 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/lesson001/audio.ogg ERROR: http://localhost:38663/resources/grade1/lesson001/lesson001.json Link to http://localhost:38663/resources/grade1/lesson001/audio.ogg: No last-modified or etag header found 2025-09-19 14:12:51.156 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/audio.ogg. 2025-09-19 14:12:51.156 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/lesson001/audio.ogg to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:51.158 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:51.158 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/video.mp4. 2025-09-19 14:12:51.158 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:51.159 [eventLoopGroupProxy-10-1 @call-handler#279] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, video.mp4] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:51.169 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:51.169 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:51.169 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/lesson001/video.mp4 ERROR: http://localhost:38663/resources/grade1/lesson001/lesson001.json Link to http://localhost:38663/resources/grade1/lesson001/video.mp4: No last-modified or etag header found 2025-09-19 14:12:51.170 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/video.mp4. 2025-09-19 14:12:51.170 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/lesson001/video.mp4 to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:51.179 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/lesson001/script.js 2025-09-19 14:12:51.179 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/script.js. 2025-09-19 14:12:51.179 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/lesson001/script.js 2025-09-19 14:12:51.182 [eventLoopGroupProxy-10-1 @call-handler#285] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, script.js] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:51.188 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/lesson001/script.js 2025-09-19 14:12:51.188 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/lesson001/script.js 2025-09-19 14:12:51.188 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/lesson001/script.js ERROR: http://localhost:38663/resources/grade1/lesson001/lesson001.json Link to http://localhost:38663/resources/grade1/lesson001/script.js: No last-modified or etag header found 2025-09-19 14:12:51.189 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/script.js. 2025-09-19 14:12:51.189 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/lesson001/script.js to class io.ktor.utils.io.ByteReadChannel DEBUG: http://localhost:38663/resources/grade1/lesson001/lesson001.json Skipping link as it has already been visited: http://localhost:38663/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:51.189 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:51.189 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:51.189 [Test worker @coroutine#179] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:51.199 [eventLoopGroupProxy-10-1 @call-handler#291] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:51.204 [Test worker @coroutine#179] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:51.204 [Test worker @coroutine#179] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:38663/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:51.204 [Test worker @coroutine#179] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:38663/resources/grade1/lesson001/lesson001.html ERROR: http://localhost:38663/resources/grade1/lesson001/lesson001.json Link to http://localhost:38663/resources/grade1/lesson001/lesson001.html: No last-modified or etag header found 2025-09-19 14:12:51.204 [Test worker @coroutine#179] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:38663/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:51.204 [Test worker @coroutine#179] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:38663/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel DEBUG: http://localhost:38663/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:38663/resources/grade1/lesson001/lesson001.html DEBUG: http://localhost:38663/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:38663/resources/grade1/lesson001/lesson001.json Test running on port 36521 2025-09-19 14:12:53.308 [Test worker] INFO io.ktor.server.Application - Autoreload is disabled because the development mode is off. 2025-09-19 14:12:53.309 [Test worker] INFO io.ktor.server.Application - Application started in 0.001 seconds. 2025-09-19 14:12:53.321 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.321 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/appmanifest.json. 2025-09-19 14:12:53.321 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.322 [DefaultDispatcher-worker-6 @coroutine#298] INFO io.ktor.server.Application - Responding at http://0.0.0.0:36521 2025-09-19 14:12:53.329 [eventLoopGroupProxy-13-1 @call-handler#304] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.337 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.337 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.337 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.337 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/appmanifest.json. 2025-09-19 14:12:53.338 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/appmanifest.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.338 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.338 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/appmanifest.json. 2025-09-19 14:12:53.338 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.339 [eventLoopGroupProxy-13-1 @call-handler#310] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.341 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.341 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.341 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.341 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.341 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/appmanifest.json. 2025-09-19 14:12:53.341 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.342 [eventLoopGroupProxy-13-1 @call-handler#313] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.344 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.344 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.344 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/appmanifest.json 2025-09-19 14:12:53.344 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/appmanifest.json to class kotlinx.io.Source 2025-09-19 14:12:53.358 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/app.html 2025-09-19 14:12:53.358 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/app.html. 2025-09-19 14:12:53.358 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/app.html 2025-09-19 14:12:53.359 [eventLoopGroupProxy-13-1 @call-handler#318] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.361 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/app.html 2025-09-19 14:12:53.362 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/app.html 2025-09-19 14:12:53.362 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/app.html 2025-09-19 14:12:53.362 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/app.html. 2025-09-19 14:12:53.362 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/app.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.362 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/app.html 2025-09-19 14:12:53.362 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/app.html. 2025-09-19 14:12:53.362 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/app.html 2025-09-19 14:12:53.363 [eventLoopGroupProxy-13-1 @call-handler#324] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.364 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/app.html 2025-09-19 14:12:53.364 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/app.html 2025-09-19 14:12:53.364 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/app.html 2025-09-19 14:12:53.364 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.364 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/index.json. 2025-09-19 14:12:53.364 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/index.json 2025-09-19 14:12:53.365 [eventLoopGroupProxy-13-1 @call-handler#327] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.366 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.366 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/index.json 2025-09-19 14:12:53.366 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.366 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/index.json. 2025-09-19 14:12:53.366 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/index.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.366 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.366 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/index.json. 2025-09-19 14:12:53.366 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/index.json 2025-09-19 14:12:53.367 [eventLoopGroupProxy-13-1 @call-handler#333] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.367 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.367 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/index.json 2025-09-19 14:12:53.367 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.368 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.368 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/index.json. 2025-09-19 14:12:53.368 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/index.json 2025-09-19 14:12:53.368 [eventLoopGroupProxy-13-1 @call-handler#336] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.369 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.369 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/index.json 2025-09-19 14:12:53.369 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.369 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/index.json. 2025-09-19 14:12:53.369 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/index.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.369 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.370 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/index.json. 2025-09-19 14:12:53.370 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/index.json 2025-09-19 14:12:53.370 [eventLoopGroupProxy-13-1 @call-handler#342] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.371 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.371 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/index.json 2025-09-19 14:12:53.371 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.371 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.371 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/index.json. 2025-09-19 14:12:53.371 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/index.json 2025-09-19 14:12:53.372 [eventLoopGroupProxy-13-1 @call-handler#345] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.373 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.373 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/index.json 2025-09-19 14:12:53.373 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/index.json 2025-09-19 14:12:53.373 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/index.json to class kotlinx.io.Source WARN: http://localhost:36521/resources/index.json Navigation link to grade1/grade1.json SHOULD contain an icon DEBUG: http://localhost:36521/resources/index.json Skipping link as it has already been visited: http://localhost:36521/resources/index.json 2025-09-19 14:12:53.427 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.427 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/grade1.json. 2025-09-19 14:12:53.427 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.429 [eventLoopGroupProxy-13-1 @call-handler#350] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.430 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.430 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.430 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.430 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/grade1.json. 2025-09-19 14:12:53.430 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/grade1/grade1.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.430 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.430 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/grade1.json. 2025-09-19 14:12:53.430 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.431 [eventLoopGroupProxy-13-1 @call-handler#356] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.432 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.432 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.432 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.432 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.432 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/grade1.json. 2025-09-19 14:12:53.432 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.433 [eventLoopGroupProxy-13-1 @call-handler#359] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.434 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.434 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.434 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.434 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/grade1/grade1.json to class kotlinx.io.Source DEBUG: http://localhost:36521/resources/grade1/grade1.json Validating Opds Publication: title "Lesson 001" and identifier: http://example.app/id/lesson001 2025-09-19 14:12:53.435 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/cover-small.jpg 2025-09-19 14:12:53.435 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/cover-small.jpg. 2025-09-19 14:12:53.435 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/cover-small.jpg 2025-09-19 14:12:53.436 [eventLoopGroupProxy-13-1 @call-handler#364] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, cover-small.jpg] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.437 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/cover-small.jpg 2025-09-19 14:12:53.437 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/cover-small.jpg 2025-09-19 14:12:53.437 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/cover-small.jpg ERROR: http://localhost:36521/resources/grade1/grade1.json Link to http://localhost:36521/resources/grade1/cover-small.jpg: Response status code not HTTP OK/200. Got: 404 2025-09-19 14:12:53.437 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/grade1/cover-small.jpg to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.437 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.437 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:53.437 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.438 [eventLoopGroupProxy-13-1 @call-handler#368] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.439 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.439 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.439 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.439 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:53.439 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.439 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.439 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:53.439 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.440 [eventLoopGroupProxy-13-1 @call-handler#374] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.440 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.440 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.440 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.443 [eventLoopGroupProxy-13-2 @call-handler#378] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) DEBUG: http://localhost:36521/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:36521/resources/grade1/grade1.json 2025-09-19 14:12:53.445 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.445 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:53.445 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.446 [eventLoopGroupProxy-13-1 @call-handler#382] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.446 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.446 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.446 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.447 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:53.447 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/grade1/lesson001/lesson001.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.447 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.447 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:53.447 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.448 [eventLoopGroupProxy-13-1 @call-handler#388] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.448 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.448 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.448 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.448 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.448 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:53.448 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.449 [eventLoopGroupProxy-13-1 @call-handler#391] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.450 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.450 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.450 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.450 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/grade1/lesson001/lesson001.json to class kotlinx.io.Source DEBUG: http://localhost:36521/resources/grade1/lesson001/lesson001.json Validating Opds Publication: title "Lesson 001" and identifier: https://example.app/id/lesson001 2025-09-19 14:12:53.491 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/cover.png 2025-09-19 14:12:53.491 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:53.491 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/cover.png 2025-09-19 14:12:53.494 [eventLoopGroupProxy-13-1 @call-handler#396] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.499 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/cover.png 2025-09-19 14:12:53.499 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/cover.png 2025-09-19 14:12:53.499 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/cover.png 2025-09-19 14:12:53.500 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:53.500 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.500 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/cover.png 2025-09-19 14:12:53.500 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:53.500 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/cover.png 2025-09-19 14:12:53.502 [eventLoopGroupProxy-13-1 @call-handler#402] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.504 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/cover.png 2025-09-19 14:12:53.504 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/cover.png 2025-09-19 14:12:53.504 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/cover.png 2025-09-19 14:12:53.505 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.505 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:53.505 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.507 [eventLoopGroupProxy-13-1 @call-handler#405] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.508 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.508 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.508 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.508 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:53.508 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.508 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.508 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:53.508 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.509 [eventLoopGroupProxy-13-1 @call-handler#411] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.510 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.510 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.510 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.512 [eventLoopGroupProxy-13-3 @call-handler#415] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) ERROR: http://localhost:36521/resources/grade1/lesson001/lesson001.json The manifest which is discovered using the discovery process as per the Readium spec ( https://github.com/readium/webpub-manifest?tab=readme-ov-file#5-discovering-a-manifest ) MUST contain a list of all resources required. DEBUG: http://localhost:36521/resources/grade1/lesson001/lesson001.json Skipping link as it has already been visited: http://localhost:36521/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:53.515 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.515 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:53.515 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.515 [eventLoopGroupProxy-13-1 @call-handler#419] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.516 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.516 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.516 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.516 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:53.516 [Test worker @coroutine#300] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:36521/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:53.517 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.517 [Test worker @coroutine#300] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:36521/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:53.517 [Test worker @coroutine#300] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.517 [eventLoopGroupProxy-13-1 @call-handler#425] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:53.518 [Test worker @coroutine#300] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.518 [Test worker @coroutine#300] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:36521/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:53.518 [Test worker @coroutine#300] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:36521/resources/grade1/lesson001/lesson001.html DEBUG: http://localhost:36521/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:36521/resources/grade1/lesson001/lesson001.html DEBUG: http://localhost:36521/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:36521/resources/grade1/lesson001/lesson001.json Test running on port 33073 2025-09-19 14:12:55.578 [Test worker] INFO io.ktor.server.Application - Autoreload is disabled because the development mode is off. 2025-09-19 14:12:55.579 [Test worker] INFO io.ktor.server.Application - Application started in 0.001 seconds. 2025-09-19 14:12:55.587 [DefaultDispatcher-worker-10 @coroutine#429] INFO io.ktor.server.Application - Responding at http://0.0.0.0:33073 2025-09-19 14:12:55.591 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.592 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/appmanifest.json. 2025-09-19 14:12:55.592 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.603 [eventLoopGroupProxy-16-1 @call-handler#435] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.613 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.613 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.613 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.614 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/appmanifest.json. 2025-09-19 14:12:55.614 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/appmanifest.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.614 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.614 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/appmanifest.json. 2025-09-19 14:12:55.614 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.618 [eventLoopGroupProxy-16-1 @call-handler#441] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.620 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.620 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.620 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.620 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.620 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/appmanifest.json. 2025-09-19 14:12:55.620 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.622 [eventLoopGroupProxy-16-1 @call-handler#444] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.626 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.626 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.626 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/appmanifest.json 2025-09-19 14:12:55.626 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/appmanifest.json to class kotlinx.io.Source 2025-09-19 14:12:55.633 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/app.html 2025-09-19 14:12:55.633 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/app.html. 2025-09-19 14:12:55.633 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/app.html 2025-09-19 14:12:55.634 [eventLoopGroupProxy-16-1 @call-handler#449] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.636 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/app.html 2025-09-19 14:12:55.636 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/app.html 2025-09-19 14:12:55.636 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/app.html 2025-09-19 14:12:55.636 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/app.html. 2025-09-19 14:12:55.636 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/app.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.636 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/app.html 2025-09-19 14:12:55.636 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/app.html. 2025-09-19 14:12:55.636 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/app.html 2025-09-19 14:12:55.638 [eventLoopGroupProxy-16-1 @call-handler#455] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.639 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/app.html 2025-09-19 14:12:55.639 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/app.html 2025-09-19 14:12:55.639 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/app.html 2025-09-19 14:12:55.639 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.639 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/index.json. 2025-09-19 14:12:55.639 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/index.json 2025-09-19 14:12:55.641 [eventLoopGroupProxy-16-1 @call-handler#458] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.642 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.642 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/index.json 2025-09-19 14:12:55.642 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.642 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/index.json. 2025-09-19 14:12:55.643 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/index.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.643 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.643 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/index.json. 2025-09-19 14:12:55.643 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/index.json 2025-09-19 14:12:55.644 [eventLoopGroupProxy-16-1 @call-handler#464] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.646 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.646 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/index.json 2025-09-19 14:12:55.646 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.646 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.646 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/index.json. 2025-09-19 14:12:55.646 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/index.json 2025-09-19 14:12:55.649 [eventLoopGroupProxy-16-1 @call-handler#467] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.652 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.652 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/index.json 2025-09-19 14:12:55.652 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.652 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/index.json. 2025-09-19 14:12:55.652 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/index.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.653 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.653 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/index.json. 2025-09-19 14:12:55.653 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/index.json 2025-09-19 14:12:55.657 [eventLoopGroupProxy-16-1 @call-handler#473] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.665 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.666 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/index.json 2025-09-19 14:12:55.666 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.667 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.667 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/index.json. 2025-09-19 14:12:55.667 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/index.json 2025-09-19 14:12:55.668 [eventLoopGroupProxy-16-1 @call-handler#476] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.670 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.670 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/index.json 2025-09-19 14:12:55.670 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/index.json 2025-09-19 14:12:55.671 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/index.json to class kotlinx.io.Source WARN: http://localhost:33073/resources/index.json Navigation link to grade1/grade1.json SHOULD contain an icon DEBUG: http://localhost:33073/resources/index.json Skipping link as it has already been visited: http://localhost:33073/resources/index.json 2025-09-19 14:12:55.753 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.753 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/grade1.json. 2025-09-19 14:12:55.753 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.755 [eventLoopGroupProxy-16-1 @call-handler#481] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.756 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.756 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.756 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.756 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/grade1.json. 2025-09-19 14:12:55.756 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/grade1.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.757 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.757 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/grade1.json. 2025-09-19 14:12:55.757 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.759 [eventLoopGroupProxy-16-1 @call-handler#487] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.765 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.765 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.765 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.765 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.765 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/grade1.json. 2025-09-19 14:12:55.765 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.766 [eventLoopGroupProxy-16-1 @call-handler#490] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.769 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.769 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.769 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.769 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/grade1.json to class kotlinx.io.Source DEBUG: http://localhost:33073/resources/grade1/grade1.json Validating Opds Publication: title "Lesson 001" and identifier: http://example.app/id/lesson001 2025-09-19 14:12:55.770 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/cover-small.jpg 2025-09-19 14:12:55.771 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/cover-small.jpg. 2025-09-19 14:12:55.771 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/cover-small.jpg 2025-09-19 14:12:55.772 [eventLoopGroupProxy-16-1 @call-handler#495] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, cover-small.jpg] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.772 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/cover-small.jpg 2025-09-19 14:12:55.772 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/cover-small.jpg 2025-09-19 14:12:55.772 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/cover-small.jpg ERROR: http://localhost:33073/resources/grade1/grade1.json Link to http://localhost:33073/resources/grade1/cover-small.jpg: Response status code not HTTP OK/200. Got: 404 2025-09-19 14:12:55.773 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/cover-small.jpg to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.773 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.773 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:55.773 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.774 [eventLoopGroupProxy-16-1 @call-handler#499] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.774 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.774 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.774 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.775 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:55.775 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.775 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.775 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:55.775 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.775 [eventLoopGroupProxy-16-1 @call-handler#505] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.779 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.779 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.779 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.792 [eventLoopGroupProxy-16-2 @call-handler#509] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) DEBUG: http://localhost:33073/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:33073/resources/grade1/grade1.json 2025-09-19 14:12:55.800 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.800 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:55.800 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.809 [eventLoopGroupProxy-16-1 @call-handler#513] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.813 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.814 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.814 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.814 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:55.814 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/lesson001/lesson001.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.814 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.814 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:55.814 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.815 [eventLoopGroupProxy-16-1 @call-handler#519] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.819 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.819 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.819 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.819 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.819 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:55.819 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.820 [eventLoopGroupProxy-16-1 @call-handler#522] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.823 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.823 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.823 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.823 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/lesson001/lesson001.json to class kotlinx.io.Source DEBUG: http://localhost:33073/resources/grade1/lesson001/lesson001.json Validating Opds Publication: title "Lesson 001" and identifier: https://example.app/id/lesson001 2025-09-19 14:12:55.893 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/cover.png 2025-09-19 14:12:55.897 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:55.897 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/cover.png 2025-09-19 14:12:55.899 [eventLoopGroupProxy-16-1 @call-handler#527] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.899 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/cover.png 2025-09-19 14:12:55.900 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/cover.png 2025-09-19 14:12:55.900 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/cover.png ERROR: http://localhost:33073/resources/grade1/lesson001/lesson001.json Link to http://localhost:33073/resources/grade1/lesson001/cover.png: Response status code not HTTP OK/200. Got: 404 2025-09-19 14:12:55.900 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.900 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.900 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:55.900 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.901 [eventLoopGroupProxy-16-1 @call-handler#531] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.902 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.902 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.902 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.902 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:55.902 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.902 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.902 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:55.902 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.903 [eventLoopGroupProxy-16-1 @call-handler#537] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.903 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.903 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.903 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.906 [eventLoopGroupProxy-16-3 @call-handler#541] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.908 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:55.908 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/audio.ogg. 2025-09-19 14:12:55.908 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:55.909 [eventLoopGroupProxy-16-1 @call-handler#545] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, audio.ogg] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, audio.ogg]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.909 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:55.909 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/audio.ogg 2025-09-19 14:12:55.909 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/audio.ogg ERROR: http://localhost:33073/resources/grade1/lesson001/lesson001.json Link to http://localhost:33073/resources/grade1/lesson001/audio.ogg: Response status code not HTTP OK/200. Got: 404 2025-09-19 14:12:55.910 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/lesson001/audio.ogg to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.910 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:55.910 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/video.mp4. 2025-09-19 14:12:55.910 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:55.910 [eventLoopGroupProxy-16-1 @call-handler#549] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, video.mp4] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, video.mp4]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.911 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:55.911 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/video.mp4 2025-09-19 14:12:55.911 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/video.mp4 ERROR: http://localhost:33073/resources/grade1/lesson001/lesson001.json Link to http://localhost:33073/resources/grade1/lesson001/video.mp4: Response status code not HTTP OK/200. Got: 404 2025-09-19 14:12:55.911 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/lesson001/video.mp4 to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.911 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/script.js 2025-09-19 14:12:55.911 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/script.js. 2025-09-19 14:12:55.911 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/script.js 2025-09-19 14:12:55.912 [eventLoopGroupProxy-16-1 @call-handler#553] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, script.js] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, script.js]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.913 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/script.js 2025-09-19 14:12:55.913 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/script.js 2025-09-19 14:12:55.913 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/script.js ERROR: http://localhost:33073/resources/grade1/lesson001/lesson001.json Link to http://localhost:33073/resources/grade1/lesson001/script.js: Response status code not HTTP OK/200. Got: 404 2025-09-19 14:12:55.913 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/lesson001/script.js to class io.ktor.utils.io.ByteReadChannel DEBUG: http://localhost:33073/resources/grade1/lesson001/lesson001.json Skipping link as it has already been visited: http://localhost:33073/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:55.913 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.913 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:55.913 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.914 [eventLoopGroupProxy-16-1 @call-handler#557] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.914 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.914 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.915 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.915 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:55.915 [Test worker @coroutine#431] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:33073/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:55.915 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.915 [Test worker @coroutine#431] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:33073/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:55.915 [Test worker @coroutine#431] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.916 [eventLoopGroupProxy-16-1 @call-handler#563] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:55.916 [Test worker @coroutine#431] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.917 [Test worker @coroutine#431] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:33073/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:55.917 [Test worker @coroutine#431] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:33073/resources/grade1/lesson001/lesson001.html DEBUG: http://localhost:33073/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:33073/resources/grade1/lesson001/lesson001.html DEBUG: http://localhost:33073/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:33073/resources/grade1/lesson001/lesson001.json Test running on port 32967 2025-09-19 14:12:57.972 [Test worker] INFO io.ktor.server.Application - Autoreload is disabled because the development mode is off. 2025-09-19 14:12:57.972 [Test worker] INFO io.ktor.server.Application - Application started in 0.002 seconds. 2025-09-19 14:12:57.978 [DefaultDispatcher-worker-8 @coroutine#567] INFO io.ktor.server.Application - Responding at http://0.0.0.0:32967 2025-09-19 14:12:57.979 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.979 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/appmanifest.json. 2025-09-19 14:12:57.979 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.981 [eventLoopGroupProxy-19-1 @call-handler#573] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:57.982 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.982 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.982 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.982 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/appmanifest.json. 2025-09-19 14:12:57.982 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/appmanifest.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:57.982 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.982 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/appmanifest.json. 2025-09-19 14:12:57.982 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.983 [eventLoopGroupProxy-19-1 @call-handler#579] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:57.984 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.984 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.984 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.984 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.984 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/appmanifest.json. 2025-09-19 14:12:57.984 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.985 [eventLoopGroupProxy-19-1 @call-handler#582] TRACE io.ktor.server.routing.Routing - Trace for [resources, appmanifest.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[appmanifest.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:57.985 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.985 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.985 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/appmanifest.json 2025-09-19 14:12:57.985 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/appmanifest.json to class kotlinx.io.Source 2025-09-19 14:12:57.988 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/app.html 2025-09-19 14:12:57.988 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/app.html. 2025-09-19 14:12:57.988 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/app.html 2025-09-19 14:12:57.989 [eventLoopGroupProxy-19-1 @call-handler#587] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:57.989 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/app.html 2025-09-19 14:12:57.990 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/app.html 2025-09-19 14:12:57.990 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/app.html 2025-09-19 14:12:57.990 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/app.html. 2025-09-19 14:12:57.990 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/app.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:57.990 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/app.html 2025-09-19 14:12:57.990 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/app.html. 2025-09-19 14:12:57.990 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/app.html 2025-09-19 14:12:57.991 [eventLoopGroupProxy-19-1 @call-handler#593] TRACE io.ktor.server.routing.Routing - Trace for [resources, app.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[app.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:57.991 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/app.html 2025-09-19 14:12:57.991 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/app.html 2025-09-19 14:12:57.991 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/app.html 2025-09-19 14:12:57.991 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.991 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/index.json. 2025-09-19 14:12:57.991 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/index.json 2025-09-19 14:12:57.992 [eventLoopGroupProxy-19-1 @call-handler#596] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:57.992 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.992 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/index.json 2025-09-19 14:12:57.992 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.993 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/index.json. 2025-09-19 14:12:57.993 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/index.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:57.993 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.993 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/index.json. 2025-09-19 14:12:57.993 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/index.json 2025-09-19 14:12:57.993 [eventLoopGroupProxy-19-1 @call-handler#602] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:57.994 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.994 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/index.json 2025-09-19 14:12:57.994 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.994 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.994 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/index.json. 2025-09-19 14:12:57.994 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/index.json 2025-09-19 14:12:57.995 [eventLoopGroupProxy-19-1 @call-handler#605] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:57.995 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.995 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/index.json 2025-09-19 14:12:57.995 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.995 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/index.json. 2025-09-19 14:12:57.995 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/index.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:57.996 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.996 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/index.json. 2025-09-19 14:12:57.996 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/index.json 2025-09-19 14:12:57.996 [eventLoopGroupProxy-19-1 @call-handler#611] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:57.997 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.997 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/index.json 2025-09-19 14:12:57.997 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.997 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.997 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/index.json. 2025-09-19 14:12:57.997 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/index.json 2025-09-19 14:12:57.997 [eventLoopGroupProxy-19-1 @call-handler#614] TRACE io.ktor.server.routing.Routing - Trace for [resources, index.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:2 -> SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:2 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[index.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:57.998 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.998 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/index.json 2025-09-19 14:12:57.998 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/index.json 2025-09-19 14:12:57.998 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/index.json to class kotlinx.io.Source WARN: http://localhost:32967/resources/index.json Navigation link to grade1/grade1.json SHOULD contain an icon DEBUG: http://localhost:32967/resources/index.json Skipping link as it has already been visited: http://localhost:32967/resources/index.json 2025-09-19 14:12:58.056 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.056 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/grade1.json. 2025-09-19 14:12:58.056 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.057 [eventLoopGroupProxy-19-1 @call-handler#619] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.058 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.058 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.058 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.058 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/grade1.json. 2025-09-19 14:12:58.058 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/grade1/grade1.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:58.058 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.058 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/grade1.json. 2025-09-19 14:12:58.058 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.059 [eventLoopGroupProxy-19-1 @call-handler#625] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.060 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.060 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.060 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.060 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.060 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/grade1.json. 2025-09-19 14:12:58.060 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.061 [eventLoopGroupProxy-19-1 @call-handler#628] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, grade1.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, grade1.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.062 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.062 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.062 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.062 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/grade1/grade1.json to class kotlinx.io.Source DEBUG: http://localhost:32967/resources/grade1/grade1.json Validating Opds Publication: title "Lesson 001" and identifier: http://example.app/id/lesson001 2025-09-19 14:12:58.063 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/cover-small.jpg 2025-09-19 14:12:58.063 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/cover-small.jpg. 2025-09-19 14:12:58.063 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/cover-small.jpg 2025-09-19 14:12:58.066 [eventLoopGroupProxy-19-1 @call-handler#633] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, cover-small.jpg] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:3 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:3 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, cover-small.jpg]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.067 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/cover-small.jpg 2025-09-19 14:12:58.067 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/cover-small.jpg 2025-09-19 14:12:58.067 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/cover-small.jpg ERROR: http://localhost:32967/resources/grade1/grade1.json Link to http://localhost:32967/resources/grade1/cover-small.jpg: Response status code not HTTP OK/200. Got: 404 2025-09-19 14:12:58.067 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/grade1/cover-small.jpg to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:58.067 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.067 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:58.067 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.068 [eventLoopGroupProxy-19-1 @call-handler#637] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.069 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.069 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.069 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.069 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:58.069 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:58.069 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.069 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:58.069 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.070 [eventLoopGroupProxy-19-1 @call-handler#643] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.071 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.071 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.071 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.073 [eventLoopGroupProxy-19-2 @call-handler#647] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) ERROR: http://localhost:32967/resources/grade1/grade1.json Manifest not discovered for learning resource ID URL: http://localhost:32967/resources/grade1/lesson001/lesson001.html .Readium publication manifest must be discoverable using a linktag in HTML or Link header for the learning resource ID URL as per https://github.com/readium/webpub-manifest?tab=readme-ov-file#5-discovering-a-manifest DEBUG: http://localhost:32967/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:32967/resources/grade1/grade1.json 2025-09-19 14:12:58.075 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.076 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:58.076 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.077 [eventLoopGroupProxy-19-1 @call-handler#651] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.078 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.078 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.078 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.078 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:58.078 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/grade1/lesson001/lesson001.json to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:58.078 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.078 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:58.078 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.079 [eventLoopGroupProxy-19-1 @call-handler#657] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.080 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.080 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.080 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.080 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.080 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.json. 2025-09-19 14:12:58.080 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.082 [eventLoopGroupProxy-19-1 @call-handler#660] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.json] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.json]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.093 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.093 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.093 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.097 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/grade1/lesson001/lesson001.json to class kotlinx.io.Source DEBUG: http://localhost:32967/resources/grade1/lesson001/lesson001.json Validating Opds Publication: title "Lesson 001" and identifier: https://example.app/id/lesson001 2025-09-19 14:12:58.161 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/cover.png 2025-09-19 14:12:58.161 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:58.161 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/cover.png 2025-09-19 14:12:58.163 [eventLoopGroupProxy-19-1 @call-handler#665] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.164 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/cover.png 2025-09-19 14:12:58.164 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/cover.png 2025-09-19 14:12:58.165 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/cover.png 2025-09-19 14:12:58.165 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:58.165 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/grade1/lesson001/cover.png to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:58.165 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/cover.png 2025-09-19 14:12:58.165 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/cover.png. 2025-09-19 14:12:58.165 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/cover.png 2025-09-19 14:12:58.172 [eventLoopGroupProxy-19-1 @call-handler#671] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, cover.png] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, cover.png]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.173 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/cover.png 2025-09-19 14:12:58.173 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/cover.png 2025-09-19 14:12:58.173 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/cover.png 2025-09-19 14:12:58.173 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.173 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:58.174 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.179 [eventLoopGroupProxy-19-1 @call-handler#674] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.181 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.181 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.181 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.189 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:58.190 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:58.190 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.190 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:58.190 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.195 [eventLoopGroupProxy-19-1 @call-handler#680] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.196 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.196 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.196 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.214 [eventLoopGroupProxy-19-3 @call-handler#684] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) ERROR: http://localhost:32967/resources/grade1/lesson001/lesson001.json Manifest not discovered for learning resource ID URL: http://localhost:32967/resources/grade1/lesson001/lesson001.html .Readium publication manifest must be discoverable using a linktag in HTML or Link header for the learning resource ID URL as per https://github.com/readium/webpub-manifest?tab=readme-ov-file#5-discovering-a-manifest DEBUG: http://localhost:32967/resources/grade1/lesson001/lesson001.json Skipping link as it has already been visited: http://localhost:32967/resources/grade1/lesson001/lesson001.json 2025-09-19 14:12:58.218 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.218 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:58.218 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.221 [eventLoopGroupProxy-19-1 @call-handler#688] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.230 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.234 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.234 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.234 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Response body type class io.ktor.utils.io.ByteReadChannel is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:58.234 [Test worker @coroutine#569] TRACE i.k.c.plugins.defaultTransformers - Transformed with default transformers response body for http://localhost:32967/resources/grade1/lesson001/lesson001.html to class io.ktor.utils.io.ByteReadChannel 2025-09-19 14:12:58.235 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Adding Accept=application/json header for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.237 [Test worker @coroutine#569] TRACE i.k.c.p.c.ContentNegotiation - Body type class io.ktor.client.utils.EmptyContent is in ignored types. Skipping ContentNegotiation for http://localhost:32967/resources/grade1/lesson001/lesson001.html. 2025-09-19 14:12:58.237 [Test worker @coroutine#569] TRACE i.ktor.client.plugins.HttpPlainText - Adding Accept-Charset=UTF-8 to http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.238 [eventLoopGroupProxy-19-1 @call-handler#694] TRACE io.ktor.server.routing.Routing - Trace for [resources, grade1, lesson001, lesson001.html] /, segment:0 -> SUCCESS @ / /(staticContent), segment:0 -> SUCCESS @ /(staticContent) /(staticContent)/resources, segment:1 -> SUCCESS @ /(staticContent)/resources /(staticContent)/resources/{...}, segment:4 -> SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...} /(staticContent)/resources/{...}/(method:GET), segment:4 -> SUCCESS @ /(staticContent)/resources/{...}/(method:GET) Matched routes: "" -> "(staticContent)" -> "resources" -> "{...}" -> "(method:GET)" Routing resolve result: SUCCESS; Parameters [static-content-path-parameter=[grade1, lesson001, lesson001.html]] @ /(staticContent)/resources/{...}/(method:GET) 2025-09-19 14:12:58.240 [Test worker @coroutine#569] TRACE io.ktor.client.plugins.SaveBody - Skipping body saving for http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.240 [Test worker @coroutine#569] TRACE i.k.client.plugins.HttpCallValidator - Validating response for request http://localhost:32967/resources/grade1/lesson001/lesson001.html 2025-09-19 14:12:58.240 [Test worker @coroutine#569] TRACE i.k.c.p.DefaultResponseValidation - Skipping default response validation for http://localhost:32967/resources/grade1/lesson001/lesson001.html DEBUG: http://localhost:32967/resources/grade1/grade1.json Skipping link as it has already been visited: http://localhost:32967/resources/grade1/lesson001/lesson001.html ]]>