Ktor 1.5.0リリースノート（翻訳）

## この記事について
去る2020/12/22に[Ktor](https://ktor.io/) ver1.5.0がリリースされました。
この記事はJetBrains社のブログに掲載されているリリースノートを翻訳したものです。
https://blog.jetbrains.com/ktor/2020/12/22/ktor-1-5-0-released/
大いに意訳を含んでいるので、元記事をしっかり確認しましょう。

## Features
1.5.0は今年の三度目かつ最後のリリースで、年に3回のメジャーリリースまたはマイナーリリース、月に最低1回のパッチリリースを行うという私達の約束に沿ったものです。時折遅れることもありましたが、多かれ少なかれこの約束を守ることができて嬉しく思います。
このマイナーアップデートでは次のような新機能があります。

### 新しい開発モード
Ktorは開発向けの一連機能、たとえば[auto-reload](https://ktor.io/docs/autoreload.html)や拡張でバック情報等を提供しています。これらは開発中に役立ちますが、本番環境では速度低下する可能性があります。1.5.0ではシンプルな構成もしくはフラグで新しい開発モードを有効にできる機能を導入しています。また本番環境の設定を簡単に切り替えることができます。
この機能は`application.conf`内で`development=true`の記述を利用することでアクティブ化できます。

 *auto-reloadはこの新しい開発モードでのみ有効になっているため、これは重要な変更です。*

### Java HTTP Clientのサポート
Java11ではリアクティブストリームに基づく[HTTP Client](https://openjdk.java.net/groups/net/httpclient/intro.html)が導入されています。Ktor ClientはJVMをターゲットにしているとき、このHTTP Clientをサポートするようになりました。
これを使用するには、`HTTPClient`のパラメータに`Java`という値を渡すだけです。

```kotlin
    HttpClient(Java)
```

もちろん、これを利用するにはJava11が必要です。

### HttpRequestBuilderを介したCookieの送信をサポート
HttpRequestBuilderを利用する場合、`coolies`という名前の新しいメソッドを利用して簡単にCookieを送信できるようになります。

```kotlin
 cookies {
    append("my_cookie", value = "My cookie Value")
 }
```

### 事前圧縮されたファイルのサポート
既に圧縮されているファイルを送信した場合、Ktorがそのコンテンツを更に圧縮しようとしないようにします。`preCompressed`機能は簡単に利用できます。

```kotlin
static {
    preCompressed {
        files(temp.parentFile)
    }
}
```
コミュニテイのコントリビューターである[guicamest](https://github.com/ktorio/ktor/pull/540)の貢献に感謝します

### CORSでのカスタムヘッダーのサポート
CORSリクエストでカスタムヘッダーを許可するためのサポートが追加されました。通常、リクエスト内の任意のヘッダーを許可することは推奨されませんが特定のパターンに従うカスタムヘッダーをKtorで指定できます。

```kotlin
application.install(CORS) {
    anyHost()
    allowHeadersPrefixed("custom-")
}
```
この貢献をしてくれた[Joze](https://github.com/ktorio/ktor/pull/2034)に感謝します。

### 実験的なWebSocketと収縮の拡張機能
[WebSocketと収縮の拡張機能のサポート](https://youtrack.jetbrains.com/issue/KTOR-688)を導入しました。これにより[RFC-7692](https://tools.ietf.org/html/rfc7692)としての実装が提供されます。
この機能を利用するには、インストールしてください

```kotlin
install(WebSockets) {
    extensions { 
        install(WebSocketDeflateExtension) { 

            // Deflate option
            compressionLevel = Deflater.DEFAULT_COMPRESSION
        }
    }
}
```
そして、`extension`と`extensionOrNull`の2つの新しいメソッドのいずれかを利用して参照するだけです。

```kotlin
webSocket("/echo") {
    val myExtension = extension(MyWebSocketException) 
    // will throw if `MyWebSocketException` is not negotiated

    val myExtension = extensionOrNull(MyWebSocketException) ?: close() 
    // will close the session if `MyWebSocketException` is not negotiated
}
```

 *これは実験的なAPIであり、フィードバックをお待ちしております。*

### サーバーセッションで封印されネストされたクラスのサポート
サーバーセッションオブジェクトに封印/ネストされたクラスを含めることができます。

```kotlin
data class MySession(val id: String, kind: UserInfo) 

sealed class UserInfo() {
    data class Admin(val drafts: List<String>) : UserInfo()
    data class Reader(val ids: List<String>) : UserInfo()
}

install(Sessions) {
    cookie<MySession>("SESSION") 
}
```

### OkHttp WebSocket作成のオーバーライド
WebSocketを作成するときに利用されるWebSocketOkHttpの`WebSocket.Factory`を提供できるようになり、OkHttpを操作する際の柔軟性が向上します。
[Chris](https://github.com/ktorio/ktor/pull/2035)の貢献に感謝します。

### 適切な例外処理
Ktorは予期しない例外を正しく処理するようになりました。パイプラインで例外が発生した場合、実際の例外オブジェクトと共に `500 Internal Server Error`としてホストに返されます。これによりアプリケーション自体による例外処理が改善され、特定のステータスコード用にステータスページを構成する必要がなくなります。

上記の機能に加えて、1.5.0には[他の機能とバグ修正](https://ktor.io/changelog/1.5/)も含まれています。

## まとめ
翻訳は以上となります。自分がパッチノートを理解するためにまとめた記事になりますので、抜け漏れや間違いがありましたら編集リクエストをください。
新しい開発モードはぜひ活用したいところです。
全体的にはWebSocketまわりの機能が増えている印象です。
細かな使い勝手の部分（例外処理やネストしたクラスをセッションに設定可能になる）は地味ですが多くの人に恩恵があるのではないでしょうか