private def prepareCombinedRoutes()

in management/src/main/scala/org/apache/pekko/management/scaladsl/PekkoManagement.scala [185:230]


  private def prepareCombinedRoutes(providerSettings: ManagementRouteProviderSettings): Route = {
    val basePath: Directive[Unit] = {
      val pathPrefixName = settings.Http.BasePath.getOrElse("")
      if (pathPrefixName.isEmpty) {
        rawPathPrefix(pathPrefixName)
      } else {
        pathPrefix(PathMatchers.separateOnSlashes(pathPrefixName))
      }
    }

    def wrapWithAuthenticatorIfPresent(inner: Route): Route = {
      val providerSettingsImpl = providerSettings.asInstanceOf[ManagementRouteProviderSettingsImpl]
      (providerSettingsImpl.scaladslAuth, providerSettingsImpl.javadslAuth) match {
        case (None, None) =>
          inner

        case (Some(asyncAuthenticator), None) =>
          authenticateBasicAsync[String](realm = "secured", asyncAuthenticator)(_ => inner)

        case (None, Some(auth)) =>
          def credsToJava(cred: Credentials): Optional[ProvidedCredentials] = cred match {
            case provided: Credentials.Provided => Optional.of(ProvidedCredentials(provided))
            case _                              => Optional.empty()
          }
          authenticateBasicAsync(realm = "secured", c => auth.apply(credsToJava(c)).asScala.map(_.toScala))
            .apply(_ => inner)

        case (Some(_), Some(_)) =>
          throw new IllegalStateException("Unexpected that both scaladsl and javadsl auth were defined")
      }
    }

    val combinedRoutes = routeProviders.map { provider =>
      log.info("Including HTTP management routes for {}", Logging.simpleName(provider))
      provider.routes(providerSettings)
    }

    if (combinedRoutes.nonEmpty) {
      basePath {
        wrapWithAuthenticatorIfPresent(Directives.concat(combinedRoutes: _*))
      }
    } else
      throw new IllegalArgumentException(
        "No routes configured for pekko management! " +
        "Double check your `pekko.management.http.routes` config.")
  }