Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions Sources/LaserDisc/ReplayingRequestHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ import Foundation
import Embassy

public typealias RequestMatcher = (_ entry: Entry, _ incomingRequest: URLRequest) -> Bool
public typealias ResponseTransformer = (_ incomingRequest: URLRequest, _ data: Data?) -> Data?

final class ReplayingRequestHandler: RequestHandler {
private let eventLoop: EventLoop
private let baseURL: URL
private let recordingPath: String
private let unrecordedRequestHandler: ((URLRequest) -> Void)?
private let matcher: RequestMatcher
private let transformer: ResponseTransformer?
private let fileManager = FileManager()

private lazy var recording: Recording = {
Expand All @@ -19,12 +21,14 @@ final class ReplayingRequestHandler: RequestHandler {
baseURL: URL,
recordingPath: String,
unrecordedRequestHandler: ((URLRequest) -> Void)? = nil,
matcher: RequestMatcher?) {
matcher: RequestMatcher?,
transformer: ResponseTransformer?) {
self.eventLoop = eventLoop
self.baseURL = baseURL
self.recordingPath = recordingPath
self.unrecordedRequestHandler = unrecordedRequestHandler
self.matcher = matcher ?? Self.approximateMatcher
self.transformer = transformer
}

func handle(request: URLRequest, sendStatus: @escaping StatusHandler, sendBody: @escaping BodyHandler) {
Expand All @@ -38,12 +42,15 @@ final class ReplayingRequestHandler: RequestHandler {
}

let textEncoding = String.Encoding(rawValue: response.bodyEncodingRaw)
let data = response.body.data(using: textEncoding)
var data = response.body.data(using: textEncoding)
if let transformer {
data = transformer(request, data)
}
response.headers["Content-Length"] = "\(data?.count ?? 0)"

eventLoop.call(withDelay: response.elapsedTime) {
sendStatus(response.status, response.headers)
if let data = response.body.data(using: .utf8) {
if let data {
sendBody(data)
sendBody(Data())
} else {
Expand Down
6 changes: 4 additions & 2 deletions Sources/LaserDisc/Server.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ public final class Server {
public init(baseURL: URL,
recordingPath: String,
unrecordedRequestHandler: ((URLRequest) -> Void)? = nil,
requestMatcher: RequestMatcher? = nil) {
requestMatcher: RequestMatcher? = nil,
contentTransformer: ResponseTransformer? = nil) {
replayingRequestHandler = ReplayingRequestHandler(eventLoop: loop,
baseURL: baseURL,
recordingPath: recordingPath,
unrecordedRequestHandler: unrecordedRequestHandler,
matcher: requestMatcher)
matcher: requestMatcher,
transformer: contentTransformer)
recordingRequestHandler = RecordingRequestHandler(eventLoop: loop, baseURL: baseURL, recordingPath: recordingPath)
}

Expand Down