diff --git a/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/frontend/infrastructure/FrontendHandler.kt b/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/frontend/infrastructure/FrontendHandler.kt index 7cb1fe27c..2972603f4 100644 --- a/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/frontend/infrastructure/FrontendHandler.kt +++ b/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/frontend/infrastructure/FrontendHandler.kt @@ -44,8 +44,8 @@ internal class FrontendHandler(private val frontendFacade: FrontendFacade) : Rou FrontendFacade::class.java.getResourceAsStream("/static/$uri") ?.let { ctx.result(it) + .encoding(Charsets.UTF_8) .contentType(MimeTypes.getDefaultMimeByExtension(uri)) - .encoding("UTF-8") } ?: ctx.status(HttpStatus.NOT_FOUND_404) } diff --git a/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/statistics/StatisticsFacade.kt b/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/statistics/StatisticsFacade.kt index 1d0c052fb..6d7632e30 100644 --- a/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/statistics/StatisticsFacade.kt +++ b/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/statistics/StatisticsFacade.kt @@ -32,7 +32,7 @@ class StatisticsFacade internal constructor( fun increaseRecord(type: RecordType, uri: String) = recordsBulk.merge(RecordIdentifier(type, uri), 1) { cached, value -> cached + value } - internal fun saveRecordsBulk() = + fun saveRecordsBulk() = recordsBulk.toMap().also { recordsBulk.clear() // read doesn't lock, so there is a possibility of dropping a few records between toMap and clear. Might be improved in the future statisticsRepository.incrementRecords(it) diff --git a/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/web/WebExtensions.kt b/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/web/WebExtensions.kt index 6ffe9fc6a..cf2876b9c 100644 --- a/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/web/WebExtensions.kt +++ b/reposilite-backend/src/main/kotlin/org/panda_lang/reposilite/web/WebExtensions.kt @@ -24,6 +24,7 @@ import org.panda_lang.reposilite.maven.api.DocumentInfo import org.panda_lang.utilities.commons.function.Result import java.io.InputStream import java.io.OutputStream +import java.nio.charset.Charset import java.nio.file.Path import java.nio.file.Paths @@ -36,6 +37,9 @@ fun Context.error(error: ErrorResponse): Context = fun Context.contentLength(length: Long): Context = also { res.setContentLengthLong(length) } +fun Context.encoding(encoding: Charset): Context = + encoding(encoding.name()) + fun Context.encoding(encoding: String): Context = also { res.characterEncoding = encoding } diff --git a/reposilite-backend/src/test/kotlin/org/panda_lang/reposilite/statistics/StatisticsFacadeTest.kt b/reposilite-backend/src/test/kotlin/org/panda_lang/reposilite/statistics/StatisticsFacadeTest.kt new file mode 100644 index 000000000..b2565bfce --- /dev/null +++ b/reposilite-backend/src/test/kotlin/org/panda_lang/reposilite/statistics/StatisticsFacadeTest.kt @@ -0,0 +1,25 @@ +package org.panda_lang.reposilite.statistics + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import org.panda_lang.reposilite.statistics.api.RecordType.REQUEST + +internal class StatisticsFacadeTest : StatisticsSpec() { + + @Test + fun `should increase records after saving the bulk`() { + // given: an uri to request + val uri = "/x/y/z" + + // when: the given uri is requested twice + statisticsFacade.increaseRecord(REQUEST, uri) + statisticsFacade.increaseRecord(REQUEST, uri) + statisticsFacade.saveRecordsBulk() + + // then: it should be properly stored in repository as a single record + val records = statisticsFacade.findRecordsByPhrase(REQUEST, uri) + assertEquals(1, records.size) + assertEquals(2, records.get(0).count) + } + +} \ No newline at end of file diff --git a/reposilite-backend/src/test/kotlin/org/panda_lang/reposilite/statistics/StatisticsSpec.kt b/reposilite-backend/src/test/kotlin/org/panda_lang/reposilite/statistics/StatisticsSpec.kt new file mode 100644 index 000000000..e3d5a06e3 --- /dev/null +++ b/reposilite-backend/src/test/kotlin/org/panda_lang/reposilite/statistics/StatisticsSpec.kt @@ -0,0 +1,11 @@ +package org.panda_lang.reposilite.statistics + +import net.dzikoysk.dynamiclogger.backend.InMemoryLogger +import org.panda_lang.reposilite.statistics.infrastructure.InMemoryStatisticsRepository + +internal open class StatisticsSpec { + + protected val logger = InMemoryLogger() + protected val statisticsFacade = StatisticsFacade(logger, InMemoryStatisticsRepository()) + +} \ No newline at end of file