TM-SGNL-iOS/SignalServiceKit/tests/Network/OWSHttpHeadersTest.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

120 lines
4.8 KiB
Swift

//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import XCTest
@testable import SignalServiceKit
class OWSHttpHeadersTest: XCTestCase {
func testFormatAcceptLanguageHeader() throws {
func chars(_ str: String) -> [String] {
str.map { String($0) }
}
let testCases: [[String]: String] = [
[]: "*",
["invalid!"]: "*",
["bad1", "bad2", "no_unders", "itstoolong", "en--", "en--us", "en-*stars*", "en-**"]: "*",
["en-US"]: "en-US",
["en-*"]: "en-*",
["*-US"]: "*-US",
["*-*"]: "*-*",
["a-b-c2-d"]: "a-b-c2-d",
["bad1", "ok", "bad2"]: "ok",
// This was an actual string sent from someone's device, so we test that it's ignored.
["en-US@attribute=isk", "de"]: "de",
["a", "b", "c"]: "a, b;q=0.9, c;q=0.8",
["a", "b", "bad123", "c"]: "a, b;q=0.9, c;q=0.8",
chars("abcdefghij"): "a, b;q=0.9, c;q=0.8, d;q=0.7, e;q=0.6, f;q=0.5, g;q=0.4, h;q=0.3, i;q=0.2, j;q=0.1",
chars("abcdefghijklmnopqrst"): "a, b;q=0.9, c;q=0.8, d;q=0.7, e;q=0.6, f;q=0.5, g;q=0.4, h;q=0.3, i;q=0.2, j;q=0.1",
chars("a!b@c#d$e%f^g&h(i)j_"): "a, b;q=0.9, c;q=0.8, d;q=0.7, e;q=0.6, f;q=0.5, g;q=0.4, h;q=0.3, i;q=0.2, j;q=0.1"
]
for (languages, expected) in testCases {
let actual = OWSHttpHeaders.formatAcceptLanguageHeader(languages)
XCTAssertEqual(actual, expected, "Input: \(languages)")
}
}
func testAcceptLanguageHeaderValue() throws {
let expected = OWSHttpHeaders.formatAcceptLanguageHeader(Locale.preferredLanguages)
let actual = OWSHttpHeaders.acceptLanguageHeaderValue
XCTAssertEqual(actual, expected)
}
func testDebugDescription() {
let httpHeaders = OWSHttpHeaders()
httpHeaders.addHeader("Retry-After", value: "Wed, 21 Oct 2015 07:28:01 GMT", overwriteOnConflict: true)
httpHeaders.addHeader("x-signal-timestamp", value: "1669077270", overwriteOnConflict: true)
httpHeaders.addHeader("Content-Type", value: "text/plain", overwriteOnConflict: true)
XCTAssertEqual(
"\(httpHeaders)",
"<OWSHttpHeaders: [content-type; retry-after: Wed, 21 Oct 2015 07:28:01 GMT; x-signal-timestamp: 1669077270]>"
)
}
/// Test weird behavior with Apple's allHTTPHeaderFields property.
func testURLRequestAllHTTPHeaderFields() {
var urlRequest = URLRequest(url: URL(string: "https://signal.org")!)
urlRequest.allHTTPHeaderFields = ["Retry-After": "1234", "X-Custom": "Value 1"]
// this does *not* clear any headers
urlRequest.allHTTPHeaderFields = nil
// this does *not* clear all headers
urlRequest.allHTTPHeaderFields = [:]
// this does *not* clear missing headers
urlRequest.allHTTPHeaderFields = ["x-custom": "Value 2"]
XCTAssertEqual(urlRequest.value(forHTTPHeaderField: "X-Custom"), "Value 2")
XCTAssertEqual(urlRequest.value(forHTTPHeaderField: "Retry-After"), "1234")
}
func testRetryAfter() {
let now = Date().timeIntervalSince1970
let testCases: [(String?, TimeInterval?)] = [
// Reference: date -jf '%a, %d %b %Y %T %Z' <Value> +%s
("Thu, 01 Jan 1970 00:00:00 GMT", 0),
("Wed, 21 Oct 2015 07:28:01 GMT", 1445412481),
// Reference: date -jf '%Y-%m-%dT%T%z' <Value> +%s
("1970-01-01T00:00:00+0000", 0),
("1969-12-31T16:00:00-0800", 0),
("2015-10-21T07:28:01+0000", 1445412481),
("2015-10-20T23:28:01-0800", 1445412481),
// Relative delays
("1", now + 1),
("2", now + 2),
("1200.0", now + 1200),
("1200.5", now + 1200.5),
("86400.000", now + 86400),
(" 86400.000 ", now + 86400),
(" \t \t86400.000\t \t ", now + 86400),
// Invalid values (these used a default of 60)
("8/11/1994 01:02:03", now + 60),
("blahhh", now + 60),
("one", now + 60),
("soon", now + 60),
("later", now + 60),
// Absent values (these use nil)
(nil, nil),
("", nil),
(" ", nil),
("\n", nil)
]
for (headerValue, expectedTimeInterval) in testCases {
let actualTimeInterval = OWSHttpHeaders.parseRetryAfterHeaderValue(headerValue)?.timeIntervalSince1970
if let expectedTimeInterval, let actualTimeInterval {
XCTAssertEqual(actualTimeInterval, expectedTimeInterval, accuracy: 0.3, "\(headerValue ?? "nil")")
} else {
XCTAssertEqual(actualTimeInterval, expectedTimeInterval, "\(headerValue ?? "nil")")
}
}
}
}