feat(sdk): 添加大小写不敏感的 HTTP 响应头读取方法
This commit is contained in:
@@ -154,7 +154,7 @@ extension DuooomiBleSDK {
|
|||||||
completion(.failure(DuooomiBleError.transferFailed("Format check failed: \(error.localizedDescription)")))
|
completion(.failure(DuooomiBleError.transferFailed("Format check failed: \(error.localizedDescription)")))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
guard let mime = (response as? HTTPURLResponse)?.allHeaderFields["Content-Type"] as? String else {
|
guard let mime = (response as? HTTPURLResponse)?.headerValue(caseInsensitive: "Content-Type") else {
|
||||||
completion(.failure(DuooomiBleError.unsupportedFormat("unknown")))
|
completion(.failure(DuooomiBleError.unsupportedFormat("unknown")))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -183,7 +183,7 @@ extension DuooomiBleSDK {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let http = response as? HTTPURLResponse {
|
if let http = response as? HTTPURLResponse {
|
||||||
if let lengthStr = http.allHeaderFields["Content-Length"] as? String,
|
if let lengthStr = http.headerValue(caseInsensitive: "Content-Length"),
|
||||||
let length = Int(lengthStr), length > 0 {
|
let length = Int(lengthStr), length > 0 {
|
||||||
completion(.success(length))
|
completion(.success(length))
|
||||||
return
|
return
|
||||||
@@ -209,7 +209,7 @@ extension DuooomiBleSDK {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if let http = response as? HTTPURLResponse,
|
if let http = response as? HTTPURLResponse,
|
||||||
let rangeHeader = http.allHeaderFields["Content-Range"] as? String,
|
let rangeHeader = http.headerValue(caseInsensitive: "Content-Range"),
|
||||||
let totalStr = rangeHeader.split(separator: "/").last,
|
let totalStr = rangeHeader.split(separator: "/").last,
|
||||||
let total = Int(totalStr), total > 0 {
|
let total = Int(totalStr), total > 0 {
|
||||||
completion(.success(total))
|
completion(.success(total))
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ final class BeijingTimeProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let http = resp as? HTTPURLResponse,
|
if let http = resp as? HTTPURLResponse,
|
||||||
let dateHeader = (http.allHeaderFields["Date"] ?? http.allHeaderFields["date"]) as? String,
|
let dateHeader = http.headerValue(caseInsensitive: "Date"),
|
||||||
let value = self.formatHTTPDateHeader(dateHeader) {
|
let value = self.formatHTTPDateHeader(dateHeader) {
|
||||||
done(value)
|
done(value)
|
||||||
return
|
return
|
||||||
|
|||||||
19
Sources/DuooomiBleSDK/Utils/HTTPURLResponse+Header.swift
Normal file
19
Sources/DuooomiBleSDK/Utils/HTTPURLResponse+Header.swift
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import Foundation
|
||||||
|
|
||||||
|
extension HTTPURLResponse {
|
||||||
|
/// 大小写不敏感地读取 HTTP 响应头。
|
||||||
|
///
|
||||||
|
/// HTTP/2(RFC 7540 §8.1.2)强制把头字段名小写(如 `content-length`),而
|
||||||
|
/// `allHeaderFields` 的字典下标是大小写敏感精确匹配,直接用 `["Content-Length"]`
|
||||||
|
/// 在 HTTP/2 响应下会取不到值。系统的 `value(forHTTPHeaderField:)` 能规避,但要求
|
||||||
|
/// iOS 13+,本 SDK 最低支持 iOS 12,故手动遍历比较。
|
||||||
|
func headerValue(caseInsensitive name: String) -> String? {
|
||||||
|
for (key, value) in allHeaderFields {
|
||||||
|
if let keyStr = key as? String,
|
||||||
|
keyStr.caseInsensitiveCompare(name) == .orderedSame {
|
||||||
|
return value as? String
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user