[iOS] URLRequestのheaderに小文字のauthorizationを設定しても大文字に置き換えられてしまう

2021.05.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。きんくまです。

今回はタイトルの通りでして、
「URLRequestのheaderに小文字のauthorizationを設定しても大文字に置き換えられてしまう」です。

検証コード

HTTPヘッダーに小文字からはじまるauthorizationと、適当なx-custom-keyというのを設定します。

    private func makeRequest() -> AnyPublisher<[Todo], Error>? {
        guard let url = URL(string:  "https://jsonplaceholder.typicode.com/todos/") else {
            return nil
        }
        var req = URLRequest(url: url)
        req.addValue("abcdefg", forHTTPHeaderField: "authorization")
        req.addValue("12345", forHTTPHeaderField: "x-custom-key")
        
        if let header = req.allHTTPHeaderFields {
            print("\(header)") //=> 出力
        }
        return URLSession.shared.dataTaskPublisher(for: req)
            .tryMap { (data, response) -> Data in
                guard let httpRes = response as? HTTPURLResponse,
                      200 ..< 300 ~= httpRes.statusCode  else {
                    throw TodoError.invalidHttpStatusCode
                }
                return data
            }
            .decode(type: [Todo].self, decoder: JSONDecoder())
            .eraseToAnyPublisher()
    }

出力です。小文字設定のauthorizationは大文字始まりのAuthorizationに変更されるが、
x-custom-keyの方はそのままになっていることが確認できます。

["x-custom-key": "12345", "Authorization": "abcdefg"]

対応方法

いろいろ探したのですがなさそうです、、。残念

経緯

HTTP/2だと小文字のみ受け付けるという制限があり、Alamofireで小文字始まりでHTTPヘッダーを設定したところ、サーバーにはじかれましたw

参考
HTTP/1.x⇒HTTP/2 仕様変更で困ったこと (利用暗号の制約・httpヘッダーの小文字化)

Alamofireで何かやっているのかな?と思ったのですが、URLRequestがやってました。OSレベルでやっていたらどうしようもないですね。
How to send apikey in header in Alamofire 4.5,Swift 4?

ではでは