この記事はkdnaktの1人 Advent Calendar 2020の23日目の記事です(2日遅れ)。
2020年は会社でKotlin dojoを主催して週1回30分Kotlinと戯れていました。12月はその集大成ということで、Kotlin/NativeでHTTPサーバーを作ってみたいと思います。どこまでできるか、お楽しみ……。
[アクセス日時を出力する]
アクセスログを出力する際に、いい感じにアクセス日時を出力したいと考えています。
標準ライブラリの中にはちょうどよさそうなものが見当たらなかったので、2020年8月にリリースされたkotlinx-datetimeというライブラリを利用します。
まず、README.mdにしたがってbuild.gradle.kts
にMavenリポジトリと依存関係を追加します。
repositories { mavenCentral() // kotlinx-datetime用に以下を追加 maven("https://kotlin.bintray.com/kotlinx/") } kotlin { macosX64("native") { // 省略 } // kotlinx-datetime用に以下を追加 sourceSets { commonMain { dependencies { implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.1.1") } } } }
アクセスログの出力部分にClock.System.now()で現在日時を出力するコードを追加します。インポート文を追加していないのでコンパイルエラーが出ます。
IntelliJに自動でインポート文を追加させようとすると、kotlin.timeという標準ライブラリのパッケージがサジェストされてしまいます。
仕方がないので、手動でインポート文を追加します。
GitHubでソースを確認すると、パッケージ名はkotlinx.datetimeとなっているので、以下のようになります。
kotlinx-cliを追加したときと同様、しばらくIntelliJ上ではコンパイルエラーが表示され続けますが、そのうち消えるはずなので無視します。gradle clean buildでビルドが通るようになりました。
HTTPサーバーを起動して動作確認をしてみます。http://localhost:8080/index.html
にアクセスすると、以下のようなログが出力されました。
[DEBUG #1: ]: loaded request header 2020-12-25T00:48:28.239460Z GET /index.html HTTP/1.1 Host: localhost:8080 // 以下省略
アクセスしたのは日本時間の2020年12月25日午前9時48分でしたが、タイムゾーンがUTCで表示されてしまっています。日本時間に変更するためには、コードを以下のように修正します。
// 修正前 Clock.System.now() // 修正後 Clock.System.now().toLocalDateTime(TimeZone.of("Asia/Tokyo"))
動作確認をすると以下のようになります。
[DEBUG #1: ]: loaded request header 2020-12-25T09:54:21.547777 GET /index.html HTTP/1.1 Host: localhost:8080
タイムゾーン情報が表示されないので、やや分かりにくいですが、kotlinx-datetimeには2020年12月現在、柔軟なフォーマットを実現する機能はありません。
README.mdには上記のように記載されていますし、以下のようにissueも登録されています。