mirror of
https://github.com/swift-server/async-http-client.git
synced 2026-05-03 07:32:29 +00:00
99 lines
3.0 KiB
Swift
99 lines
3.0 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the AsyncHTTPClient open source project
|
|
//
|
|
// Copyright (c) 2021 Apple Inc. and the AsyncHTTPClient project authors
|
|
// Licensed under Apache License v2.0
|
|
//
|
|
// See LICENSE.txt for license information
|
|
// See CONTRIBUTORS.txt for the list of AsyncHTTPClient project authors
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#if compiler(>=5.5.2) && canImport(_Concurrency)
|
|
import struct Foundation.URL
|
|
import NIOHTTP1
|
|
|
|
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
extension HTTPClientRequest {
|
|
struct Prepared {
|
|
var url: URL
|
|
var poolKey: ConnectionPool.Key
|
|
var requestFramingMetadata: RequestFramingMetadata
|
|
var head: HTTPRequestHead
|
|
var body: Body?
|
|
}
|
|
}
|
|
|
|
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
extension HTTPClientRequest.Prepared {
|
|
init(_ request: HTTPClientRequest) throws {
|
|
guard let url = URL(string: request.url) else {
|
|
throw HTTPClientError.invalidURL
|
|
}
|
|
|
|
let deconstructedURL = try DeconstructedURL(url: url)
|
|
|
|
var headers = request.headers
|
|
headers.addHostIfNeeded(for: deconstructedURL)
|
|
let metadata = try headers.validateAndSetTransportFraming(
|
|
method: request.method,
|
|
bodyLength: .init(request.body)
|
|
)
|
|
|
|
self.init(
|
|
url: url,
|
|
poolKey: .init(url: deconstructedURL, tlsConfiguration: nil),
|
|
requestFramingMetadata: metadata,
|
|
head: .init(
|
|
version: .http1_1,
|
|
method: request.method,
|
|
uri: deconstructedURL.uri,
|
|
headers: headers
|
|
),
|
|
body: request.body
|
|
)
|
|
}
|
|
}
|
|
|
|
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
extension RequestBodyLength {
|
|
init(_ body: HTTPClientRequest.Body?) {
|
|
switch body?.mode {
|
|
case .none:
|
|
self = .known(0)
|
|
case .byteBuffer(let buffer):
|
|
self = .known(buffer.readableBytes)
|
|
case .sequence(let length, _, _), .asyncSequence(let length, _):
|
|
self = length
|
|
}
|
|
}
|
|
}
|
|
|
|
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
extension HTTPClientRequest {
|
|
func followingRedirect(
|
|
from originalURL: URL,
|
|
to redirectURL: URL,
|
|
status: HTTPResponseStatus
|
|
) -> HTTPClientRequest {
|
|
let (method, headers, body) = transformRequestForRedirect(
|
|
from: originalURL,
|
|
method: self.method,
|
|
headers: self.headers,
|
|
body: self.body,
|
|
to: redirectURL,
|
|
status: status
|
|
)
|
|
var newRequest = HTTPClientRequest(url: redirectURL.absoluteString)
|
|
newRequest.method = method
|
|
newRequest.headers = headers
|
|
newRequest.body = body
|
|
return newRequest
|
|
}
|
|
}
|
|
|
|
#endif
|