Ktor 3.5.0 の新機能
Ktor 3.5.0 では、サーバーとクライアントの両方でさまざまな改善が行われました。この機能リリースの主なハイライトは以下の通りです。
- RFC 7616 ダイジェスト認証のサポート
- ルート設定のデータクラスへのマッピング
- 変更時のみセッションクッキーを送信
- OkHttp および Apache5 クライアントエンジンにおけるカスタム DNS リゾルバー
Ktor Server
RFC 7616 ダイジェスト認証のサポート
Ktor 3.5.0 では、digest 認証プロバイダーが RFC 7616 に準拠するように更新され、セキュリティが向上し、最新のダイジェスト機能がサポートされました。
このリリースでは、以下の変更が導入されています。
algorithmsプロパティを使用して、複数のハッシュアルゴリズムを構成できるようになりました。複数の値が指定されている場合、Ktor は複数のWWW-Authenticateヘッダーを送信し、クライアントがサポートされている最も強力なオプションを選択できるようにします。- 文字列ベースの構成を置き換えるために、
DigestAlgorithmおよびDigestQop列挙型が導入されました。 digestProvider {}ラムダがalgorithmパラメータを受け取るようになり、正しいダイジェストを動的に計算できるようになりました。- RFC 7616 に基づき、
qopパラメータが認証チャレンジに含まれるようになりました。 SHA-256-sessやSHA-512-256-sessなどのセッションベースのアルゴリズムのサポートが追加されました。- プライバシー保護を向上させるため、RFC 7616 のユーザー名ハッシュ化(
userhash)のサポートが追加されました。
以下の例は、レガシーな構成から RFC 7616 準拠の API に移行する方法を示しています。
既存の構成は変更なしで引き続き動作します。ただし、新しいアプリケーションでは、以下のことが推奨されます。
SHA-512-256やSHA-256などの安全なアルゴリズムを使用する。- 新しい
algorithmsパラメータを使用するようにdigestProviderを更新する。 - レガシーなクライアントとの互換性が必要な場合を除き、
MD5ベースのアルゴリズムを避ける。
詳細なガイドについては、Ktor Server でのダイジェスト認証を参照してください。
カスタムプロバイダーにおけるサスペンド .authenticate() オーバーロード
カスタム認証プロバイダーで、サスペンドバージョンの DynamicProviderConfig.authenticate() 関数を実装できるようになりました。.authenticate() 関数はサスペンドラムダを受け入れるため、認証内でコルーチン API を直接呼び出すことができます。
install(Authentication) {
provider("custom") {
authenticate { context ->
delay(10.milliseconds)
context.principal(null)
}
}
}ルート設定のデータクラスへのマッピング
ApplicationConfig で、設定全体をデータクラスにデシリアライズするための .getAs() 関数が提供されるようになりました。
以前は、デシリアライズは個々のプロパティに限定されており、.property() 関数を介してアクセスする必要がありました。ルートレベルのサポートにより、設定構造全体を単一のデータクラスに直接マッピングできます。
リクエストパラメータ取得のためのヘルパー関数
Ktor 3.5.0 では、ApplicationCall から必須のリクエストデータへのアクセスを簡素化する新しい拡張関数のセットが導入されました。
以前は、必須のリクエストデータの検証には、繰り返しの null チェックやラベル付きリターンが必要になることがよくありました。このワークフローを改善するために、Ktor は以下の新しい拡張関数を提供します。
ApplicationCall.requireQueryParameter()— リクエスト URL から必須のクエリパラメータを取得します。パラメータが欠落している場合はスローします。ApplicationCall.requireHeader()— 必須の HTTP ヘッダー値を取得します。ヘッダーがリクエストに存在しない場合はスローします。ApplicationCall.requireCookie()— 必須のクッキー値を取得し、必要に応じて指定されたエンコーディングを使用してデコードします。クッキーが欠落している場合はスローします。RoutingCall.requirePathParameter()— ルート定義から必須のパスパラメータを取得します。パラメータがマッチしたルートに存在しない場合はスローします。
各関数は非 null 値を返すか、値が欠落している場合に MissingRequestParameterException をスローします。
ktor-network の ES モジュール互換性
ES モジュールが有効な場合に ktor-network およびすべての依存モジュールを使用できなくなる問題を修正しました。
将来のデグレードを防ぐため、JavaScript テストインフラストラクチャはデフォルトで ES2015 と ES モジュールの両方をターゲットにするようになりました。
Kotlin/JS モジュールシステムと ES2015 サポートの詳細については、以下を参照してください。
変更時のみセッションクッキーを送信
Ktor 3.5.0 では、Sessions プラグインに、セッションデータが変更された場合にのみ送信する(例:クッキーベースのセッションにおける Set-Cookie ヘッダー)新しいオプションが導入されました。
デフォルトでは、既存の動作を維持するためにセッションデータはすべてのレスポンスで送信されます。変更時のみ送信するには、セッションクッキー構成で sendOnlyIfModified フラグを有効にします。
install(Sessions) {
cookie<MySession>("SESSION") {
sendOnlyIfModified = true
}
}カスタム SSE ハートビートイベント
このリリースでは、イベントプロバイダー関数を使用してハートビートイベントを完全にカスタマイズできる、Ktor サーバーサイド SSE サポートの新しいオプションが導入されました。
heartbeat {
period = 30.milliseconds
eventProvider = { ServerSentEvent(data = "ts=${Clock.System.now()}") }
}これにより、タイムスタンプやステータス情報などのカスタムハートビートペイロードを一定の間隔で送信できるようになります。
Ktor Client
OkHttp および Apache5 エンジンにおけるカスタム DNS リゾルバー
Ktor 3.5.0 では、OkHttp および Apache5 クライアントエンジンでカスタム DNS リゾルバーを構成するための第一級のサポートが追加されました。
以前は、OkHttp の config {} や Apache5 の configureConnectionManager { setDnsResolver(...) } など、エンジン固有の内部にアクセスしてカスタム DNS 解決を構成していました。Ktor は、一貫性があり型安全な API を提供するために、各エンジンに専用의 構成プロパティを公開するようになりました。
OkHttp
OkHttpConfig.dns プロパティを使用して、OkHttp でカスタム DNS リゾルバーを構成できるようになりました。
HttpClient(OkHttp) {
engine {
dns = Dns { hostname -> listOf(InetAddress.getByName("127.0.0.1")) }
}
}dns プロパティを構成しない場合、OkHttp エンジンは引き続き OkHttp デフォルトの Dns.SYSTEM リゾルバーを使用します。
Apache5
Apache5EngineConfig.dnsResolver プロパティを使用して、Apache5 でカスタム DNS リゾルバーを構成できるようになりました。
HttpClient(Apache5) {
engine {
dnsResolver = SystemDefaultDnsResolver.INSTANCE
}
}dnsResolver プロパティが構成されていない場合、Apache5 エンジンは引き続き Apache クライアントのデフォルトの DNS リゾルバーを使用します。
