import Foundation protocol HTTPRequestCompatible: CustomStringConvertible { var uri: String { get set } var method: String { get set } var version: String { get set } var headerFields: [String: String] { get set } var body: Data? { get set } } extension HTTPRequestCompatible { // MARK: CustomStringConvertible public var description: String { Mirror(reflecting: self).debugDescription } } extension HTTPRequestCompatible { var data: Data { get { var data = Data() var lines: [String] = ["\(method) \(uri) \(version)"] for (field, value) in headerFields { lines.append("\(field): \(value)") } data.append(contentsOf: lines.joined(separator: "\r\n").utf8) return data } set { var lines: [String] = [] let bytes: [Data.SubSequence] = newValue.split(separator: HTTPRequest.separator) for i in 0..= 3 else { return } method = first[0] uri = first[1] version = first[2] for i in 1..