Skip to content

How to proxy large file downloads #138

@Kumhy

Description

@Kumhy

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)
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions