NetworkConfig
@objcMembers
@objc(BMPNetworkConfig)
public class NetworkConfig : NSObject, @unchecked Sendable
The network config gives the ability to influence network requests.
-
Type definition for the handler that allows changing HTTP requests.
Note
Customize the preprocessing logic based on the request type and request details to optimize request handling.
Note
While it’s possible to preprocess all HTTP requests, it’s important to tailor your logic to the specific type of request being handled. Extensive processing might potentially lead to playback delays or timeouts.
Declaration
Swift
public typealias PreprocessHttpRequestHandler = ( _ type: HttpRequestType, _ request: HttpRequest, _ completionHandler: @escaping (_ request: HttpRequest) -> Void ) -> Void
Parameters
type
The type of the request.
request
The request that should be modified.
completionHandler
Completion handler which must be called with the modified HTTP request.
-
Type definition for the handler that needs to be called if a retry should happen from
RetryHttpRequestHandler
.Note
Ensure that the retry delay is appropriate for the failure scenario to avoid overwhelming the server or client.
Declaration
Swift
public typealias RetryHandler = (_ retryDelay: TimeInterval, _ request: HttpRequest) -> Void
Parameters
retryDelay
The delay in seconds before the retry should happen.
request
The request that should be retried. This can be the original failed request or a modified version of it.
-
Type definition for the handler that needs to be called if no retry should happen from
RetryHttpRequestHandler
.Declaration
Swift
public typealias AbortHandler = () -> Void
-
Type definition to implement custom retry behavior for failed HTTP requests. Implementing it allows to define how and when retries should occur based on the request type, retry attempt, and response.
Note
Customize the retry logic based on the type of request, number of retries, and response details to optimize request handling.
Declaration
Swift
public typealias RetryHttpRequestHandler = ( _ type: HttpRequestType, _ retry: Int, _ response: HttpResponse, _ retryHandler: @escaping RetryHandler, _ abortHandler: @escaping AbortHandler ) -> Void
Parameters
type
The type of the failed request.
retry
The current retry attempt number.
response
The response of the failed request, which contains a reference to the failed request.
retryHandler
A handler that must be called if a retry should happen, specifying the delay and the request to retry. Not calling this handler or
abortHandler
will result in a timeout (~20 seconds) imposed by AVFoundation, causing the request to fail.abortHandler
A handler that must be called if no retry should happen. Not calling this handler or
retryHandler
will result in a timeout (~20 seconds) imposed by AVFoundation, causing the request to fail. -
Type definition for the handler that allows processing HTTP responses.
Note
Customize the preprocessing logic based on the request type and response details to optimize response handling.
Note
While it’s possible to preprocess all HTTP responses, it’s important to tailor your logic to the specific type of request being handled. Extensive processing might potentially lead to playback delays or timeouts.
Declaration
Swift
public typealias PreprocessHttpResponseHandler = ( _ type: HttpRequestType, _ response: HttpResponse, _ completionHandler: @escaping (_ response: HttpResponse) -> Void ) -> Void
Parameters
type
The type of the request.
response
The response of the request.
completionHandler
A completion handler that must be called with the modified HTTP response. Not calling the completion handler prevents the HTTP response from being consumed and blocks the player.
-
Called before an HTTP request is made. This delegate allows modifying the request parameters before the request is sent.
Limitations
- Requests of type
HttpRequestType.keyHlsAes
are not supported. Requests of type
HttpRequestType.mediaSubtitles
are only supported for side-loaded subtitles.
Note
Implement the
PreprocessHttpRequestDelegate
protocol to customize the preprocessing of supported HTTP requests.Declaration
Swift
@available(*, deprecated, message: "Use preprocessHttpRequest instead.") public weak var preprocessHttpRequestDelegate: PreprocessHttpRequestDelegate?
- Requests of type
-
Called before an HTTP request is made. This property can be used to modify the request parameters before the request is sent.
Usage Example:
networkConfig.preprocessHttpRequest = { type, request, completionHandler in var modifiedRequest = httpRequest // Modify the request based on the type switch type { case .drmLicenseFairplay: // Example modification for DRM requests modifiedRequest.headers["Authorization"] = "Bearer someAccessToken" case .manifestHlsMaster: // Example modification for HLS Playlist requests modifiedRequest.url = modifiedRequest.url.appendingPathComponent("modified") default: break } // Call the completion handler with the modified request completionHandler(modifiedRequest) }
Limitations
- Requests of type
HttpRequestType.keyHlsAes
are not supported. Requests of type
HttpRequestType.mediaSubtitles
are only supported for side-loaded subtitles.
Note
Refer to the
PreprocessHttpRequestHandler
documentation for additional information.Declaration
Swift
public var preprocessHttpRequest: PreprocessHttpRequestHandler?
-
Called when an HTTP request has failed. This property allows you to override the default retry behavior with a custom handler.
A request is considered failed if the HTTP response status code is not within the 200-299 range:
let success = response.statusCode >= 200 && response.statusCode < 300
Usage Example:
let retryHttpRequestHandler = { requestType, retryCount, response, retryHandler, abortHandler in // Retry 3 times guard retryCount <= 3 else { // Abort retrying when threshold was reached abortHandler() return } // Customize delay for the next retry. For instance use exponential backoff: let retryDelay: TimeInterval = exp(0.25 * Double(retryCount)) // Retry the original request again retryHandler(retryDelay, response.request) }
Default Behavior
If no custom handler is provided, the default retry logic will be applied:
- The request will be retried up to a maximum of 3 times.
- The delay between retries is calculated using a custom exponential backoff formula, with a maximum
delay of 5 seconds:
- For each retry attempt, the delay is determined by the formula
exp(0.25 * retryCount)
, which produces a gradually increasing delay. - The delay is capped at 5 seconds to ensure retries occur within a reasonable timeframe.
- For each retry attempt, the delay is determined by the formula
- If the retry count exceeds 3 attempts, the request will not be retried, and the
abortHandler
will be called.
Customization
When a custom
retryHttpRequest
handler is set, no internal retry handling is done at all. The custom handler needs to manage all retries. Some considerations for implementing your own handler include:- Ensure to set a maximum number of allowed retries to avoid retrying an unreasonable number of times.
- Be aware of an underlying
AVFoundation
limit of approximately 20 seconds for performing retries. If a failed request is not successfully retried within that timeframe, an error will occur. Within that 20-second window, the number of retries that can be performed is unlimited.
Limitations
- Requests of type
HttpRequestType.keyHlsAes
are not supported. Requests of type
HttpRequestType.mediaSubtitles
are only supported for side-loaded subtitles.
Note
Refer to the
RetryHttpRequestHandler
documentation for detailed usage examples and additional information.Declaration
Swift
public var retryHttpRequest: RetryHttpRequestHandler?
-
Called after an HTTP response is received. This property can be used to access or change properties of the response before it gets into the player.
Usage Example:
let preprocessHttpResponseHandler: NetworkConfig.PreprocessHttpResponseHandler = { type, response, completionHandler in var modifiedResponse = response // Modify the response as needed based on the request type switch type { case .manifestHlsVariant: modifiedResponse = modifyResponseForHlsVariantType(response) case .mediaSubtitles: modifiedResponse = modifyResponseForMediaPosterType(response) default: break } // Call the completion handler with the modified response completionHandler(modifiedResponse) }
Limitations
- Requests of type
HttpRequestType.keyHlsAes
are not supported. Requests of type
HttpRequestType.mediaSubtitles
are only supported for side-loaded subtitles.
Note
Refer to the
PreprocessHttpResponseHandler
documentation for a detailed usage example and additional information.Declaration
Swift
public var preprocessHttpResponse: PreprocessHttpResponseHandler?