diff --git a/zio-http/shared/src/main/scala/zio/http/Routes.scala b/zio-http/shared/src/main/scala/zio/http/Routes.scala index 8441e83413..85e5dd75bd 100644 --- a/zio-http/shared/src/main/scala/zio/http/Routes.scala +++ b/zio-http/shared/src/main/scala/zio/http/Routes.scala @@ -248,31 +248,39 @@ final case class Routes[-Env, +Err](routes: Chunk[zio.http.Route[Env, Err]]) { s val tree = self.tree Handler .fromFunctionHandler[Request] { req => - validateHostHeader(req).flatMap { _ => - val chunk = tree.get(req.method, req.path) - val allowedMethods = tree.getAllMethods(req.path) - - chunk.length match { - case 0 => - if (!Method.knownMethods.contains(req.method)) { - Handler.status(Status.NotImplemented) - } else if (!allowedMethods.contains(req.method) && allowedMethods.nonEmpty) { - Handler.methodNotAllowed - } else { Handler.notFound } - case 1 => chunk(0) - case n => // TODO: Support precomputed fallback among all chunk elements - var acc = chunk(0) - var i = 1 - while (i < n) { - val h = chunk(i) - acc = acc.catchAll { response => - if (response.status == Status.NotFound) h - else Handler.fail(response) + val chunk = tree.get(req.method, req.path) + val allowedMethods = tree.getAllMethods(req.path) + + req.method match { + case Method.CUSTOM(_) => + Handler.fromZIO(ZIO.succeed(Response.status(Status.NotImplemented))) + case _ if chunk.isEmpty && allowedMethods.nonEmpty => + Handler.fromZIO(ZIO.succeed(Response.status(Status.MethodNotAllowed))) + + case _ if chunk.isEmpty && allowedMethods.isEmpty => + Handler.notFound + case _ => + chunk.length match { + // case 0 => + // if (!Method.knownMethods.contains(req.method)) { + // Handler.status(Status.NotImplemented) + // } else if (!allowedMethods.contains(req.method) && allowedMethods.nonEmpty) { + // Handler.methodNotAllowed + // } else { Handler.notFound } + case 1 => chunk(0) + case n => // TODO: Support precomputed fallback among all chunk elements + var acc = chunk(0) + var i = 1 + while (i < n) { + val h = chunk(i) + acc = acc.catchAll { response => + if (response.status == Status.NotFound) h + else Handler.fail(response) + } + i += 1 } - i += 1 - } - acc - } + acc + } } } .merge