Kotlin/NativeでHTTPサーバーを作るアドベントカレンダー(23日目:kotlinx-datetime)

この記事はkdnaktの1人 Advent Calendar 2020の23日目の記事です(2日遅れ)。

 

2020年は会社でKotlin dojoを主催して週1回30分Kotlinと戯れていました。12月はその集大成ということで、Kotlin/NativeでHTTPサーバーを作ってみたいと思います。どこまでできるか、お楽しみ……。

 

 

[アクセス日時を出力する]

アクセスログを出力する際に、いい感じにアクセス日時を出力したいと考えています。

標準ライブラリの中にはちょうどよさそうなものが見当たらなかったので、2020年8月にリリースされたkotlinx-datetimeというライブラリを利用します。

discuss.kotlinlang.org

github.com

 

まず、README.mdにしたがってbuild.gradle.ktsMavenリポジトリと依存関係を追加します。

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()で現在日時を出力するコードを追加します。インポート文を追加していないのでコンパイルエラーが出ます。

f:id:kidani_a:20201225093718p:plain


IntelliJに自動でインポート文を追加させようとすると、kotlin.timeという標準ライブラリのパッケージがサジェストされてしまいます。 

f:id:kidani_a:20201225093835p:plain

 

仕方がないので、手動でインポート文を追加します。

GitHubでソースを確認すると、パッケージ名はkotlinx.datetimeとなっているので、以下のようになります。

f:id:kidani_a:20201225094255p:plain

 

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月現在、柔軟なフォーマットを実現する機能はありません。

f:id:kidani_a:20201225100230p:plain

README.mdには上記のように記載されていますし、以下のようにissueも登録されています。

github.com

 

[まとめ]

  • アクセス日時の出力のために、kotlinx-datetimeライブラリを試した
  • タイムゾーンの変更はできたが、出力時のフォーマット変更はまだ実装されていなかった
  • 実装中のコードは以下のリポジトリにまとめてある

github.com