FlyingFox icon indicating copy to clipboard operation
FlyingFox copied to clipboard

How to proxy large file downloads

Open Kumhy opened this issue 11 months ago • 1 comments

Alamofire can be replaced by URLSession

struct ProxyStreamHandler: HTTPHandler {
    let session: Session
    
    private init() {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 30
        configuration.timeoutIntervalForResource = 30
        session = Session(configuration: configuration)
    }
    
    func handleRequest(_ request: HTTPRequest) async throws -> HTTPResponse {
        guard
            let proxyUrl = request.query.first(where: { $0.name == "url" })?
                .value,
            let url = URL(string: proxyUrl)
        else {
            return HTTPResponse(statusCode: .badRequest)
        }

        var headers = Alamofire.HTTPHeaders()
        request.headers.forEach { k, v in
            headers.add(name: k.rawValue.lowercased(), value: v)
        }

        do {
            session.streamRequest(url, method: .get, headers: headers)
            
            var resBody = af return body
            var resHeaders: [FlyingFox.HTTPHeader: String] = af return body
            var resStatusCode: HTTPStatusCode = .badRequest = af return statusCode

            return try HTTPResponse(
                statusCode: resStatusCode,
                headers: resHeaders,
                body: resBody
            )
        } catch {
            return HTTPResponse(statusCode: .badRequest)
        }
    }
}

Kumhy avatar Jan 16 '25 11:01 Kumhy