Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions ktor-server/ktor-server-core/api/ktor-server-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -2048,6 +2048,63 @@ public final class io/ktor/server/routing/RoutingRootKt {
public static final fun routing (Lio/ktor/server/application/Application;Lkotlin/jvm/functions/Function1;)Lio/ktor/server/routing/RoutingRoot;
}

public final class io/ktor/server/routing/SegmentedPath : java/util/List, kotlin/jvm/internal/markers/KMappedMarker {
public synthetic fun add (ILjava/lang/Object;)V
public fun add (ILjava/lang/String;)V
public synthetic fun add (Ljava/lang/Object;)Z
public fun add (Ljava/lang/String;)Z
public fun addAll (ILjava/util/Collection;)Z
public fun addAll (Ljava/util/Collection;)Z
public static final synthetic fun box-impl (Ljava/lang/String;)Lio/ktor/server/routing/SegmentedPath;
public fun clear ()V
public final fun contains (Ljava/lang/Object;)Z
public fun contains (Ljava/lang/String;)Z
public static fun contains-impl (Ljava/lang/String;Ljava/lang/String;)Z
public fun containsAll (Ljava/util/Collection;)Z
public static fun containsAll-impl (Ljava/lang/String;Ljava/util/Collection;)Z
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z
public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z
public synthetic fun get (I)Ljava/lang/Object;
public fun get (I)Ljava/lang/String;
public static fun get-impl (Ljava/lang/String;I)Ljava/lang/String;
public fun getSize ()I
public static fun getSize-impl (Ljava/lang/String;)I
public fun hashCode ()I
public static fun hashCode-impl (Ljava/lang/String;)I
public final fun indexOf (Ljava/lang/Object;)I
public fun indexOf (Ljava/lang/String;)I
public static fun indexOf-impl (Ljava/lang/String;Ljava/lang/String;)I
public fun isEmpty ()Z
public static fun isEmpty-impl (Ljava/lang/String;)Z
public fun iterator ()Ljava/util/Iterator;
public static fun iterator-impl (Ljava/lang/String;)Ljava/util/Iterator;
public final fun lastIndexOf (Ljava/lang/Object;)I
public fun lastIndexOf (Ljava/lang/String;)I
public static fun lastIndexOf-impl (Ljava/lang/String;Ljava/lang/String;)I
public fun listIterator ()Ljava/util/ListIterator;
public fun listIterator (I)Ljava/util/ListIterator;
public static fun listIterator-impl (Ljava/lang/String;)Ljava/util/ListIterator;
public static fun listIterator-impl (Ljava/lang/String;I)Ljava/util/ListIterator;
public synthetic fun remove (I)Ljava/lang/Object;
public fun remove (I)Ljava/lang/String;
public fun remove (Ljava/lang/Object;)Z
public fun removeAll (Ljava/util/Collection;)Z
public fun replaceAll (Ljava/util/function/UnaryOperator;)V
public fun retainAll (Ljava/util/Collection;)Z
public synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object;
public fun set (ILjava/lang/String;)Ljava/lang/String;
public synthetic fun size ()I
public fun sort (Ljava/util/Comparator;)V
public fun subList (II)Ljava/util/List;
public static fun subList-impl (Ljava/lang/String;II)Ljava/util/List;
public fun toArray ()[Ljava/lang/Object;
public fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object;
public fun toString ()Ljava/lang/String;
public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String;
public final synthetic fun unbox-impl ()Ljava/lang/String;
}

public final class io/ktor/server/routing/TrailingSlashRouteSelector : io/ktor/server/routing/RouteSelector, io/ktor/server/routing/RoutePathComponent {
public static final field INSTANCE Lio/ktor/server/routing/TrailingSlashRouteSelector;
public fun evaluate (Lio/ktor/server/routing/RoutingResolveContext;ILkotlin/coroutines/Continuation;)Ljava/lang/Object;
Expand Down
19 changes: 19 additions & 0 deletions ktor-server/ktor-server-core/api/ktor-server-core.klib.api
Original file line number Diff line number Diff line change
Expand Up @@ -1305,6 +1305,25 @@ final class io.ktor.server.routing/RoutingRoot : io.ktor.server.routing/Routing,
}
}

final value class io.ktor.server.routing/SegmentedPath : kotlin.collections/List<kotlin/String> { // io.ktor.server.routing/SegmentedPath|null[0]
final val size // io.ktor.server.routing/SegmentedPath.size|{}size[0]
final fun <get-size>(): kotlin/Int // io.ktor.server.routing/SegmentedPath.size.<get-size>|<get-size>(){}[0]

final fun contains(kotlin/String): kotlin/Boolean // io.ktor.server.routing/SegmentedPath.contains|contains(kotlin.String){}[0]
final fun containsAll(kotlin.collections/Collection<kotlin/String>): kotlin/Boolean // io.ktor.server.routing/SegmentedPath.containsAll|containsAll(kotlin.collections.Collection<kotlin.String>){}[0]
final fun equals(kotlin/Any?): kotlin/Boolean // io.ktor.server.routing/SegmentedPath.equals|equals(kotlin.Any?){}[0]
final fun get(kotlin/Int): kotlin/String // io.ktor.server.routing/SegmentedPath.get|get(kotlin.Int){}[0]
final fun hashCode(): kotlin/Int // io.ktor.server.routing/SegmentedPath.hashCode|hashCode(){}[0]
final fun indexOf(kotlin/String): kotlin/Int // io.ktor.server.routing/SegmentedPath.indexOf|indexOf(kotlin.String){}[0]
final fun isEmpty(): kotlin/Boolean // io.ktor.server.routing/SegmentedPath.isEmpty|isEmpty(){}[0]
final fun iterator(): kotlin.collections/Iterator<kotlin/String> // io.ktor.server.routing/SegmentedPath.iterator|iterator(){}[0]
final fun lastIndexOf(kotlin/String): kotlin/Int // io.ktor.server.routing/SegmentedPath.lastIndexOf|lastIndexOf(kotlin.String){}[0]
final fun listIterator(): kotlin.collections/ListIterator<kotlin/String> // io.ktor.server.routing/SegmentedPath.listIterator|listIterator(){}[0]
final fun listIterator(kotlin/Int): kotlin.collections/ListIterator<kotlin/String> // io.ktor.server.routing/SegmentedPath.listIterator|listIterator(kotlin.Int){}[0]
final fun subList(kotlin/Int, kotlin/Int): kotlin.collections/List<kotlin/String> // io.ktor.server.routing/SegmentedPath.subList|subList(kotlin.Int;kotlin.Int){}[0]
final fun toString(): kotlin/String // io.ktor.server.routing/SegmentedPath.toString|toString(){}[0]
}

open class <#A: kotlin/Any> io.ktor.server.application/CallContext { // io.ktor.server.application/CallContext|null[0]
final val pluginConfig // io.ktor.server.application/CallContext.pluginConfig|{}pluginConfig[0]
final fun <get-pluginConfig>(): #A // io.ktor.server.application/CallContext.pluginConfig.<get-pluginConfig>|<get-pluginConfig>(){}[0]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,10 @@ public data class HostRouteSelector(
require(hostList.isNotEmpty() || hostPatterns.isNotEmpty() || portsList.isNotEmpty())
}

override suspend fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation {
override suspend fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation =
evaluateSync(context, segmentIndex)

override fun evaluateSync(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation {
val requestHost = context.call.request.origin.serverHost
val requestPort = context.call.request.origin.serverPort

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ public fun Route.localPort(port: Int, build: Route.() -> Unit): Route {
public data class LocalPortRouteSelector(val port: Int) : RouteSelector() {

override suspend fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation =
evaluateSync(context, segmentIndex)

override fun evaluateSync(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation =
if (context.call.request.local.localPort == port) {
val parameters = parametersOf(LocalPortParameter, port.toString())
RouteSelectorEvaluation.Success(RouteSelectorEvaluation.qualityConstant, parameters)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,15 +296,18 @@ private fun Route.createRouteFromRegexPath(regex: Regex): Route {
*/
public class PathSegmentRegexRouteSelector(public val regex: Regex) : RouteSelector(), RoutePathComponent {

override suspend fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation {
override suspend fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation =
evaluateSync(context, segmentIndex)

override fun evaluateSync(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation {
val prefix = if (regex.pattern.startsWith('/') || regex.pattern.startsWith("""\/""")) "/" else ""
val postfix = if (regex.pattern.endsWith('/') && context.call.ignoreTrailingSlash) "/" else ""
val pathSegments = context.segments.drop(segmentIndex).joinToString("/", prefix, postfix)
val result = regex.find(pathSegments) ?: return RouteSelectorEvaluation.Failed

val segmentIncrement = result.value.length.let { consumedLength ->
if (pathSegments.length == consumedLength) {
context.segments.size - segmentIndex
context.segmentsSize - segmentIndex
} else if (pathSegments[consumedLength] == '/') {
countSegments(result, consumedLength, prefix)
} else if (consumedLength >= 1 && pathSegments[consumedLength - 1] == '/') {
Expand Down
Loading