fixing webservice and redirection bugs
continuous-integration/drone/push Build is failing Details

dev
Override-6 2 years ago
parent 7b3be31271
commit ceb53e5abb

@ -4,7 +4,7 @@ import org.apache.logging.log4j.LogManager
import org.tbasket.auth.Authenticator import org.tbasket.auth.Authenticator
import org.tbasket.config.{FileServerConfig, ServerConfig} import org.tbasket.config.{FileServerConfig, ServerConfig}
import org.tbasket.data.Database import org.tbasket.data.Database
import org.tbasket.dispatch.ResourceDispatcher import org.tbasket.dispatch.WebService
import org.tbasket.endpoint.Endpoint import org.tbasket.endpoint.Endpoint
import pdi.jwt.algorithms.JwtAsymmetricAlgorithm import pdi.jwt.algorithms.JwtAsymmetricAlgorithm
import zio.* import zio.*
@ -33,7 +33,7 @@ object Main extends ZIOAppDefault:
} }
private def setupPageDispatcher(config: ServerConfig) = ZIO.attempt { private def setupPageDispatcher(config: ServerConfig) = ZIO.attempt {
val dispatcher = new ResourceDispatcher(config.pagesLocation) val dispatcher = new WebService(config.pagesLocation)
ZLayer.succeed(dispatcher) ZLayer.succeed(dispatcher)
} }

@ -9,7 +9,7 @@ import zio.stream.ZStream
import java.nio.file.{Files, Path} import java.nio.file.{Files, Path}
import scala.collection.mutable import scala.collection.mutable
class ResourceDispatcher(pagesLocation: Path) { class WebService(pagesLocation: Path) {
private val resources = resolveResources private val resources = resolveResources
@ -25,6 +25,7 @@ class ResourceDispatcher(pagesLocation: Path) {
ZIO.attempt(Response.status(status)) ZIO.attempt(Response.status(status))
} }
private def resolveResources: Map[String, Body] = { private def resolveResources: Map[String, Body] = {
val map = mutable.HashMap.empty[String, Body] val map = mutable.HashMap.empty[String, Body]
@ -32,17 +33,23 @@ class ResourceDispatcher(pagesLocation: Path) {
def resolveAll(loc: Path): Unit = { def resolveAll(loc: Path): Unit = {
Files.list(loc) Files.list(loc)
.forEach { .forEach {
case d if Files.isDirectory(d) => resolveAll(d) case d if Files.isDirectory(d) => resolveAll(d)
case f => case f =>
val body = Body.fromFile(f.toFile) val body = Body.fromFile(f.toFile)
val fileName = f.toString val fullPath = f.toString
map.put(fileName, body) val fileName = f.getFileName.toString
val extension = fileName.drop(fileName.indexOf('.')) val purename = fileName.take(fileName.indexOf('.'))
val dirPath = f.getParent.toString map.put(fullPath, body)
if (extension == ".html")
map.put(dirPath, body) //also bind the dir path with the index body //also bind the dir path with the index body
else map.put(dirPath + extension, body) if (purename == "index" || purename == f.getParent.getFileName.toString) {
val extension = fullPath.drop(fullPath.indexOf('.'))
val dirPath = f.getParent.toString
if (extension == ".html")
map.put(dirPath, body)
else map.put(dirPath + extension, body)
}
} }
} }

@ -8,7 +8,7 @@ import io.netty.handler.codec.http.HttpMethod
import org.apache.logging.log4j.{LogManager, Logger} import org.apache.logging.log4j.{LogManager, Logger}
import org.tbasket.auth.Authenticator import org.tbasket.auth.Authenticator
import org.tbasket.data.DatabaseContext import org.tbasket.data.DatabaseContext
import org.tbasket.dispatch.ResourceDispatcher import org.tbasket.dispatch.WebService
import org.tbasket.endpoint.Endpoint.{Log, app} import org.tbasket.endpoint.Endpoint.{Log, app}
import org.tbasket.error.* import org.tbasket.error.*
import org.tbasket.handler.HandlerUtils.errorBody import org.tbasket.handler.HandlerUtils.errorBody
@ -37,7 +37,7 @@ class Endpoint(port: Int):
Server.install(app).flatMap { port => Server.install(app).flatMap { port =>
Log.info(s"Listening API entries on $port") Log.info(s"Listening API entries on $port")
ZIO.never ZIO.never
}.provideSome[DatabaseContext & Authenticator & DataSource & ResourceDispatcher]( }.provideSome[DatabaseContext & Authenticator & DataSource & WebService](
Scope.default, Scope.default,
serverConfigLayer, serverConfigLayer,
ConnectionPool.fixed(4), ConnectionPool.fixed(4),
@ -57,7 +57,7 @@ object Endpoint:
RegisterPageHandler.post(r) RegisterPageHandler.post(r)
case r@GET -> _ => case r@GET -> _ =>
ZIO.serviceWithZIO[ResourceDispatcher](_.send(r)) ZIO.serviceWithZIO[WebService](_.send(r))
case r@method -> path => case r@method -> path =>
val ipInsights = r.remoteAddress val ipInsights = r.remoteAddress

@ -26,7 +26,7 @@ object HandlerUtils {
def parseRequestForm(body: Body) = def parseRequestForm(body: Body) =
(for (for
decoded <- body.asString.map(URLDecoder.decode(_, StandardCharsets.UTF_8.name())) decoded <- body.asString.map(str => URLDecoder.decode(str.stripPrefix("&"), StandardCharsets.UTF_8.name()))
params = decoded.split('&').collect { case s"$k=$v" => (k, v)}.toMap params = decoded.split('&').collect { case s"$k=$v" => (k, v)}.toMap
yield params) yield params)
.mapError(s => InvalidRequest("Invalid request body", s.getMessage)) .mapError(s => InvalidRequest("Invalid request body", s.getMessage))
@ -34,4 +34,4 @@ object HandlerUtils {
def search(map: Map[String, String])(name: String) = def search(map: Map[String, String])(name: String) =
ZIO.attempt(map.get(name)).someOrFail(InvalidRequest(s"Missing or invalid field $name.")) ZIO.attempt(map.get(name)).someOrFail(InvalidRequest(s"Missing or invalid field $name."))
} }

@ -49,7 +49,7 @@ object LoginPageHandler extends PageHandler:
def post(request: Request) = def post(request: Request) =
tryPost(request).catchSome { tryPost(request).catchSome {
case UserNotFound(msg) => ZIO.attempt(Response( case UserNotFound(msg) => ZIO.attempt(Response(
status = Status.Unauthorized, status = Status.Found,
body = errorBody("unauthorized", msg), body = errorBody("unauthorized", msg),
headers = headers =
Headers( Headers(

@ -3,7 +3,7 @@ package org.tbasket.test
import org.tbasket.auth.Authenticator import org.tbasket.auth.Authenticator
import org.tbasket.config.ServerConfig import org.tbasket.config.ServerConfig
import org.tbasket.data.Database import org.tbasket.data.Database
import org.tbasket.dispatch.ResourceDispatcher import org.tbasket.dispatch.WebService
import zio.{Task, ZLayer} import zio.{Task, ZLayer}
import java.nio.file.{Files, Path} import java.nio.file.{Files, Path}
@ -22,7 +22,7 @@ object TestLayers {
ZLayer.succeed(auth) ZLayer.succeed(auth)
} }
val resp = ZLayer.succeed(new ResourceDispatcher(TestServerConfig.pagesLocation)) val resp = ZLayer.succeed(new WebService(TestServerConfig.pagesLocation))
val db = { val db = {
//ensure that the test table is always new in order to make tests on the same dataset all the time. //ensure that the test table is always new in order to make tests on the same dataset all the time.

@ -52,7 +52,7 @@ object LoginPageHandlerTests extends TBasketPageSpec("/login") {
errorType <- parseAttribute(json, "error", JsonCursor.field("error").isString) errorType <- parseAttribute(json, "error", JsonCursor.field("error").isString)
yield yield
//assert that the response error is of type unauthorized and headers are Location: /register //assert that the response error is of type unauthorized and headers are Location: /register
assert(response)(hasField("status", _.status, equalTo(Status.Unauthorized))) assert(response)(hasField("status", _.status, equalTo(Status.Found)))
&& assert(errorType)(equalTo("unauthorized")) && assert(errorType)(equalTo("unauthorized"))
&& assert(response)(hasField("headers", _.headers, contains(Headers.location("/register")))) && assert(response)(hasField("headers", _.headers, contains(Headers.location("/register"))))
}, },

@ -5,7 +5,7 @@ import io.getquill.context.qzio.ZioJdbcContext
import io.getquill.context.sql.idiom.SqlIdiom import io.getquill.context.sql.idiom.SqlIdiom
import org.tbasket.auth.Authenticator import org.tbasket.auth.Authenticator
import org.tbasket.data.DatabaseContext import org.tbasket.data.DatabaseContext
import org.tbasket.dispatch.ResourceDispatcher import org.tbasket.dispatch.WebService
import zio.test.{Spec, TestEnvironment, ZIOSpecDefault} import zio.test.{Spec, TestEnvironment, ZIOSpecDefault}
import org.tbasket.handler.LoginPageHandler.post import org.tbasket.handler.LoginPageHandler.post
import zio.* import zio.*
@ -21,7 +21,7 @@ abstract class TBasketPageSpec(location: String) extends ZIOSpecDefault {
case Left(value) => throw value case Left(value) => throw value
case Right(url) => url case Right(url) => url
protected def tspec: Spec[DataSource & ClientConfig & Authenticator & ConnectionPool & Scope & DatabaseContext & Client & ResourceDispatcher, Any] protected def tspec: Spec[DataSource & ClientConfig & Authenticator & ConnectionPool & Scope & DatabaseContext & Client & WebService, Any]
final override def spec = tspec.provide( final override def spec = tspec.provide(
db.datasourceLayer, db.datasourceLayer,