Converted to using Data instead of [UInt8]
This commit is contained in:
parent
5f4cec1c6b
commit
dbf5ad750a
|
@ -43,7 +43,7 @@ public final class ClientConnection {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func write(_ response: Response) -> Source<[UInt8], SystemError> {
|
public func write(_ response: Response) -> Source<Data, SystemError> {
|
||||||
return socket.write(buffer: response.serialized)
|
return socket.write(buffer: response.serialized)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ public protocol HTTPMessage {
|
||||||
var rawHeaders: [String] { get set }
|
var rawHeaders: [String] { get set }
|
||||||
var headers: [String:String] { get }
|
var headers: [String:String] { get }
|
||||||
var cookies: [String] { get }
|
var cookies: [String] { get }
|
||||||
var body: [UInt8] { get set }
|
var body: Data { get set }
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension HTTPMessage {
|
public extension HTTPMessage {
|
||||||
|
|
|
@ -63,7 +63,7 @@ public class RequestParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func parse(_ data: [UInt8]) throws {
|
public func parse(_ data: Data) throws {
|
||||||
try parser.parse(data)
|
try parser.parse(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ public class ResponseParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func parse(_ data: [UInt8]) throws {
|
public func parse(_ data: Data) throws {
|
||||||
try parser.parse(data)
|
try parser.parse(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ private final class FullMessageParser {
|
||||||
|
|
||||||
var version: (major: Int, minor: Int) = (0, 0)
|
var version: (major: Int, minor: Int) = (0, 0)
|
||||||
var rawHeaders: [String] = []
|
var rawHeaders: [String] = []
|
||||||
var body: [UInt8] = []
|
var body: Data = Data()
|
||||||
|
|
||||||
// Response
|
// Response
|
||||||
var statusCode: Int! = nil
|
var statusCode: Int! = nil
|
||||||
|
@ -121,7 +121,7 @@ private final class FullMessageParser {
|
||||||
self.rawParser.delegate = self
|
self.rawParser.delegate = self
|
||||||
}
|
}
|
||||||
|
|
||||||
func parse(_ data: [UInt8]) throws {
|
func parse(_ data: Data) throws {
|
||||||
try rawParser.parse(data)
|
try rawParser.parse(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,9 +254,8 @@ public final class RawParser {
|
||||||
parserPointer.pointee.data = bridge(self)
|
parserPointer.pointee.data = bridge(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func parse(_ data: [UInt8]) throws {
|
public func parse(_ data: Data) throws {
|
||||||
try UnsafePointer(data).withMemoryRebound(to: Int8.self,
|
try data.withUnsafeBytes { (convertedPointer: UnsafePointer<Int8>) in
|
||||||
capacity: data.count) { convertedPointer in
|
|
||||||
let bytesParsed = http_parser_execute(
|
let bytesParsed = http_parser_execute(
|
||||||
parserPointer,
|
parserPointer,
|
||||||
&requestSettings,
|
&requestSettings,
|
||||||
|
|
|
@ -13,10 +13,10 @@ public struct Request: Serializable, HTTPMessage {
|
||||||
public var uri: URL
|
public var uri: URL
|
||||||
public var version: Version
|
public var version: Version
|
||||||
public var rawHeaders: [String]
|
public var rawHeaders: [String]
|
||||||
public var body: [UInt8]
|
public var body: Data
|
||||||
public var storage: [String: Any]
|
public var storage: [String: Any]
|
||||||
|
|
||||||
public var serialized: [UInt8] {
|
public var serialized: Data {
|
||||||
var headerString = ""
|
var headerString = ""
|
||||||
headerString += "\(method) \(uri.absoluteString) HTTP/\(version.major).\(version.minor)"
|
headerString += "\(method) \(uri.absoluteString) HTTP/\(version.major).\(version.minor)"
|
||||||
headerString += "\r\n"
|
headerString += "\r\n"
|
||||||
|
@ -41,7 +41,7 @@ public struct Request: Serializable, HTTPMessage {
|
||||||
uri: URL,
|
uri: URL,
|
||||||
version: Version = Version(major: 1, minor: 1),
|
version: Version = Version(major: 1, minor: 1),
|
||||||
rawHeaders: [String] = [],
|
rawHeaders: [String] = [],
|
||||||
body: [UInt8] = []
|
body: Data = Data()
|
||||||
) {
|
) {
|
||||||
self.method = method
|
self.method = method
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
|
|
|
@ -13,10 +13,10 @@ public struct Response: Serializable, HTTPMessage {
|
||||||
public var version: Version
|
public var version: Version
|
||||||
public var status: Status
|
public var status: Status
|
||||||
public var rawHeaders: [String]
|
public var rawHeaders: [String]
|
||||||
public var body: [UInt8]
|
public var body: Data
|
||||||
public var storage: [String: Any] = [:]
|
public var storage: [String: Any] = [:]
|
||||||
|
|
||||||
public var serialized: [UInt8] {
|
public var serialized: Data {
|
||||||
var headerString = ""
|
var headerString = ""
|
||||||
headerString += "HTTP/\(version.major).\(version.minor)"
|
headerString += "HTTP/\(version.major).\(version.minor)"
|
||||||
headerString += " \(status.code) \(status.reasonPhrase)"
|
headerString += " \(status.code) \(status.reasonPhrase)"
|
||||||
|
@ -41,7 +41,7 @@ public struct Response: Serializable, HTTPMessage {
|
||||||
version: Version = Version(major: 1, minor: 1),
|
version: Version = Version(major: 1, minor: 1),
|
||||||
status: Status,
|
status: Status,
|
||||||
rawHeaders: [String],
|
rawHeaders: [String],
|
||||||
body: [UInt8] = []
|
body: Data = Data()
|
||||||
) {
|
) {
|
||||||
self.version = version
|
self.version = version
|
||||||
self.status = status
|
self.status = status
|
||||||
|
@ -65,7 +65,7 @@ public struct Response: Serializable, HTTPMessage {
|
||||||
rawHeaders: [String] = [],
|
rawHeaders: [String] = [],
|
||||||
json: Any
|
json: Any
|
||||||
) throws {
|
) throws {
|
||||||
let body = Array(try JSONSerialization.data(withJSONObject: json))
|
let body = try JSONSerialization.data(withJSONObject: json)
|
||||||
let rawHeaders = Array([
|
let rawHeaders = Array([
|
||||||
rawHeaders,
|
rawHeaders,
|
||||||
[
|
[
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
// Created by Tyler Fleming Cloutier on 7/1/16.
|
// Created by Tyler Fleming Cloutier on 7/1/16.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
import Foundation
|
||||||
|
|
||||||
public protocol Serializable {
|
public protocol Serializable {
|
||||||
var serialized: [UInt8] { get }
|
var serialized: Data { get }
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
// Created by Tyler Fleming Cloutier on 5/1/16.
|
// Created by Tyler Fleming Cloutier on 5/1/16.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
import Foundation
|
||||||
import Dispatch
|
import Dispatch
|
||||||
import StreamKit
|
import StreamKit
|
||||||
import POSIX
|
import POSIX
|
||||||
|
@ -27,13 +27,13 @@ public protocol WritableIOStream: class {
|
||||||
|
|
||||||
var channel: DispatchIO { get }
|
var channel: DispatchIO { get }
|
||||||
|
|
||||||
func write(buffer: [UInt8]) -> Source<[UInt8], SystemError>
|
func write(buffer: Data) -> Source<Data, SystemError>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension WritableIOStream {
|
public extension WritableIOStream {
|
||||||
|
|
||||||
func write(buffer: [UInt8]) -> Source<[UInt8], SystemError> {
|
func write(buffer: Data) -> Source<Data, SystemError> {
|
||||||
return Source { observer in
|
return Source { observer in
|
||||||
let writeChannel = DispatchIO(
|
let writeChannel = DispatchIO(
|
||||||
type: .stream,
|
type: .stream,
|
||||||
|
@ -45,50 +45,50 @@ public extension WritableIOStream {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer.withUnsafeBufferPointer { buffer in
|
// Allocate dispatch data
|
||||||
|
// TODO: This does not seem right.
|
||||||
// Allocate dispatch data
|
// Work around crash for now.
|
||||||
// TODO: This does not seem right.
|
let dispatchData = buffer.withUnsafeBytes {
|
||||||
// Work around crash for now.
|
return DispatchData(
|
||||||
let dispatchData = DispatchData(
|
bytesNoCopy: UnsafeRawBufferPointer(start: $0, count: buffer.count),
|
||||||
bytesNoCopy: UnsafeRawBufferPointer(buffer),
|
|
||||||
deallocator: .custom(nil, { })
|
deallocator: .custom(nil, { })
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// Schedule write operation
|
// Schedule write operation
|
||||||
writeChannel.write(
|
writeChannel.write(
|
||||||
offset: empty_off_t,
|
offset: empty_off_t,
|
||||||
data: dispatchData,
|
data: dispatchData,
|
||||||
queue: .main
|
queue: .main
|
||||||
) { done, data, error in
|
) { done, data, error in
|
||||||
|
|
||||||
if let systemError = SystemError(errorNumber: error) {
|
if let systemError = SystemError(errorNumber: error) {
|
||||||
// If there was an error emit the error.
|
// If there was an error emit the error.
|
||||||
observer.sendFailed(systemError)
|
observer.sendFailed(systemError)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let data = data, !data.isEmpty {
|
||||||
|
// Get unwritten data
|
||||||
|
data.enumerateBytes { (buffer, byteIndex, stop) in
|
||||||
|
observer.sendNext(Data(buffer))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let data = data, !data.isEmpty {
|
if done {
|
||||||
// Get unwritten data
|
if error == 0 {
|
||||||
data.enumerateBytes { (buffer, byteIndex, stop) in
|
// If the done param is set and there is no error,
|
||||||
observer.sendNext(Array(buffer))
|
// all data has been written, emit writing end.
|
||||||
}
|
// DO NOT emit end otherwise!
|
||||||
}
|
observer.sendCompleted()
|
||||||
|
} else {
|
||||||
if done {
|
// Must be an unrecoverable error, close the channel.
|
||||||
if error == 0 {
|
// TODO: Maybe don't close if you want half-open channel
|
||||||
// If the done param is set and there is no error,
|
// NOTE: This will be done by onCompleted or onError
|
||||||
// all data has been written, emit writing end.
|
// dispatch_io_close(self.channel, 0)
|
||||||
// DO NOT emit end otherwise!
|
|
||||||
observer.sendCompleted()
|
|
||||||
} else {
|
|
||||||
// Must be an unrecoverable error, close the channel.
|
|
||||||
// TODO: Maybe don't close if you want half-open channel
|
|
||||||
// NOTE: This will be done by onCompleted or onError
|
|
||||||
// dispatch_io_close(self.channel, 0)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ActionDisposable {
|
return ActionDisposable {
|
||||||
writeChannel.close()
|
writeChannel.close()
|
||||||
}
|
}
|
||||||
|
@ -102,13 +102,13 @@ public protocol ReadableIOStream: class {
|
||||||
|
|
||||||
var channel: DispatchIO { get }
|
var channel: DispatchIO { get }
|
||||||
|
|
||||||
func read(minBytes: Int) -> Source<[UInt8], SystemError>
|
func read(minBytes: Int) -> Source<Data, SystemError>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension ReadableIOStream {
|
public extension ReadableIOStream {
|
||||||
|
|
||||||
func read(minBytes: Int = 1) -> Source<[UInt8], SystemError> {
|
func read(minBytes: Int = 1) -> Source<Data, SystemError> {
|
||||||
|
|
||||||
return Source { observer in
|
return Source { observer in
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ public extension ReadableIOStream {
|
||||||
// Deliver data if it is non-empty
|
// Deliver data if it is non-empty
|
||||||
if let data = data, !data.isEmpty {
|
if let data = data, !data.isEmpty {
|
||||||
data.enumerateBytes { (buffer, byteIndex, stop) in
|
data.enumerateBytes { (buffer, byteIndex, stop) in
|
||||||
observer.sendNext(Array(buffer))
|
observer.sendNext(Data(buffer))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ class HTTPMessageTests: XCTestCase {
|
||||||
key == "set-cookie"
|
key == "set-cookie"
|
||||||
}.map { $0.1 }
|
}.map { $0.1 }
|
||||||
}
|
}
|
||||||
var body: [UInt8] = []
|
var body: Data = Data()
|
||||||
}
|
}
|
||||||
|
|
||||||
func testHeaders() {
|
func testHeaders() {
|
||||||
|
|
|
@ -8,7 +8,7 @@ class RequestParserTests: XCTestCase {
|
||||||
let parser = RequestParser()
|
let parser = RequestParser()
|
||||||
let data = ("INVALID / HTTP/1.1\r\n" + "\r\n")
|
let data = ("INVALID / HTTP/1.1\r\n" + "\r\n")
|
||||||
do {
|
do {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
} catch {
|
} catch {
|
||||||
expectParseError.fulfill()
|
expectParseError.fulfill()
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ class RequestParserTests: XCTestCase {
|
||||||
XCTAssert(request.rawHeaders.count == 0)
|
XCTAssert(request.rawHeaders.count == 0)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error) for method \(method)")
|
XCTFail("Parsing error \(error) for method \(method)")
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ class RequestParserTests: XCTestCase {
|
||||||
]
|
]
|
||||||
do {
|
do {
|
||||||
for data in dataArray {
|
for data in dataArray {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error).")
|
XCTFail("Parsing error \(error).")
|
||||||
|
@ -115,7 +115,7 @@ class RequestParserTests: XCTestCase {
|
||||||
XCTAssert(request.rawHeaders[1] == "swift.org")
|
XCTAssert(request.rawHeaders[1] == "swift.org")
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error).")
|
XCTFail("Parsing error \(error).")
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ class RequestParserTests: XCTestCase {
|
||||||
]
|
]
|
||||||
do {
|
do {
|
||||||
for data in dataArray {
|
for data in dataArray {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error).")
|
XCTFail("Parsing error \(error).")
|
||||||
|
@ -187,7 +187,7 @@ class RequestParserTests: XCTestCase {
|
||||||
]
|
]
|
||||||
do {
|
do {
|
||||||
for data in dataArray {
|
for data in dataArray {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error).")
|
XCTFail("Parsing error \(error).")
|
||||||
|
@ -211,7 +211,7 @@ class RequestParserTests: XCTestCase {
|
||||||
"\r\n" +
|
"\r\n" +
|
||||||
"Swift")
|
"Swift")
|
||||||
do {
|
do {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error).")
|
XCTFail("Parsing error \(error).")
|
||||||
}
|
}
|
||||||
|
@ -244,7 +244,7 @@ class RequestParserTests: XCTestCase {
|
||||||
]
|
]
|
||||||
do {
|
do {
|
||||||
for data in dataArray {
|
for data in dataArray {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error).")
|
XCTFail("Parsing error \(error).")
|
||||||
|
@ -282,7 +282,7 @@ class RequestParserTests: XCTestCase {
|
||||||
]
|
]
|
||||||
do {
|
do {
|
||||||
for data in dataArray {
|
for data in dataArray {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error).")
|
XCTFail("Parsing error \(error).")
|
||||||
|
@ -310,7 +310,7 @@ class RequestParserTests: XCTestCase {
|
||||||
}
|
}
|
||||||
let data = "GET / HTTP/1.1\r\n\r\nHEAD /profile HTTP/1.1\r\n\r\n"
|
let data = "GET / HTTP/1.1\r\n\r\nHEAD /profile HTTP/1.1\r\n\r\n"
|
||||||
do {
|
do {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error).")
|
XCTFail("Parsing error \(error).")
|
||||||
}
|
}
|
||||||
|
@ -336,7 +336,7 @@ class RequestParserTests: XCTestCase {
|
||||||
}
|
}
|
||||||
for _ in 0 ..< messageNumber {
|
for _ in 0 ..< messageNumber {
|
||||||
do {
|
do {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error).")
|
XCTFail("Parsing error \(error).")
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ class RequestSerializationTests: XCTestCase {
|
||||||
uri: URL(string: "/")!,
|
uri: URL(string: "/")!,
|
||||||
version: Version(major: 1, minor: 1),
|
version: Version(major: 1, minor: 1),
|
||||||
rawHeaders: [],
|
rawHeaders: [],
|
||||||
body: []
|
body: Data()
|
||||||
)
|
)
|
||||||
let actual = String(bytes: request.serialized, encoding: .utf8)!
|
let actual = String(bytes: request.serialized, encoding: .utf8)!
|
||||||
XCTAssert(expected == actual, "Actual request, \(actual), did not match expected.")
|
XCTAssert(expected == actual, "Actual request, \(actual), did not match expected.")
|
||||||
|
@ -33,7 +33,7 @@ class RequestSerializationTests: XCTestCase {
|
||||||
uri: URL(string: "/")!,
|
uri: URL(string: "/")!,
|
||||||
version: Version(major: 1, minor: 1),
|
version: Version(major: 1, minor: 1),
|
||||||
rawHeaders: ["Accept", "*/*", "Host", "www.google.com", "Connection", "Keep-Alive"],
|
rawHeaders: ["Accept", "*/*", "Host", "www.google.com", "Connection", "Keep-Alive"],
|
||||||
body: []
|
body: Data()
|
||||||
)
|
)
|
||||||
let actual = String(bytes: request.serialized, encoding: .utf8)!
|
let actual = String(bytes: request.serialized, encoding: .utf8)!
|
||||||
XCTAssert(expected == actual, "Actual request, \(actual), did not match expected.")
|
XCTAssert(expected == actual, "Actual request, \(actual), did not match expected.")
|
||||||
|
|
|
@ -79,7 +79,7 @@ class ResponseParserTests: XCTestCase {
|
||||||
let parser = ResponseParser()
|
let parser = ResponseParser()
|
||||||
let data = ("FTP/1.1 200 OK\r\n\r\n")
|
let data = ("FTP/1.1 200 OK\r\n\r\n")
|
||||||
XCTAssertThrowsError(
|
XCTAssertThrowsError(
|
||||||
try parser.parse(Array(data.utf8)),
|
try parser.parse(Data(data.utf8)),
|
||||||
"Invalid request did not throw an error."
|
"Invalid request did not throw an error."
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,7 @@ class ResponseParserTests: XCTestCase {
|
||||||
XCTAssert(response.headers.count == (contentLength == "" ? 0 : 1))
|
XCTAssert(response.headers.count == (contentLength == "" ? 0 : 1))
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
try parser.parse(Array(data.utf8))
|
try parser.parse(Data(data.utf8))
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Parsing error \(error) for \(data)")
|
XCTFail("Parsing error \(error) for \(data)")
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ class ResponseSerializationTests: XCTestCase {
|
||||||
version: Version(major: 1, minor: 1),
|
version: Version(major: 1, minor: 1),
|
||||||
status: .ok,
|
status: .ok,
|
||||||
rawHeaders: [],
|
rawHeaders: [],
|
||||||
body: []
|
body: Data()
|
||||||
)
|
)
|
||||||
let actual = String(bytes: response.serialized, encoding: .utf8)!
|
let actual = String(bytes: response.serialized, encoding: .utf8)!
|
||||||
XCTAssert(expected == actual, "Actual response, \(actual), did not match expected.")
|
XCTAssert(expected == actual, "Actual response, \(actual), did not match expected.")
|
||||||
|
@ -37,7 +37,7 @@ class ResponseSerializationTests: XCTestCase {
|
||||||
"Date", "Sun, 30 Oct 2016 09:06:40 GMT",
|
"Date", "Sun, 30 Oct 2016 09:06:40 GMT",
|
||||||
"Content-Type", "text/html; charset=ISO-8859-1"
|
"Content-Type", "text/html; charset=ISO-8859-1"
|
||||||
],
|
],
|
||||||
body: []
|
body: Data()
|
||||||
)
|
)
|
||||||
let actual = String(bytes: response.serialized, encoding: .utf8)!
|
let actual = String(bytes: response.serialized, encoding: .utf8)!
|
||||||
XCTAssert(expected == actual, "Actual request, \(actual), did not match expected.")
|
XCTAssert(expected == actual, "Actual request, \(actual), did not match expected.")
|
||||||
|
|
|
@ -10,7 +10,7 @@ class PipeTests: XCTestCase {
|
||||||
let stdout = Pipe(fd: .stdout)
|
let stdout = Pipe(fd: .stdout)
|
||||||
|
|
||||||
// Write to stdout
|
// Write to stdout
|
||||||
let outStream = stdout.write(buffer: Array("Send it in!\n".utf8))
|
let outStream = stdout.write(buffer: Data("Send it in!\n".utf8))
|
||||||
outStream.onFailed { err in
|
outStream.onFailed { err in
|
||||||
XCTFail(String(describing: err))
|
XCTFail(String(describing: err))
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,7 +141,7 @@ class RouterTests: XCTestCase {
|
||||||
uri: request.uri,
|
uri: request.uri,
|
||||||
version: request.version,
|
version: request.version,
|
||||||
rawHeaders: request.rawHeaders,
|
rawHeaders: request.rawHeaders,
|
||||||
body: Array("Hehe, changin' the body.".utf8)
|
body: Data("Hehe, changin' the body.".utf8)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ class ConnectionTests: XCTestCase {
|
||||||
let socket = try Socket()
|
let socket = try Socket()
|
||||||
let connect = socket.connect(host: "localhost", port: 50000)
|
let connect = socket.connect(host: "localhost", port: 50000)
|
||||||
connect.onCompleted {
|
connect.onCompleted {
|
||||||
let buffer = Array("This is a test".utf8)
|
let buffer = Data("This is a test".utf8)
|
||||||
let write = socket.write(buffer: buffer)
|
let write = socket.write(buffer: buffer)
|
||||||
write.onCompleted {
|
write.onCompleted {
|
||||||
completeWriteExpectation.fulfill()
|
completeWriteExpectation.fulfill()
|
||||||
|
|
Loading…
Reference in New Issue