ActivityPub実装作っていて欲しくなったので作りました。
Acceptヘッダーを見て判断
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.routing.*
class AcceptContentTypeRouteSelector(private vararg val contentType: ContentType) : RouteSelector() {
override fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation {
val requestContentType =
ContentType.parse(context.call.request.accept() ?: return RouteSelectorEvaluation.FailedParameter)
return if (contentType.any { contentType -> contentType.match(requestContentType) }) {
RouteSelectorEvaluation.Constant
} else {
RouteSelectorEvaluation.FailedParameter
}
}
}
ContentTypeで判断
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.routing.*
class ContentTypeRouteSelector(private vararg val contentType: ContentType) : RouteSelector() {
override fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation {
val requestContentType = context.call.request.contentType() ?: return RouteSelectorEvaluation.FailedParameter
return if (contentType.any { contentType -> contentType.match(requestContentType) }) {
RouteSelectorEvaluation.Constant
} else {
RouteSelectorEvaluation.FailedParameter
}
}
}
使い方
この例の場合 /json
にAcceptヘッダーがapplication/json
でGETリクエストが来たときにマッチします。
fun Application.routing(){
routing {
get("/json"){
createChild(AcceptContentTypeRouteSelector(ContentType.Application.Json)).handle {
//ここからは通常のルーティング処理と同じ
call.respond(HttpStatusCode.Ok)
}
}
}
}
参考