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

88 lines
2.8 KiB
Swift

//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
public import SignalRingRTC
public class CallHTTPClient {
public let ringRtcHttpClient: SignalRingRTC.HTTPClient
public init() {
self.ringRtcHttpClient = SignalRingRTC.HTTPClient()
self.ringRtcHttpClient.delegate = self
}
}
// MARK: - HTTPDelegate
extension CallHTTPClient: HTTPDelegate {
/**
* A HTTP request should be sent to the given url.
* Invoked on the main thread, asychronously.
* The result of the call should be indicated by calling the receivedHttpResponse() function.
*/
public func sendRequest(requestId: UInt32, request: HTTPRequest) {
AssertIsOnMainThread()
let session = OWSURLSession(
securityPolicy: OWSURLSession.signalServiceSecurityPolicy,
configuration: OWSURLSession.defaultConfigurationWithoutCaching,
canUseSignalProxy: true
)
session.require2xxOr3xx = false
session.allowRedirects = true
session.customRedirectHandler = { redirectedRequest in
var redirectedRequest = redirectedRequest
if let authHeader = request.headers.first(where: {
$0.key.caseInsensitiveCompare("Authorization") == .orderedSame
}) {
redirectedRequest.setValue(authHeader.value, forHTTPHeaderField: authHeader.key)
}
return redirectedRequest
}
Task { @MainActor in
do {
let response = try await session.performRequest(
request.url,
method: request.method.httpMethod,
headers: request.headers,
body: request.body
)
self.ringRtcHttpClient.receivedResponse(
requestId: requestId,
response: response.asRingRTCResponse
)
} catch {
if error.isNetworkFailureOrTimeout {
Logger.warn("Peek client HTTP request had network error: \(error)")
} else {
owsFailDebug("Peek client HTTP request failed \(error)")
}
self.ringRtcHttpClient.httpRequestFailed(requestId: requestId)
}
}
}
}
extension SignalRingRTC.HTTPMethod {
var httpMethod: SignalServiceKit.HTTPMethod {
switch self {
case .get: return .get
case .post: return .post
case .put: return .put
case .delete: return .delete
}
}
}
extension SignalServiceKit.HTTPResponse {
var asRingRTCResponse: SignalRingRTC.HTTPResponse {
return SignalRingRTC.HTTPResponse(
statusCode: UInt16(responseStatusCode),
body: responseBodyData
)
}
}